Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
2da3ddf9
Commit
2da3ddf9
authored
Aug 29, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://cifs.bkbits.net/linux-2.5cifs
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
b0164c3a
2125f957
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
404 additions
and
236 deletions
+404
-236
fs/xfs/linux-2.6/xfs_file.c
fs/xfs/linux-2.6/xfs_file.c
+4
-18
fs/xfs/linux-2.6/xfs_ioctl32.c
fs/xfs/linux-2.6/xfs_ioctl32.c
+2
-2
fs/xfs/linux-2.6/xfs_lrw.c
fs/xfs/linux-2.6/xfs_lrw.c
+142
-104
fs/xfs/quota/xfs_dquot.c
fs/xfs/quota/xfs_dquot.c
+82
-24
fs/xfs/quota/xfs_dquot.h
fs/xfs/quota/xfs_dquot.h
+2
-0
fs/xfs/quota/xfs_qm.c
fs/xfs/quota/xfs_qm.c
+39
-13
fs/xfs/quota/xfs_qm.h
fs/xfs/quota/xfs_qm.h
+6
-1
fs/xfs/quota/xfs_qm_syscalls.c
fs/xfs/quota/xfs_qm_syscalls.c
+24
-12
fs/xfs/quota/xfs_trans_dquot.c
fs/xfs/quota/xfs_trans_dquot.c
+30
-11
fs/xfs/xfs_bmap.c
fs/xfs/xfs_bmap.c
+14
-13
fs/xfs/xfs_fsops.c
fs/xfs/xfs_fsops.c
+5
-1
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_log_recover.c
+16
-5
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.c
+5
-5
fs/xfs/xfs_mount.h
fs/xfs/xfs_mount.h
+1
-1
fs/xfs/xfs_vnodeops.c
fs/xfs/xfs_vnodeops.c
+31
-26
mm/filemap.c
mm/filemap.c
+1
-0
No files found.
fs/xfs/linux-2.6/xfs_file.c
View file @
2da3ddf9
...
...
@@ -116,17 +116,10 @@ __linvfs_write(
ssize_t
rval
;
BUG_ON
(
iocb
->
ki_pos
!=
pos
);
if
(
unlikely
(
file
->
f_flags
&
O_DIRECT
))
{
if
(
unlikely
(
file
->
f_flags
&
O_DIRECT
))
ioflags
|=
IO_ISDIRECT
;
VOP_WRITE
(
vp
,
iocb
,
&
iov
,
1
,
&
iocb
->
ki_pos
,
ioflags
,
NULL
,
rval
);
}
else
{
down
(
&
inode
->
i_sem
);
VOP_WRITE
(
vp
,
iocb
,
&
iov
,
1
,
&
iocb
->
ki_pos
,
ioflags
,
NULL
,
rval
);
up
(
&
inode
->
i_sem
);
}
VOP_WRITE
(
vp
,
iocb
,
&
iov
,
1
,
&
iocb
->
ki_pos
,
ioflags
,
NULL
,
rval
);
return
rval
;
}
...
...
@@ -214,17 +207,10 @@ __linvfs_writev(
init_sync_kiocb
(
&
kiocb
,
file
);
kiocb
.
ki_pos
=
*
ppos
;
if
(
unlikely
(
file
->
f_flags
&
O_DIRECT
))
{
if
(
unlikely
(
file
->
f_flags
&
O_DIRECT
))
ioflags
|=
IO_ISDIRECT
;
VOP_WRITE
(
vp
,
&
kiocb
,
iov
,
nr_segs
,
&
kiocb
.
ki_pos
,
ioflags
,
NULL
,
rval
);
}
else
{
down
(
&
inode
->
i_sem
);
VOP_WRITE
(
vp
,
&
kiocb
,
iov
,
nr_segs
,
&
kiocb
.
ki_pos
,
ioflags
,
NULL
,
rval
);
up
(
&
inode
->
i_sem
);
}
VOP_WRITE
(
vp
,
&
kiocb
,
iov
,
nr_segs
,
&
kiocb
.
ki_pos
,
ioflags
,
NULL
,
rval
);
if
(
rval
==
-
EIOCBQUEUED
)
rval
=
wait_on_sync_kiocb
(
&
kiocb
);
...
...
fs/xfs/linux-2.6/xfs_ioctl32.c
View file @
2da3ddf9
...
...
@@ -45,8 +45,7 @@
#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
#define BROKEN_X86_ALIGNMENT
#endif
#else
typedef
struct
xfs_fsop_bulkreq32
{
compat_uptr_t
lastip
;
/* last inode # pointer */
...
...
@@ -77,6 +76,7 @@ xfs_ioctl32_bulkstat(
return
sys_ioctl
(
fd
,
cmd
,
(
unsigned
long
)
p
);
}
#endif
struct
ioctl_trans
xfs_ioctl32_trans
[]
=
{
{
XFS_IOC_DIOINFO
,
},
...
...
fs/xfs/linux-2.6/xfs_lrw.c
View file @
2da3ddf9
...
...
@@ -74,6 +74,7 @@
#include "xfs_iomap.h"
#include <linux/capability.h>
#include <linux/writeback.h>
#if defined(XFS_RW_TRACE)
...
...
@@ -225,40 +226,11 @@ xfs_inval_cached_pages(
int
write
,
int
relock
)
{
xfs_mount_t
*
mp
;
if
(
!
VN_CACHED
(
vp
))
{
return
;
}
mp
=
io
->
io_mount
;
/*
* We need to get the I/O lock exclusively in order
* to safely invalidate pages and mappings.
*/
if
(
relock
)
{
XFS_IUNLOCK
(
mp
,
io
,
XFS_IOLOCK_SHARED
);
XFS_ILOCK
(
mp
,
io
,
XFS_IOLOCK_EXCL
);
}
/* Writing beyond EOF creates a hole that must be zeroed */
if
(
write
&&
(
offset
>
XFS_SIZE
(
mp
,
io
)))
{
xfs_fsize_t
isize
;
XFS_ILOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
isize
=
XFS_SIZE
(
mp
,
io
);
if
(
offset
>
isize
)
{
xfs_zero_eof
(
vp
,
io
,
offset
,
isize
,
offset
);
}
XFS_IUNLOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
if
(
VN_CACHED
(
vp
))
{
xfs_inval_cached_trace
(
io
,
offset
,
-
1
,
ctooff
(
offtoct
(
offset
)),
-
1
);
VOP_FLUSHINVAL_PAGES
(
vp
,
ctooff
(
offtoct
(
offset
)),
-
1
,
FI_REMAPF_LOCKED
);
}
xfs_inval_cached_trace
(
io
,
offset
,
-
1
,
ctooff
(
offtoct
(
offset
)),
-
1
);
VOP_FLUSHINVAL_PAGES
(
vp
,
ctooff
(
offtoct
(
offset
)),
-
1
,
FI_REMAPF_LOCKED
);
if
(
relock
)
{
XFS_ILOCK_DEMOTE
(
mp
,
io
,
XFS_IOLOCK_EXCL
);
}
}
ssize_t
/* bytes read, or (-) error */
...
...
@@ -637,32 +609,34 @@ xfs_write(
bhv_desc_t
*
bdp
,
struct
kiocb
*
iocb
,
const
struct
iovec
*
iovp
,
unsigned
int
segs
,
unsigned
int
n
segs
,
loff_t
*
offset
,
int
ioflags
,
cred_t
*
credp
)
{
struct
file
*
file
=
iocb
->
ki_filp
;
size_t
size
=
0
;
struct
address_space
*
mapping
=
file
->
f_mapping
;
struct
inode
*
inode
=
mapping
->
host
;
unsigned
long
segs
=
nsegs
;
xfs_inode_t
*
xip
;
xfs_mount_t
*
mp
;
ssize_t
ret
;
int
error
=
0
;
ssize_t
ret
=
0
,
error
=
0
;
xfs_fsize_t
isize
,
new_size
;
xfs_fsize_t
n
,
limit
;
xfs_iocore_t
*
io
;
vnode_t
*
vp
;
unsigned
long
seg
;
int
iolock
;
int
eventsent
=
0
;
vrwlock_t
locktype
;
size_t
ocount
=
0
,
count
;
loff_t
pos
;
int
need_isem
=
1
,
need_flush
=
0
;
XFS_STATS_INC
(
xs_write_calls
);
vp
=
BHV_TO_VNODE
(
bdp
);
xip
=
XFS_BHVTOI
(
bdp
);
/* START copy & waste from filemap.c */
for
(
seg
=
0
;
seg
<
segs
;
seg
++
)
{
const
struct
iovec
*
iv
=
&
iovp
[
seg
];
...
...
@@ -670,73 +644,90 @@ xfs_write(
* If any segment has a negative length, or the cumulative
* length ever wraps negative then return -EINVAL.
*/
size
+=
iv
->
iov_len
;
if
(
unlikely
((
ssize_t
)(
size
|
iv
->
iov_len
)
<
0
))
return
XFS_ERROR
(
-
EINVAL
);
ocount
+=
iv
->
iov_len
;
if
(
unlikely
((
ssize_t
)(
ocount
|
iv
->
iov_len
)
<
0
))
return
-
EINVAL
;
if
(
access_ok
(
VERIFY_READ
,
iv
->
iov_base
,
iv
->
iov_len
))
continue
;
if
(
seg
==
0
)
return
-
EFAULT
;
segs
=
seg
;
ocount
-=
iv
->
iov_len
;
/* This segment is no good */
break
;
}
/* END copy & waste from filemap.c */
if
(
size
==
0
)
count
=
ocount
;
pos
=
*
offset
;
if
(
count
==
0
)
return
0
;
io
=
&
xip
->
i_iocore
;
mp
=
io
->
io_mount
;
if
(
XFS_FORCED_SHUTDOWN
(
mp
))
{
if
(
XFS_FORCED_SHUTDOWN
(
mp
))
return
-
EIO
;
}
if
(
ioflags
&
IO_ISDIRECT
)
{
xfs_buftarg_t
*
target
=
(
xip
->
i_d
.
di_flags
&
XFS_DIFLAG_REALTIME
)
?
mp
->
m_rtdev_targp
:
mp
->
m_ddev_targp
;
if
((
*
offset
&
target
->
pbr_smask
)
||
(
size
&
target
->
pbr_smask
))
{
if
((
pos
&
target
->
pbr_smask
)
||
(
count
&
target
->
pbr_smask
))
return
XFS_ERROR
(
-
EINVAL
);
}
iolock
=
XFS_IOLOCK_SHARED
;
locktype
=
VRWLOCK_WRITE_DIRECT
;
}
else
{
if
(
!
VN_CACHED
(
vp
)
&&
pos
<
i_size_read
(
inode
))
need_isem
=
0
;
if
(
VN_CACHED
(
vp
))
need_flush
=
1
;
}
relock:
if
(
need_isem
)
{
iolock
=
XFS_IOLOCK_EXCL
;
locktype
=
VRWLOCK_WRITE
;
down
(
&
inode
->
i_sem
);
}
else
{
iolock
=
XFS_IOLOCK_SHARED
;
locktype
=
VRWLOCK_WRITE_DIRECT
;
}
xfs_ilock
(
xip
,
XFS_ILOCK_EXCL
|
iolock
);
isize
=
xip
->
i_d
.
di_size
;
limit
=
XFS_MAXIOFFSET
(
mp
);
isize
=
i_size_read
(
inode
);
if
(
file
->
f_flags
&
O_APPEND
)
*
offset
=
isize
;
start:
n
=
limit
-
*
offset
;
if
(
n
<=
0
)
{
error
=
-
generic_write_checks
(
file
,
&
pos
,
&
count
,
S_ISBLK
(
inode
->
i_mode
));
if
(
error
)
{
xfs_iunlock
(
xip
,
XFS_ILOCK_EXCL
|
iolock
);
return
-
EFBIG
;
goto
out_unlock_isem
;
}
if
(
n
<
size
)
size
=
n
;
new_size
=
*
offset
+
size
;
if
(
new_size
>
isize
)
{
new_size
=
pos
+
count
;
if
(
new_size
>
isize
)
io
->
io_new_size
=
new_size
;
}
if
((
DM_EVENT_ENABLED
(
vp
->
v_vfsp
,
xip
,
DM_EVENT_WRITE
)
&&
!
(
ioflags
&
IO_INVIS
)
&&
!
eventsent
))
{
loff_t
savedsize
=
*
offset
;
int
dmflags
=
FILP_DELAY_FLAG
(
file
)
|
DM_SEM_FLAG_RD
(
ioflags
);
loff_t
savedsize
=
pos
;
int
dmflags
=
FILP_DELAY_FLAG
(
file
);
if
(
need_isem
)
dmflags
|=
DM_FLAGS_ISEM
;
xfs_iunlock
(
xip
,
XFS_ILOCK_EXCL
);
error
=
XFS_SEND_DATA
(
xip
->
i_mount
,
DM_EVENT_WRITE
,
vp
,
*
offset
,
size
,
pos
,
count
,
dmflags
,
&
locktype
);
if
(
error
)
{
xfs_iunlock
(
xip
,
iolock
);
return
-
error
;
goto
out_unlock_isem
;
}
xfs_ilock
(
xip
,
XFS_ILOCK_EXCL
);
eventsent
=
1
;
...
...
@@ -748,9 +739,8 @@ xfs_write(
* event prevents another call to XFS_SEND_DATA, which is
* what allows the size to change in the first place.
*/
if
((
file
->
f_flags
&
O_APPEND
)
&&
savedsize
!=
xip
->
i_d
.
di_size
)
{
*
offset
=
isize
=
xip
->
i_d
.
di_size
;
if
((
file
->
f_flags
&
O_APPEND
)
&&
savedsize
!=
isize
)
{
pos
=
isize
=
xip
->
i_d
.
di_size
;
goto
start
;
}
}
...
...
@@ -761,8 +751,10 @@ xfs_write(
*
* We must update xfs' times since revalidate will overcopy xfs.
*/
if
(
size
&&
!
(
ioflags
&
IO_INVIS
))
if
(
!
(
ioflags
&
IO_INVIS
))
{
xfs_ichgtime
(
xip
,
XFS_ICHGTIME_MOD
|
XFS_ICHGTIME_CHG
);
inode_update_time
(
inode
,
1
);
}
/*
* If the offset is beyond the size of the file, we have a couple
...
...
@@ -773,12 +765,12 @@ xfs_write(
* to zero it out up to the new size.
*/
if
(
!
(
ioflags
&
IO_ISDIRECT
)
&&
(
*
offset
>
isize
&&
isize
)
)
{
error
=
xfs_zero_eof
(
BHV_TO_VNODE
(
bdp
),
io
,
*
offset
,
isize
,
*
offset
+
size
);
if
(
pos
>
isize
)
{
error
=
xfs_zero_eof
(
BHV_TO_VNODE
(
bdp
),
io
,
pos
,
isize
,
pos
+
count
);
if
(
error
)
{
xfs_iunlock
(
xip
,
XFS_ILOCK_EXCL
|
iolock
);
return
(
-
error
)
;
goto
out_unlock_isem
;
}
}
xfs_iunlock
(
xip
,
XFS_ILOCK_EXCL
);
...
...
@@ -795,22 +787,64 @@ xfs_write(
(
S_ISGID
|
S_IXGRP
)))
&&
!
capable
(
CAP_FSETID
))
{
error
=
xfs_write_clear_setuid
(
xip
);
if
(
error
)
{
if
(
likely
(
!
error
))
error
=
-
remove_suid
(
file
->
f_dentry
);
if
(
unlikely
(
error
))
{
xfs_iunlock
(
xip
,
iolock
);
return
-
error
;
goto
out_unlock_isem
;
}
}
retry:
if
(
ioflags
&
IO_ISDIRECT
)
{
xfs_inval_cached_pages
(
vp
,
io
,
*
offset
,
1
,
1
);
xfs_rw_enter_trace
(
XFS_DIOWR_ENTER
,
io
,
(
void
*
)
iovp
,
segs
,
*
offset
,
ioflags
);
/* We can write back this queue in page reclaim */
current
->
backing_dev_info
=
mapping
->
backing_dev_info
;
if
((
ioflags
&
IO_ISDIRECT
))
{
if
(
need_flush
)
{
xfs_inval_cached_trace
(
io
,
pos
,
-
1
,
ctooff
(
offtoct
(
pos
)),
-
1
);
VOP_FLUSHINVAL_PAGES
(
vp
,
ctooff
(
offtoct
(
pos
)),
-
1
,
FI_REMAPF_LOCKED
);
}
if
(
need_isem
)
{
/* demote the lock now the cached pages are gone */
XFS_ILOCK_DEMOTE
(
mp
,
io
,
XFS_IOLOCK_EXCL
);
up
(
&
inode
->
i_sem
);
iolock
=
XFS_IOLOCK_SHARED
;
locktype
=
VRWLOCK_WRITE_DIRECT
;
need_isem
=
0
;
}
xfs_rw_enter_trace
(
XFS_DIOWR_ENTER
,
io
,
(
void
*
)
iovp
,
segs
,
*
offset
,
ioflags
);
ret
=
generic_file_direct_write
(
iocb
,
iovp
,
&
segs
,
pos
,
offset
,
count
,
ocount
);
/*
* direct-io write to a hole: fall through to buffered I/O
* for completing the rest of the request.
*/
if
(
ret
>=
0
&&
ret
!=
count
)
{
XFS_STATS_ADD
(
xs_write_bytes
,
ret
);
pos
+=
ret
;
count
-=
ret
;
need_isem
=
1
;
ioflags
&=
~
IO_ISDIRECT
;
xfs_iunlock
(
xip
,
iolock
);
goto
relock
;
}
}
else
{
xfs_rw_enter_trace
(
XFS_WRITE_ENTER
,
io
,
(
void
*
)
iovp
,
segs
,
*
offset
,
ioflags
);
xfs_rw_enter_trace
(
XFS_WRITE_ENTER
,
io
,
(
void
*
)
iovp
,
segs
,
*
offset
,
ioflags
);
ret
=
generic_file_buffered_write
(
iocb
,
iovp
,
segs
,
pos
,
offset
,
count
,
ret
);
}
ret
=
generic_file_aio_write_nolock
(
iocb
,
iovp
,
segs
,
offset
);
current
->
backing_dev_info
=
NULL
;
if
((
ret
==
-
ENOSPC
)
&&
DM_EVENT_ENABLED
(
vp
->
v_vfsp
,
xip
,
DM_EVENT_NOSPACE
)
&&
...
...
@@ -821,17 +855,15 @@ xfs_write(
DM_RIGHT_NULL
,
vp
,
DM_RIGHT_NULL
,
NULL
,
NULL
,
0
,
0
,
0
);
/* Delay flag intentionally unused */
if
(
error
)
return
-
error
;
goto
out_unlock_isem
;
xfs_rwlock
(
bdp
,
locktype
);
*
offset
=
xip
->
i_d
.
di_size
;
pos
=
xip
->
i_d
.
di_size
;
goto
retry
;
}
if
(
*
offset
>
xip
->
i_d
.
di_size
)
{
xfs_ilock
(
xip
,
XFS_ILOCK_EXCL
);
if
(
*
offset
>
xip
->
i_d
.
di_size
)
{
struct
inode
*
inode
=
LINVFS_GET_IP
(
vp
);
xip
->
i_d
.
di_size
=
*
offset
;
i_size_write
(
inode
,
*
offset
);
xip
->
i_update_core
=
1
;
...
...
@@ -840,23 +872,22 @@ xfs_write(
xfs_iunlock
(
xip
,
XFS_ILOCK_EXCL
);
}
if
(
ret
<=
0
)
{
xfs_rwunlock
(
bdp
,
locktype
);
return
ret
;
}
error
=
-
ret
;
if
(
ret
<=
0
)
goto
out_unlock_internal
;
XFS_STATS_ADD
(
xs_write_bytes
,
ret
);
/* Handle various SYNC-type writes */
if
((
file
->
f_flags
&
O_SYNC
)
||
IS_SYNC
(
file
->
f_dentry
->
d_inode
))
{
if
((
file
->
f_flags
&
O_SYNC
)
||
IS_SYNC
(
inode
))
{
/*
* If we're treating this as O_DSYNC and we have not updated the
* size, force the log.
*/
if
(
!
(
mp
->
m_flags
&
XFS_MOUNT_OSYNCISOSYNC
)
&&
!
(
xip
->
i_update_size
))
{
xfs_inode_log_item_t
*
iip
=
xip
->
i_itemp
;
if
(
!
(
mp
->
m_flags
&
XFS_MOUNT_OSYNCISOSYNC
)
&&
!
(
xip
->
i_update_size
))
{
/*
* If an allocation transaction occurred
* without extending the size, then we have to force
...
...
@@ -876,14 +907,8 @@ xfs_write(
* all changes affecting the inode are permanent
* when we return.
*/
xfs_inode_log_item_t
*
iip
;
xfs_lsn_t
lsn
;
iip
=
xip
->
i_itemp
;
if
(
iip
&&
iip
->
ili_last_lsn
)
{
lsn
=
iip
->
ili_last_lsn
;
xfs_log_force
(
mp
,
lsn
,
xfs_log_force
(
mp
,
iip
->
ili_last_lsn
,
XFS_LOG_FORCE
|
XFS_LOG_SYNC
);
}
else
if
(
xfs_ipincount
(
xip
)
>
0
)
{
xfs_log_force
(
mp
,
(
xfs_lsn_t
)
0
,
...
...
@@ -924,12 +949,25 @@ xfs_write(
xfs_trans_set_sync
(
tp
);
error
=
xfs_trans_commit
(
tp
,
0
,
NULL
);
xfs_iunlock
(
xip
,
XFS_ILOCK_EXCL
);
if
(
error
)
goto
out_unlock_internal
;
}
}
}
/* (ioflags & O_SYNC) */
xfs_rwunlock
(
bdp
,
locktype
);
error
=
sync_page_range
(
inode
,
mapping
,
pos
,
ret
);
if
(
!
error
)
error
=
-
ret
;
goto
out_unlock_isem
;
}
out_unlock_internal:
xfs_rwunlock
(
bdp
,
locktype
);
return
(
ret
);
out_unlock_isem:
if
(
need_isem
)
up
(
&
inode
->
i_sem
);
return
-
error
;
}
/*
...
...
fs/xfs/quota/xfs_dquot.c
View file @
2da3ddf9
...
...
@@ -187,9 +187,9 @@ xfs_qm_dqdestroy(
*/
STATIC
void
xfs_qm_dqinit_core
(
xfs_dqid_t
id
,
uint
type
,
xfs_dqblk_t
*
d
)
xfs_dqid_t
id
,
uint
type
,
xfs_dqblk_t
*
d
)
{
/*
* Caller has zero'd the entire dquot 'chunk' already.
...
...
@@ -249,6 +249,36 @@ __xfs_dqtrace_entry(
#endif
/*
* If default limits are in force, push them into the dquot now.
* We overwrite the dquot limits only if they are zero and this
* is not the root dquot.
*/
void
xfs_qm_adjust_dqlimits
(
xfs_mount_t
*
mp
,
xfs_disk_dquot_t
*
d
)
{
xfs_quotainfo_t
*
q
=
mp
->
m_quotainfo
;
ASSERT
(
!
INT_ISZERO
(
d
->
d_id
,
ARCH_CONVERT
));
if
(
q
->
qi_bsoftlimit
&&
INT_ISZERO
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
))
INT_SET
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
,
q
->
qi_bsoftlimit
);
if
(
q
->
qi_bhardlimit
&&
INT_ISZERO
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
))
INT_SET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
,
q
->
qi_bhardlimit
);
if
(
q
->
qi_isoftlimit
&&
INT_ISZERO
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
))
INT_SET
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
,
q
->
qi_isoftlimit
);
if
(
q
->
qi_ihardlimit
&&
INT_ISZERO
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
))
INT_SET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
,
q
->
qi_ihardlimit
);
if
(
q
->
qi_rtbsoftlimit
&&
INT_ISZERO
(
d
->
d_rtb_softlimit
,
ARCH_CONVERT
))
INT_SET
(
d
->
d_rtb_softlimit
,
ARCH_CONVERT
,
q
->
qi_rtbsoftlimit
);
if
(
q
->
qi_rtbhardlimit
&&
INT_ISZERO
(
d
->
d_rtb_hardlimit
,
ARCH_CONVERT
))
INT_SET
(
d
->
d_rtb_hardlimit
,
ARCH_CONVERT
,
q
->
qi_rtbhardlimit
);
}
/*
* Check the limits and timers of a dquot and start or reset timers
* if necessary.
...
...
@@ -265,53 +295,81 @@ xfs_qm_adjust_dqtimers(
xfs_mount_t
*
mp
,
xfs_disk_dquot_t
*
d
)
{
/*
* The dquot had better be locked. We are modifying it here.
*/
/*
* root's limits are not real limits.
*/
if
(
INT_ISZERO
(
d
->
d_id
,
ARCH_CONVERT
))
return
;
ASSERT
(
!
INT_ISZERO
(
d
->
d_id
,
ARCH_CONVERT
));
#ifdef QUOTADEBUG
if
(
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
))
ASSERT
(
INT_GET
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)
<=
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
));
ASSERT
(
INT_GET
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)
<=
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
));
if
(
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
))
ASSERT
(
INT_GET
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)
<=
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
));
ASSERT
(
INT_GET
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)
<=
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
));
if
(
INT_GET
(
d
->
d_rtb_hardlimit
,
ARCH_CONVERT
))
ASSERT
(
INT_GET
(
d
->
d_rtb_softlimit
,
ARCH_CONVERT
)
<=
INT_GET
(
d
->
d_rtb_hardlimit
,
ARCH_CONVERT
));
#endif
if
(
INT_ISZERO
(
d
->
d_btimer
,
ARCH_CONVERT
))
{
if
((
INT_GET
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)
&&
(
INT_GET
(
d
->
d_bcount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)))
||
(
INT_GET
(
d
->
d_bcount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)))
||
(
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
)
&&
(
INT_GET
(
d
->
d_bcount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
))))
{
INT_SET
(
d
->
d_btimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_BTIMELIMIT
(
mp
));
(
INT_GET
(
d
->
d_bcount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
))))
{
INT_SET
(
d
->
d_btimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_BTIMELIMIT
(
mp
));
}
}
else
{
if
((
INT_ISZERO
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)
||
(
INT_GET
(
d
->
d_bcount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)))
&&
(
INT_GET
(
d
->
d_bcount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)))
&&
(
INT_ISZERO
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
)
||
(
INT_GET
(
d
->
d_bcount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
))))
{
(
INT_GET
(
d
->
d_bcount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
))))
{
INT_ZERO
(
d
->
d_btimer
,
ARCH_CONVERT
);
}
}
if
(
INT_ISZERO
(
d
->
d_itimer
,
ARCH_CONVERT
))
{
if
((
INT_GET
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)
&&
(
INT_GET
(
d
->
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)))
||
(
INT_GET
(
d
->
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)))
||
(
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
)
&&
(
INT_GET
(
d
->
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
))))
{
INT_SET
(
d
->
d_itimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_ITIMELIMIT
(
mp
));
(
INT_GET
(
d
->
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
))))
{
INT_SET
(
d
->
d_itimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_ITIMELIMIT
(
mp
));
}
}
else
{
if
((
INT_ISZERO
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)
||
(
INT_GET
(
d
->
d_icount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)))
&&
(
INT_GET
(
d
->
d_icount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)))
&&
(
INT_ISZERO
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
)
||
(
INT_GET
(
d
->
d_icount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
))))
{
(
INT_GET
(
d
->
d_icount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
))))
{
INT_ZERO
(
d
->
d_itimer
,
ARCH_CONVERT
);
}
}
if
(
INT_ISZERO
(
d
->
d_rtbtimer
,
ARCH_CONVERT
))
{
if
((
INT_GET
(
d
->
d_rtb_softlimit
,
ARCH_CONVERT
)
&&
(
INT_GET
(
d
->
d_rtbcount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_rtb_softlimit
,
ARCH_CONVERT
)))
||
(
INT_GET
(
d
->
d_rtb_hardlimit
,
ARCH_CONVERT
)
&&
(
INT_GET
(
d
->
d_rtbcount
,
ARCH_CONVERT
)
>=
INT_GET
(
d
->
d_rtb_hardlimit
,
ARCH_CONVERT
))))
{
INT_SET
(
d
->
d_rtbtimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_RTBTIMELIMIT
(
mp
));
}
}
else
{
if
((
INT_ISZERO
(
d
->
d_rtb_softlimit
,
ARCH_CONVERT
)
||
(
INT_GET
(
d
->
d_rtbcount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_rtb_softlimit
,
ARCH_CONVERT
)))
&&
(
INT_ISZERO
(
d
->
d_rtb_hardlimit
,
ARCH_CONVERT
)
||
(
INT_GET
(
d
->
d_rtbcount
,
ARCH_CONVERT
)
<
INT_GET
(
d
->
d_rtb_hardlimit
,
ARCH_CONVERT
))))
{
INT_ZERO
(
d
->
d_rtbtimer
,
ARCH_CONVERT
);
}
}
}
/*
...
...
fs/xfs/quota/xfs_dquot.h
View file @
2da3ddf9
...
...
@@ -209,6 +209,8 @@ extern int xfs_qm_dqflock_nowait(xfs_dquot_t *);
extern
void
xfs_qm_dqflock_pushbuf_wait
(
xfs_dquot_t
*
dqp
);
extern
void
xfs_qm_adjust_dqtimers
(
xfs_mount_t
*
,
xfs_disk_dquot_t
*
);
extern
void
xfs_qm_adjust_dqlimits
(
xfs_mount_t
*
,
xfs_disk_dquot_t
*
);
extern
int
xfs_qm_dqwarn
(
xfs_disk_dquot_t
*
,
uint
);
extern
int
xfs_qm_dqget
(
xfs_mount_t
*
,
xfs_inode_t
*
,
xfs_dqid_t
,
uint
,
uint
,
xfs_dquot_t
**
);
...
...
fs/xfs/quota/xfs_qm.c
View file @
2da3ddf9
...
...
@@ -1213,22 +1213,46 @@ xfs_qm_init_quotainfo(
XFS_QMOPT_DQSUSER
|
XFS_QMOPT_DOWARN
,
&
dqp
);
if
(
!
error
)
{
xfs_disk_dquot_t
*
ddqp
=
&
dqp
->
q_core
;
/*
* The warnings and timers set the grace period given to
* a user or group before he or she can not perform any
* more writing. If it is zero, a default is used.
*/
qinf
->
qi_btimelimit
=
INT_GET
(
dqp
->
q_core
.
d_btimer
,
ARCH_CONVERT
)
?
INT_GET
(
dqp
->
q_core
.
d_btimer
,
ARCH_CONVERT
)
:
XFS_QM_BTIMELIMIT
;
qinf
->
qi_itimelimit
=
INT_GET
(
dqp
->
q_core
.
d_itimer
,
ARCH_CONVERT
)
?
INT_GET
(
dqp
->
q_core
.
d_itimer
,
ARCH_CONVERT
)
:
XFS_QM_ITIMELIMIT
;
qinf
->
qi_rtbtimelimit
=
INT_GET
(
dqp
->
q_core
.
d_rtbtimer
,
ARCH_CONVERT
)
?
INT_GET
(
dqp
->
q_core
.
d_rtbtimer
,
ARCH_CONVERT
)
:
XFS_QM_RTBTIMELIMIT
;
qinf
->
qi_bwarnlimit
=
INT_GET
(
dqp
->
q_core
.
d_bwarns
,
ARCH_CONVERT
)
?
INT_GET
(
dqp
->
q_core
.
d_bwarns
,
ARCH_CONVERT
)
:
XFS_QM_BWARNLIMIT
;
qinf
->
qi_iwarnlimit
=
INT_GET
(
dqp
->
q_core
.
d_iwarns
,
ARCH_CONVERT
)
?
INT_GET
(
dqp
->
q_core
.
d_iwarns
,
ARCH_CONVERT
)
:
XFS_QM_IWARNLIMIT
;
qinf
->
qi_btimelimit
=
INT_GET
(
ddqp
->
d_btimer
,
ARCH_CONVERT
)
?
INT_GET
(
ddqp
->
d_btimer
,
ARCH_CONVERT
)
:
XFS_QM_BTIMELIMIT
;
qinf
->
qi_itimelimit
=
INT_GET
(
ddqp
->
d_itimer
,
ARCH_CONVERT
)
?
INT_GET
(
ddqp
->
d_itimer
,
ARCH_CONVERT
)
:
XFS_QM_ITIMELIMIT
;
qinf
->
qi_rtbtimelimit
=
INT_GET
(
ddqp
->
d_rtbtimer
,
ARCH_CONVERT
)
?
INT_GET
(
ddqp
->
d_rtbtimer
,
ARCH_CONVERT
)
:
XFS_QM_RTBTIMELIMIT
;
qinf
->
qi_bwarnlimit
=
INT_GET
(
ddqp
->
d_bwarns
,
ARCH_CONVERT
)
?
INT_GET
(
ddqp
->
d_bwarns
,
ARCH_CONVERT
)
:
XFS_QM_BWARNLIMIT
;
qinf
->
qi_iwarnlimit
=
INT_GET
(
ddqp
->
d_iwarns
,
ARCH_CONVERT
)
?
INT_GET
(
ddqp
->
d_iwarns
,
ARCH_CONVERT
)
:
XFS_QM_IWARNLIMIT
;
qinf
->
qi_bhardlimit
=
INT_GET
(
ddqp
->
d_blk_hardlimit
,
ARCH_CONVERT
);
qinf
->
qi_bsoftlimit
=
INT_GET
(
ddqp
->
d_blk_softlimit
,
ARCH_CONVERT
);
qinf
->
qi_ihardlimit
=
INT_GET
(
ddqp
->
d_ino_hardlimit
,
ARCH_CONVERT
);
qinf
->
qi_isoftlimit
=
INT_GET
(
ddqp
->
d_ino_softlimit
,
ARCH_CONVERT
);
qinf
->
qi_rtbhardlimit
=
INT_GET
(
ddqp
->
d_rtb_hardlimit
,
ARCH_CONVERT
);
qinf
->
qi_rtbsoftlimit
=
INT_GET
(
ddqp
->
d_rtb_softlimit
,
ARCH_CONVERT
);
/*
* We sent the XFS_QMOPT_DQSUSER flag to dqget because
* we don't want this dquot cached. We haven't done a
...
...
@@ -1688,10 +1712,12 @@ xfs_qm_quotacheck_dqadjust(
}
/*
*
Adjust the timers since we just changed usages
*
Set default limits, adjust timers (since we changed usages)
*/
if
(
!
XFS_IS_SUSER_DQUOT
(
dqp
))
if
(
!
XFS_IS_SUSER_DQUOT
(
dqp
))
{
xfs_qm_adjust_dqlimits
(
dqp
->
q_mount
,
&
dqp
->
q_core
);
xfs_qm_adjust_dqtimers
(
dqp
->
q_mount
,
&
dqp
->
q_core
);
}
dqp
->
dq_flags
|=
XFS_DQ_DIRTY
;
}
...
...
fs/xfs/quota/xfs_qm.h
View file @
2da3ddf9
...
...
@@ -136,9 +136,14 @@ typedef struct xfs_quotainfo {
xfs_qwarncnt_t
qi_bwarnlimit
;
/* limit for num warnings */
xfs_qwarncnt_t
qi_iwarnlimit
;
/* limit for num warnings */
mutex_t
qi_quotaofflock
;
/* to serialize quotaoff */
/* Some useful precalculated constants */
xfs_filblks_t
qi_dqchunklen
;
/* # BBs in a chunk of dqs */
uint
qi_dqperchunk
;
/* # ondisk dqs in above chunk */
xfs_qcnt_t
qi_bhardlimit
;
/* default data blk hard limit */
xfs_qcnt_t
qi_bsoftlimit
;
/* default data blk soft limit */
xfs_qcnt_t
qi_ihardlimit
;
/* default inode count hard limit */
xfs_qcnt_t
qi_isoftlimit
;
/* default inode count soft limit */
xfs_qcnt_t
qi_rtbhardlimit
;
/* default realtime blk hard limit */
xfs_qcnt_t
qi_rtbsoftlimit
;
/* default realtime blk soft limit */
}
xfs_quotainfo_t
;
...
...
fs/xfs/quota/xfs_qm_syscalls.c
View file @
2da3ddf9
...
...
@@ -648,8 +648,11 @@ xfs_qm_scall_setqlim(
if
(
hard
==
0
||
hard
>=
soft
)
{
INT_SET
(
ddq
->
d_blk_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
,
soft
);
}
else
{
if
(
id
==
0
)
{
mp
->
m_quotainfo
->
qi_bhardlimit
=
hard
;
mp
->
m_quotainfo
->
qi_bsoftlimit
=
soft
;
}
}
else
{
qdprintk
(
"blkhard %Ld < blksoft %Ld
\n
"
,
hard
,
soft
);
}
hard
=
(
newlim
->
d_fieldmask
&
FS_DQ_RTBHARD
)
?
...
...
@@ -661,40 +664,49 @@ xfs_qm_scall_setqlim(
if
(
hard
==
0
||
hard
>=
soft
)
{
INT_SET
(
ddq
->
d_rtb_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_rtb_softlimit
,
ARCH_CONVERT
,
soft
);
}
else
if
(
id
==
0
)
{
mp
->
m_quotainfo
->
qi_rtbhardlimit
=
hard
;
mp
->
m_quotainfo
->
qi_rtbsoftlimit
=
soft
;
}
}
else
{
qdprintk
(
"rtbhard %Ld < rtbsoft %Ld
\n
"
,
hard
,
soft
);
}
hard
=
(
newlim
->
d_fieldmask
&
FS_DQ_IHARD
)
?
(
xfs_qcnt_t
)
newlim
->
d_ino_hardlimit
:
INT_GET
(
ddq
->
d_ino_hardlimit
,
ARCH_CONVERT
);
INT_GET
(
ddq
->
d_ino_hardlimit
,
ARCH_CONVERT
);
soft
=
(
newlim
->
d_fieldmask
&
FS_DQ_ISOFT
)
?
(
xfs_qcnt_t
)
newlim
->
d_ino_softlimit
:
INT_GET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
);
INT_GET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
);
if
(
hard
==
0
||
hard
>=
soft
)
{
INT_SET
(
ddq
->
d_ino_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
,
soft
);
}
else
if
(
id
==
0
)
{
mp
->
m_quotainfo
->
qi_ihardlimit
=
hard
;
mp
->
m_quotainfo
->
qi_isoftlimit
=
soft
;
}
}
else
{
qdprintk
(
"ihard %Ld < isoft %Ld
\n
"
,
hard
,
soft
);
}
if
(
id
==
0
)
{
/*
* Timelimits for the super user set the relative time
* the other users can be over quota for this file system.
* If it is zero a default is used.
* If it is zero a default is used. Ditto for the default
* soft and hard limit values (already done, above).
*/
if
(
newlim
->
d_fieldmask
&
FS_DQ_BTIMER
)
{
mp
->
m_quotainfo
->
qi_btimelimit
=
newlim
->
d_btimer
;
INT_SET
(
d
qp
->
q_core
.
d_btimer
,
ARCH_CONVERT
,
newlim
->
d_btimer
);
INT_SET
(
d
dq
->
d_btimer
,
ARCH_CONVERT
,
newlim
->
d_btimer
);
}
if
(
newlim
->
d_fieldmask
&
FS_DQ_ITIMER
)
{
mp
->
m_quotainfo
->
qi_itimelimit
=
newlim
->
d_itimer
;
INT_SET
(
d
qp
->
q_core
.
d_itimer
,
ARCH_CONVERT
,
newlim
->
d_itimer
);
INT_SET
(
d
dq
->
d_itimer
,
ARCH_CONVERT
,
newlim
->
d_itimer
);
}
if
(
newlim
->
d_fieldmask
&
FS_DQ_RTBTIMER
)
{
mp
->
m_quotainfo
->
qi_rtbtimelimit
=
newlim
->
d_rtbtimer
;
INT_SET
(
d
qp
->
q_core
.
d_rtbtimer
,
ARCH_CONVERT
,
newlim
->
d_rtbtimer
);
INT_SET
(
d
dq
->
d_rtbtimer
,
ARCH_CONVERT
,
newlim
->
d_rtbtimer
);
}
}
else
/* if (XFS_IS_QUOTA_ENFORCED(mp)) */
{
/*
...
...
fs/xfs/quota/xfs_trans_dquot.c
View file @
2da3ddf9
...
...
@@ -452,9 +452,13 @@ xfs_trans_apply_dquot_deltas(
INT_MOD
(
d
->
d_rtbcount
,
ARCH_CONVERT
,
(
xfs_qcnt_t
)
totalrtbdelta
);
/*
* Get any default limits in use.
* Start/reset the timer(s) if needed.
*/
xfs_qm_adjust_dqtimers
(
tp
->
t_mountp
,
d
);
if
(
!
INT_ISZERO
(
d
->
d_id
,
ARCH_CONVERT
))
{
xfs_qm_adjust_dqlimits
(
tp
->
t_mountp
,
d
);
xfs_qm_adjust_dqtimers
(
tp
->
t_mountp
,
d
);
}
dqp
->
dq_flags
|=
XFS_DQ_DIRTY
;
/*
...
...
@@ -625,6 +629,7 @@ xfs_trans_unreserve_and_mod_dquots(
STATIC
int
xfs_trans_dqresv
(
xfs_trans_t
*
tp
,
xfs_mount_t
*
mp
,
xfs_dquot_t
*
dqp
,
long
nblks
,
long
ninos
,
...
...
@@ -635,6 +640,7 @@ xfs_trans_dqresv(
xfs_qcnt_t
softlimit
;
time_t
btimer
;
xfs_qcnt_t
*
resbcountp
;
xfs_quotainfo_t
*
q
=
mp
->
m_quotainfo
;
if
(
!
(
flags
&
XFS_QMOPT_DQLOCK
))
{
xfs_dqlock
(
dqp
);
...
...
@@ -642,13 +648,21 @@ xfs_trans_dqresv(
ASSERT
(
XFS_DQ_IS_LOCKED
(
dqp
));
if
(
flags
&
XFS_TRANS_DQ_RES_BLKS
)
{
hardlimit
=
INT_GET
(
dqp
->
q_core
.
d_blk_hardlimit
,
ARCH_CONVERT
);
if
(
!
hardlimit
)
hardlimit
=
q
->
qi_bhardlimit
;
softlimit
=
INT_GET
(
dqp
->
q_core
.
d_blk_softlimit
,
ARCH_CONVERT
);
if
(
!
softlimit
)
softlimit
=
q
->
qi_bsoftlimit
;
btimer
=
INT_GET
(
dqp
->
q_core
.
d_btimer
,
ARCH_CONVERT
);
resbcountp
=
&
dqp
->
q_res_bcount
;
}
else
{
ASSERT
(
flags
&
XFS_TRANS_DQ_RES_RTBLKS
);
hardlimit
=
INT_GET
(
dqp
->
q_core
.
d_rtb_hardlimit
,
ARCH_CONVERT
);
if
(
!
hardlimit
)
hardlimit
=
q
->
qi_rtbhardlimit
;
softlimit
=
INT_GET
(
dqp
->
q_core
.
d_rtb_softlimit
,
ARCH_CONVERT
);
if
(
!
softlimit
)
softlimit
=
q
->
qi_rtbsoftlimit
;
btimer
=
INT_GET
(
dqp
->
q_core
.
d_rtbtimer
,
ARCH_CONVERT
);
resbcountp
=
&
dqp
->
q_res_rtbcount
;
}
...
...
@@ -689,14 +703,18 @@ xfs_trans_dqresv(
}
}
if
(
ninos
>
0
)
{
if
(
INT_GET
(
dqp
->
q_core
.
d_ino_hardlimit
,
ARCH_CONVERT
)
>
0ULL
&&
INT_GET
(
dqp
->
q_core
.
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
dqp
->
q_core
.
d_ino_hardlimit
,
ARCH_CONVERT
))
{
hardlimit
=
INT_GET
(
dqp
->
q_core
.
d_ino_hardlimit
,
ARCH_CONVERT
);
if
(
!
hardlimit
)
hardlimit
=
q
->
qi_ihardlimit
;
softlimit
=
INT_GET
(
dqp
->
q_core
.
d_ino_softlimit
,
ARCH_CONVERT
);
if
(
!
softlimit
)
softlimit
=
q
->
qi_isoftlimit
;
if
(
hardlimit
>
0ULL
&&
INT_GET
(
dqp
->
q_core
.
d_icount
,
ARCH_CONVERT
)
>=
hardlimit
)
{
error
=
EDQUOT
;
goto
error_return
;
}
else
if
(
INT_GET
(
dqp
->
q_core
.
d_ino_softlimit
,
ARCH_CONVERT
)
>
0ULL
&&
INT_GET
(
dqp
->
q_core
.
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
dqp
->
q_core
.
d_ino_softlimit
,
ARCH_CONVERT
))
{
}
else
if
(
softlimit
>
0ULL
&&
INT_GET
(
dqp
->
q_core
.
d_icount
,
ARCH_CONVERT
)
>=
softlimit
)
{
/*
* If timer or warnings has expired,
* return EDQUOT
...
...
@@ -786,19 +804,20 @@ xfs_trans_reserve_quota_bydquots(
resvd
=
0
;
if
(
udqp
)
{
if
(
xfs_trans_dqresv
(
tp
,
udqp
,
nblks
,
ninos
,
flags
))
if
(
xfs_trans_dqresv
(
tp
,
mp
,
udqp
,
nblks
,
ninos
,
flags
))
return
(
EDQUOT
);
resvd
=
1
;
}
if
(
gdqp
)
{
if
(
xfs_trans_dqresv
(
tp
,
gdqp
,
nblks
,
ninos
,
flags
))
{
if
(
xfs_trans_dqresv
(
tp
,
mp
,
gdqp
,
nblks
,
ninos
,
flags
))
{
/*
* can't do it, so backout previous reservation
*/
if
(
resvd
)
{
xfs_trans_dqresv
(
tp
,
udqp
,
-
nblks
,
-
ninos
,
flags
);
flags
|=
XFS_QMOPT_FORCE_RES
;
xfs_trans_dqresv
(
tp
,
mp
,
udqp
,
-
nblks
,
-
ninos
,
flags
);
}
return
(
EDQUOT
);
}
...
...
fs/xfs/xfs_bmap.c
View file @
2da3ddf9
...
...
@@ -3427,19 +3427,20 @@ xfs_bmap_do_search_extents(
int
high
;
/* high index of binary search */
int
low
;
/* low index of binary search */
/* Initialize the extent entry structure to catch access to
* uninitialized br_startblock field.
*/
got
.
br_startoff
=
0xffa5a5a5a5a5a5a5
;
got
.
br_blockcount
=
0xa55a5a5a5a5a5a5a
;
got
.
br_state
=
XFS_EXT_INVALID
;
#if XFS_BIG_BLKNOS
got
.
br_startblock
=
0xffffa5a5a5a5a5a5
;
#else
got
.
br_startblock
=
0xffffa5a5
;
#endif
/*
* Initialize the extent entry structure to catch access to
* uninitialized br_startblock field.
*/
got
.
br_startoff
=
0xffa5a5a5a5a5a5a5LL
;
got
.
br_blockcount
=
0xa55a5a5a5a5a5a5aLL
;
got
.
br_state
=
XFS_EXT_INVALID
;
#if XFS_BIG_BLKNOS
got
.
br_startblock
=
0xffffa5a5a5a5a5a5LL
;
#else
got
.
br_startblock
=
0xffffa5a5
;
#endif
if
(
lastx
!=
NULLEXTNUM
&&
lastx
<
nextents
)
ep
=
base
+
lastx
;
else
...
...
fs/xfs/xfs_fsops.c
View file @
2da3ddf9
...
...
@@ -142,6 +142,7 @@ xfs_growfs_data_private(
int
dpct
;
int
error
;
xfs_agnumber_t
nagcount
;
xfs_agnumber_t
nagimax
=
0
;
xfs_rfsblock_t
nb
,
nb_mod
;
xfs_rfsblock_t
new
;
xfs_rfsblock_t
nfree
;
...
...
@@ -183,7 +184,7 @@ xfs_growfs_data_private(
memset
(
&
mp
->
m_perag
[
oagcount
],
0
,
(
nagcount
-
oagcount
)
*
sizeof
(
xfs_perag_t
));
mp
->
m_flags
|=
XFS_MOUNT_32BITINODES
;
xfs_initialize_perag
(
mp
,
nagcount
);
nagimax
=
xfs_initialize_perag
(
mp
,
nagcount
);
up_write
(
&
mp
->
m_peraglock
);
}
tp
=
xfs_trans_alloc
(
mp
,
XFS_TRANS_GROWFS
);
...
...
@@ -372,6 +373,9 @@ xfs_growfs_data_private(
if
(
error
)
{
return
error
;
}
/* New allocation groups fully initialized, so update mount struct */
if
(
nagimax
)
mp
->
m_maxagi
=
nagimax
;
if
(
mp
->
m_sb
.
sb_imax_pct
)
{
__uint64_t
icount
=
mp
->
m_sb
.
sb_dblocks
*
mp
->
m_sb
.
sb_imax_pct
;
do_div
(
icount
,
100
);
...
...
fs/xfs/xfs_log_recover.c
View file @
2da3ddf9
...
...
@@ -2047,12 +2047,11 @@ xfs_qm_dqcheck(
errs
++
;
}
if
(
!
errs
)
{
if
(
!
errs
&&
!
INT_ISZERO
(
ddq
->
d_id
,
ARCH_CONVERT
)
)
{
if
(
INT_GET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
)
&&
INT_GET
(
ddq
->
d_bcount
,
ARCH_CONVERT
)
>=
INT_GET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
ddq
->
d_btimer
,
ARCH_CONVERT
)
&&
!
INT_ISZERO
(
ddq
->
d_id
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
ddq
->
d_btimer
,
ARCH_CONVERT
))
{
if
(
flags
&
XFS_QMOPT_DOWARN
)
cmn_err
(
CE_ALERT
,
"%s : Dquot ID 0x%x (0x%p) "
...
...
@@ -2065,8 +2064,7 @@ xfs_qm_dqcheck(
if
(
INT_GET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
)
&&
INT_GET
(
ddq
->
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
ddq
->
d_itimer
,
ARCH_CONVERT
)
&&
!
INT_ISZERO
(
ddq
->
d_id
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
ddq
->
d_itimer
,
ARCH_CONVERT
))
{
if
(
flags
&
XFS_QMOPT_DOWARN
)
cmn_err
(
CE_ALERT
,
"%s : Dquot ID 0x%x (0x%p) "
...
...
@@ -2076,6 +2074,19 @@ xfs_qm_dqcheck(
errs
++
;
}
}
if
(
INT_GET
(
ddq
->
d_rtb_softlimit
,
ARCH_CONVERT
)
&&
INT_GET
(
ddq
->
d_rtbcount
,
ARCH_CONVERT
)
>=
INT_GET
(
ddq
->
d_rtb_softlimit
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
ddq
->
d_rtbtimer
,
ARCH_CONVERT
))
{
if
(
flags
&
XFS_QMOPT_DOWARN
)
cmn_err
(
CE_ALERT
,
"%s : Dquot ID 0x%x (0x%p) "
"RTBLK TIMER NOT STARTED"
,
str
,
(
int
)
INT_GET
(
ddq
->
d_id
,
ARCH_CONVERT
),
ddq
);
errs
++
;
}
}
}
if
(
!
errs
||
!
(
flags
&
XFS_QMOPT_DQREPAIR
))
...
...
fs/xfs/xfs_mount.c
View file @
2da3ddf9
...
...
@@ -318,10 +318,10 @@ xfs_mount_validate_sb(
return
0
;
}
void
xfs_initialize_perag
(
xfs_mount_t
*
mp
,
in
t
agcount
)
xfs_agnumber_t
xfs_initialize_perag
(
xfs_mount_t
*
mp
,
xfs_agnumber_
t
agcount
)
{
int
index
,
max_metadata
;
xfs_agnumber_t
index
,
max_metadata
;
xfs_perag_t
*
pag
;
xfs_agino_t
agino
;
xfs_ino_t
ino
;
...
...
@@ -377,7 +377,7 @@ xfs_initialize_perag(xfs_mount_t *mp, int agcount)
pag
->
pagi_inodeok
=
1
;
}
}
mp
->
m_maxagi
=
index
;
return
index
;
}
/*
...
...
@@ -951,7 +951,7 @@ xfs_mountfs(
mp
->
m_perag
=
kmem_zalloc
(
sbp
->
sb_agcount
*
sizeof
(
xfs_perag_t
),
KM_SLEEP
);
xfs_initialize_perag
(
mp
,
sbp
->
sb_agcount
);
mp
->
m_maxagi
=
xfs_initialize_perag
(
mp
,
sbp
->
sb_agcount
);
/*
* log's mount-time initialization. Perform 1st part recovery if needed
...
...
fs/xfs/xfs_mount.h
View file @
2da3ddf9
...
...
@@ -551,7 +551,7 @@ extern int xfs_readsb(xfs_mount_t *mp);
extern
void
xfs_freesb
(
xfs_mount_t
*
);
extern
void
xfs_do_force_shutdown
(
bhv_desc_t
*
,
int
,
char
*
,
int
);
extern
int
xfs_syncsub
(
xfs_mount_t
*
,
int
,
int
,
int
*
);
extern
void
xfs_initialize_perag
(
xfs_mount_t
*
,
in
t
);
extern
xfs_agnumber_t
xfs_initialize_perag
(
xfs_mount_t
*
,
xfs_agnumber_
t
);
extern
void
xfs_xlatesb
(
void
*
,
struct
xfs_sb
*
,
int
,
xfs_arch_t
,
__int64_t
);
...
...
fs/xfs/xfs_vnodeops.c
View file @
2da3ddf9
...
...
@@ -283,7 +283,7 @@ xfs_getattr(
/*
* xfs_setattr
*/
STATIC
int
int
xfs_setattr
(
bhv_desc_t
*
bdp
,
vattr_t
*
vap
,
...
...
@@ -305,6 +305,7 @@ xfs_setattr(
int
mandlock_before
,
mandlock_after
;
struct
xfs_dquot
*
udqp
,
*
gdqp
,
*
olddquot1
,
*
olddquot2
;
int
file_owner
;
int
need_iolock
=
(
flags
&
ATTR_DMI
)
==
0
;
vp
=
BHV_TO_VNODE
(
bdp
);
vn_trace_entry
(
vp
,
__FUNCTION__
,
(
inst_t
*
)
__return_address
);
...
...
@@ -406,7 +407,8 @@ xfs_setattr(
goto
error_return
;
}
}
lock_flags
|=
XFS_IOLOCK_EXCL
;
if
(
need_iolock
)
lock_flags
|=
XFS_IOLOCK_EXCL
;
}
xfs_ilock
(
ip
,
lock_flags
);
...
...
@@ -678,7 +680,8 @@ xfs_setattr(
XFS_TRANS_PERM_LOG_RES
,
XFS_ITRUNCATE_LOG_COUNT
)))
{
xfs_trans_cancel
(
tp
,
0
);
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
if
(
need_iolock
)
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
return
code
;
}
commit_flags
=
XFS_TRANS_RELEASE_LOG_RES
;
...
...
@@ -4297,6 +4300,7 @@ xfs_free_file_space(
int
rt
;
xfs_fileoff_t
startoffset_fsb
;
xfs_trans_t
*
tp
;
int
need_iolock
=
(
attr_flags
&
ATTR_DMI
)
==
0
;
vn_trace_entry
(
XFS_ITOV
(
ip
),
__FUNCTION__
,
(
inst_t
*
)
__return_address
);
mp
=
ip
->
i_mount
;
...
...
@@ -4324,7 +4328,8 @@ xfs_free_file_space(
return
(
error
);
}
xfs_ilock
(
ip
,
XFS_IOLOCK_EXCL
);
if
(
need_iolock
)
xfs_ilock
(
ip
,
XFS_IOLOCK_EXCL
);
rounding
=
MAX
((
__uint8_t
)(
1
<<
mp
->
m_sb
.
sb_blocklog
),
(
__uint8_t
)
NBPP
);
ilen
=
len
+
(
offset
&
(
rounding
-
1
));
...
...
@@ -4342,10 +4347,8 @@ xfs_free_file_space(
nimap
=
1
;
error
=
xfs_bmapi
(
NULL
,
ip
,
startoffset_fsb
,
1
,
0
,
NULL
,
0
,
&
imap
,
&
nimap
,
NULL
);
if
(
error
)
{
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
return
error
;
}
if
(
error
)
goto
out_unlock_iolock
;
ASSERT
(
nimap
==
0
||
nimap
==
1
);
if
(
nimap
&&
imap
.
br_startblock
!=
HOLESTARTBLOCK
)
{
xfs_daddr_t
block
;
...
...
@@ -4359,10 +4362,8 @@ xfs_free_file_space(
nimap
=
1
;
error
=
xfs_bmapi
(
NULL
,
ip
,
endoffset_fsb
-
1
,
1
,
0
,
NULL
,
0
,
&
imap
,
&
nimap
,
NULL
);
if
(
error
)
{
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
return
error
;
}
if
(
error
)
goto
out_unlock_iolock
;
ASSERT
(
nimap
==
0
||
nimap
==
1
);
if
(
nimap
&&
imap
.
br_startblock
!=
HOLESTARTBLOCK
)
{
ASSERT
(
imap
.
br_startblock
!=
DELAYSTARTBLOCK
);
...
...
@@ -4451,14 +4452,17 @@ xfs_free_file_space(
xfs_iunlock
(
ip
,
XFS_ILOCK_EXCL
);
}
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
out_unlock_iolock:
if
(
need_iolock
)
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
return
error
;
error0:
xfs_bmap_cancel
(
&
free_list
);
error1:
xfs_trans_cancel
(
tp
,
XFS_TRANS_RELEASE_LOG_RES
|
XFS_TRANS_ABORT
);
xfs_iunlock
(
ip
,
XFS_ILOCK_EXCL
|
XFS_IOLOCK_EXCL
);
xfs_iunlock
(
ip
,
need_iolock
?
(
XFS_ILOCK_EXCL
|
XFS_IOLOCK_EXCL
)
:
XFS_ILOCK_EXCL
);
return
error
;
}
...
...
@@ -4615,20 +4619,21 @@ xfs_change_file_space(
xfs_trans_ijoin
(
tp
,
ip
,
XFS_ILOCK_EXCL
);
xfs_trans_ihold
(
tp
,
ip
);
ip
->
i_d
.
di_mode
&=
~
S_ISUID
;
/*
* Note that we don't have to worry about mandatory
* file locking being disabled here because we only
* clear the S_ISGID bit if the Group execute bit is
* on, but if it was on then mandatory locking wouldn't
* have been enabled.
*/
if
(
ip
->
i_d
.
di_mode
&
S_IXGRP
)
ip
->
i_d
.
di_mode
&=
~
S_ISGID
;
if
((
attr_flags
&
ATTR_DMI
)
==
0
)
{
ip
->
i_d
.
di_mode
&=
~
S_ISUID
;
xfs_ichgtime
(
ip
,
XFS_ICHGTIME_MOD
|
XFS_ICHGTIME_CHG
);
/*
* Note that we don't have to worry about mandatory
* file locking being disabled here because we only
* clear the S_ISGID bit if the Group execute bit is
* on, but if it was on then mandatory locking wouldn't
* have been enabled.
*/
if
(
ip
->
i_d
.
di_mode
&
S_IXGRP
)
ip
->
i_d
.
di_mode
&=
~
S_ISGID
;
xfs_ichgtime
(
ip
,
XFS_ICHGTIME_MOD
|
XFS_ICHGTIME_CHG
);
}
if
(
setprealloc
)
ip
->
i_d
.
di_flags
|=
XFS_DIFLAG_PREALLOC
;
else
if
(
clrprealloc
)
...
...
mm/filemap.c
View file @
2da3ddf9
...
...
@@ -277,6 +277,7 @@ int sync_page_range(struct inode *inode, struct address_space *mapping,
ret
=
wait_on_page_writeback_range
(
mapping
,
start
,
end
);
return
ret
;
}
EXPORT_SYMBOL
(
sync_page_range
);
/**
* filemap_fdatawait - walk the list of under-writeback pages of the given
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment