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
2125f957
Commit
2125f957
authored
Aug 29, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
http://oss.sgi.com:8090/xfs-linux-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
5bc4b4bd
4f2063ff
Changes
16
Expand all
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 @
2125f957
...
@@ -116,17 +116,10 @@ __linvfs_write(
...
@@ -116,17 +116,10 @@ __linvfs_write(
ssize_t
rval
;
ssize_t
rval
;
BUG_ON
(
iocb
->
ki_pos
!=
pos
);
BUG_ON
(
iocb
->
ki_pos
!=
pos
);
if
(
unlikely
(
file
->
f_flags
&
O_DIRECT
))
{
if
(
unlikely
(
file
->
f_flags
&
O_DIRECT
))
ioflags
|=
IO_ISDIRECT
;
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
;
return
rval
;
}
}
...
@@ -214,17 +207,10 @@ __linvfs_writev(
...
@@ -214,17 +207,10 @@ __linvfs_writev(
init_sync_kiocb
(
&
kiocb
,
file
);
init_sync_kiocb
(
&
kiocb
,
file
);
kiocb
.
ki_pos
=
*
ppos
;
kiocb
.
ki_pos
=
*
ppos
;
if
(
unlikely
(
file
->
f_flags
&
O_DIRECT
))
{
if
(
unlikely
(
file
->
f_flags
&
O_DIRECT
))
ioflags
|=
IO_ISDIRECT
;
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
)
if
(
rval
==
-
EIOCBQUEUED
)
rval
=
wait_on_sync_kiocb
(
&
kiocb
);
rval
=
wait_on_sync_kiocb
(
&
kiocb
);
...
...
fs/xfs/linux-2.6/xfs_ioctl32.c
View file @
2125f957
...
@@ -45,8 +45,7 @@
...
@@ -45,8 +45,7 @@
#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
#define BROKEN_X86_ALIGNMENT
#define BROKEN_X86_ALIGNMENT
#endif
#else
typedef
struct
xfs_fsop_bulkreq32
{
typedef
struct
xfs_fsop_bulkreq32
{
compat_uptr_t
lastip
;
/* last inode # pointer */
compat_uptr_t
lastip
;
/* last inode # pointer */
...
@@ -77,6 +76,7 @@ xfs_ioctl32_bulkstat(
...
@@ -77,6 +76,7 @@ xfs_ioctl32_bulkstat(
return
sys_ioctl
(
fd
,
cmd
,
(
unsigned
long
)
p
);
return
sys_ioctl
(
fd
,
cmd
,
(
unsigned
long
)
p
);
}
}
#endif
struct
ioctl_trans
xfs_ioctl32_trans
[]
=
{
struct
ioctl_trans
xfs_ioctl32_trans
[]
=
{
{
XFS_IOC_DIOINFO
,
},
{
XFS_IOC_DIOINFO
,
},
...
...
fs/xfs/linux-2.6/xfs_lrw.c
View file @
2125f957
This diff is collapsed.
Click to expand it.
fs/xfs/quota/xfs_dquot.c
View file @
2125f957
...
@@ -187,9 +187,9 @@ xfs_qm_dqdestroy(
...
@@ -187,9 +187,9 @@ xfs_qm_dqdestroy(
*/
*/
STATIC
void
STATIC
void
xfs_qm_dqinit_core
(
xfs_qm_dqinit_core
(
xfs_dqid_t
id
,
xfs_dqid_t
id
,
uint
type
,
uint
type
,
xfs_dqblk_t
*
d
)
xfs_dqblk_t
*
d
)
{
{
/*
/*
* Caller has zero'd the entire dquot 'chunk' already.
* Caller has zero'd the entire dquot 'chunk' already.
...
@@ -249,6 +249,36 @@ __xfs_dqtrace_entry(
...
@@ -249,6 +249,36 @@ __xfs_dqtrace_entry(
#endif
#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
* Check the limits and timers of a dquot and start or reset timers
* if necessary.
* if necessary.
...
@@ -265,53 +295,81 @@ xfs_qm_adjust_dqtimers(
...
@@ -265,53 +295,81 @@ xfs_qm_adjust_dqtimers(
xfs_mount_t
*
mp
,
xfs_mount_t
*
mp
,
xfs_disk_dquot_t
*
d
)
xfs_disk_dquot_t
*
d
)
{
{
/*
ASSERT
(
!
INT_ISZERO
(
d
->
d_id
,
ARCH_CONVERT
));
* 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
;
#ifdef QUOTADEBUG
#ifdef QUOTADEBUG
if
(
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
))
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
))
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
#endif
if
(
INT_ISZERO
(
d
->
d_btimer
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
d
->
d_btimer
,
ARCH_CONVERT
))
{
if
((
INT_GET
(
d
->
d_blk_softlimit
,
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_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_SET
(
d
->
d_btimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_BTIMELIMIT
(
mp
));
INT_GET
(
d
->
d_blk_hardlimit
,
ARCH_CONVERT
))))
{
INT_SET
(
d
->
d_btimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_BTIMELIMIT
(
mp
));
}
}
}
else
{
}
else
{
if
((
INT_ISZERO
(
d
->
d_blk_softlimit
,
ARCH_CONVERT
)
||
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_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
);
INT_ZERO
(
d
->
d_btimer
,
ARCH_CONVERT
);
}
}
}
}
if
(
INT_ISZERO
(
d
->
d_itimer
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
d
->
d_itimer
,
ARCH_CONVERT
))
{
if
((
INT_GET
(
d
->
d_ino_softlimit
,
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_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_SET
(
d
->
d_itimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_ITIMELIMIT
(
mp
));
INT_GET
(
d
->
d_ino_hardlimit
,
ARCH_CONVERT
))))
{
INT_SET
(
d
->
d_itimer
,
ARCH_CONVERT
,
get_seconds
()
+
XFS_QI_ITIMELIMIT
(
mp
));
}
}
}
else
{
}
else
{
if
((
INT_ISZERO
(
d
->
d_ino_softlimit
,
ARCH_CONVERT
)
||
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_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
);
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 @
2125f957
...
@@ -209,6 +209,8 @@ extern int xfs_qm_dqflock_nowait(xfs_dquot_t *);
...
@@ -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_dqflock_pushbuf_wait
(
xfs_dquot_t
*
dqp
);
extern
void
xfs_qm_adjust_dqtimers
(
xfs_mount_t
*
,
extern
void
xfs_qm_adjust_dqtimers
(
xfs_mount_t
*
,
xfs_disk_dquot_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_dqwarn
(
xfs_disk_dquot_t
*
,
uint
);
extern
int
xfs_qm_dqget
(
xfs_mount_t
*
,
xfs_inode_t
*
,
extern
int
xfs_qm_dqget
(
xfs_mount_t
*
,
xfs_inode_t
*
,
xfs_dqid_t
,
uint
,
uint
,
xfs_dquot_t
**
);
xfs_dqid_t
,
uint
,
uint
,
xfs_dquot_t
**
);
...
...
fs/xfs/quota/xfs_qm.c
View file @
2125f957
...
@@ -1213,22 +1213,46 @@ xfs_qm_init_quotainfo(
...
@@ -1213,22 +1213,46 @@ xfs_qm_init_quotainfo(
XFS_QMOPT_DQSUSER
|
XFS_QMOPT_DOWARN
,
XFS_QMOPT_DQSUSER
|
XFS_QMOPT_DOWARN
,
&
dqp
);
&
dqp
);
if
(
!
error
)
{
if
(
!
error
)
{
xfs_disk_dquot_t
*
ddqp
=
&
dqp
->
q_core
;
/*
/*
* The warnings and timers set the grace period given to
* The warnings and timers set the grace period given to
* a user or group before he or she can not perform any
* a user or group before he or she can not perform any
* more writing. If it is zero, a default is used.
* more writing. If it is zero, a default is used.
*/
*/
qinf
->
qi_btimelimit
=
INT_GET
(
dqp
->
q_core
.
d_btimer
,
ARCH_CONVERT
)
?
qinf
->
qi_btimelimit
=
INT_GET
(
dqp
->
q_core
.
d_btimer
,
ARCH_CONVERT
)
:
XFS_QM_BTIMELIMIT
;
INT_GET
(
ddqp
->
d_btimer
,
ARCH_CONVERT
)
?
qinf
->
qi_itimelimit
=
INT_GET
(
dqp
->
q_core
.
d_itimer
,
ARCH_CONVERT
)
?
INT_GET
(
ddqp
->
d_btimer
,
ARCH_CONVERT
)
:
INT_GET
(
dqp
->
q_core
.
d_itimer
,
ARCH_CONVERT
)
:
XFS_QM_ITIMELIMIT
;
XFS_QM_BTIMELIMIT
;
qinf
->
qi_rtbtimelimit
=
INT_GET
(
dqp
->
q_core
.
d_rtbtimer
,
ARCH_CONVERT
)
?
qinf
->
qi_itimelimit
=
INT_GET
(
dqp
->
q_core
.
d_rtbtimer
,
ARCH_CONVERT
)
:
XFS_QM_RTBTIMELIMIT
;
INT_GET
(
ddqp
->
d_itimer
,
ARCH_CONVERT
)
?
qinf
->
qi_bwarnlimit
=
INT_GET
(
dqp
->
q_core
.
d_bwarns
,
ARCH_CONVERT
)
?
INT_GET
(
ddqp
->
d_itimer
,
ARCH_CONVERT
)
:
INT_GET
(
dqp
->
q_core
.
d_bwarns
,
ARCH_CONVERT
)
:
XFS_QM_BWARNLIMIT
;
XFS_QM_ITIMELIMIT
;
qinf
->
qi_iwarnlimit
=
INT_GET
(
dqp
->
q_core
.
d_iwarns
,
ARCH_CONVERT
)
?
qinf
->
qi_rtbtimelimit
=
INT_GET
(
dqp
->
q_core
.
d_iwarns
,
ARCH_CONVERT
)
:
XFS_QM_IWARNLIMIT
;
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 sent the XFS_QMOPT_DQSUSER flag to dqget because
* we don't want this dquot cached. We haven't done a
* we don't want this dquot cached. We haven't done a
...
@@ -1688,10 +1712,12 @@ xfs_qm_quotacheck_dqadjust(
...
@@ -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
);
xfs_qm_adjust_dqtimers
(
dqp
->
q_mount
,
&
dqp
->
q_core
);
}
dqp
->
dq_flags
|=
XFS_DQ_DIRTY
;
dqp
->
dq_flags
|=
XFS_DQ_DIRTY
;
}
}
...
...
fs/xfs/quota/xfs_qm.h
View file @
2125f957
...
@@ -136,9 +136,14 @@ typedef struct xfs_quotainfo {
...
@@ -136,9 +136,14 @@ typedef struct xfs_quotainfo {
xfs_qwarncnt_t
qi_bwarnlimit
;
/* limit for num warnings */
xfs_qwarncnt_t
qi_bwarnlimit
;
/* limit for num warnings */
xfs_qwarncnt_t
qi_iwarnlimit
;
/* limit for num warnings */
xfs_qwarncnt_t
qi_iwarnlimit
;
/* limit for num warnings */
mutex_t
qi_quotaofflock
;
/* to serialize quotaoff */
mutex_t
qi_quotaofflock
;
/* to serialize quotaoff */
/* Some useful precalculated constants */
xfs_filblks_t
qi_dqchunklen
;
/* # BBs in a chunk of dqs */
xfs_filblks_t
qi_dqchunklen
;
/* # BBs in a chunk of dqs */
uint
qi_dqperchunk
;
/* # ondisk dqs in above chunk */
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
;
}
xfs_quotainfo_t
;
...
...
fs/xfs/quota/xfs_qm_syscalls.c
View file @
2125f957
...
@@ -648,8 +648,11 @@ xfs_qm_scall_setqlim(
...
@@ -648,8 +648,11 @@ xfs_qm_scall_setqlim(
if
(
hard
==
0
||
hard
>=
soft
)
{
if
(
hard
==
0
||
hard
>=
soft
)
{
INT_SET
(
ddq
->
d_blk_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_blk_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
,
soft
);
INT_SET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
,
soft
);
}
if
(
id
==
0
)
{
else
{
mp
->
m_quotainfo
->
qi_bhardlimit
=
hard
;
mp
->
m_quotainfo
->
qi_bsoftlimit
=
soft
;
}
}
else
{
qdprintk
(
"blkhard %Ld < blksoft %Ld
\n
"
,
hard
,
soft
);
qdprintk
(
"blkhard %Ld < blksoft %Ld
\n
"
,
hard
,
soft
);
}
}
hard
=
(
newlim
->
d_fieldmask
&
FS_DQ_RTBHARD
)
?
hard
=
(
newlim
->
d_fieldmask
&
FS_DQ_RTBHARD
)
?
...
@@ -661,40 +664,49 @@ xfs_qm_scall_setqlim(
...
@@ -661,40 +664,49 @@ xfs_qm_scall_setqlim(
if
(
hard
==
0
||
hard
>=
soft
)
{
if
(
hard
==
0
||
hard
>=
soft
)
{
INT_SET
(
ddq
->
d_rtb_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_rtb_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_rtb_softlimit
,
ARCH_CONVERT
,
soft
);
INT_SET
(
ddq
->
d_rtb_softlimit
,
ARCH_CONVERT
,
soft
);
}
if
(
id
==
0
)
{
else
mp
->
m_quotainfo
->
qi_rtbhardlimit
=
hard
;
mp
->
m_quotainfo
->
qi_rtbsoftlimit
=
soft
;
}
}
else
{
qdprintk
(
"rtbhard %Ld < rtbsoft %Ld
\n
"
,
hard
,
soft
);
qdprintk
(
"rtbhard %Ld < rtbsoft %Ld
\n
"
,
hard
,
soft
);
}
hard
=
(
newlim
->
d_fieldmask
&
FS_DQ_IHARD
)
?
hard
=
(
newlim
->
d_fieldmask
&
FS_DQ_IHARD
)
?
(
xfs_qcnt_t
)
newlim
->
d_ino_hardlimit
:
(
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
)
?
soft
=
(
newlim
->
d_fieldmask
&
FS_DQ_ISOFT
)
?
(
xfs_qcnt_t
)
newlim
->
d_ino_softlimit
:
(
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
)
{
if
(
hard
==
0
||
hard
>=
soft
)
{
INT_SET
(
ddq
->
d_ino_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_ino_hardlimit
,
ARCH_CONVERT
,
hard
);
INT_SET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
,
soft
);
INT_SET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
,
soft
);
}
if
(
id
==
0
)
{
else
mp
->
m_quotainfo
->
qi_ihardlimit
=
hard
;
mp
->
m_quotainfo
->
qi_isoftlimit
=
soft
;
}
}
else
{
qdprintk
(
"ihard %Ld < isoft %Ld
\n
"
,
hard
,
soft
);
qdprintk
(
"ihard %Ld < isoft %Ld
\n
"
,
hard
,
soft
);
}
if
(
id
==
0
)
{
if
(
id
==
0
)
{
/*
/*
* Timelimits for the super user set the relative time
* Timelimits for the super user set the relative time
* the other users can be over quota for this file system.
* 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
)
{
if
(
newlim
->
d_fieldmask
&
FS_DQ_BTIMER
)
{
mp
->
m_quotainfo
->
qi_btimelimit
=
newlim
->
d_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
)
{
if
(
newlim
->
d_fieldmask
&
FS_DQ_ITIMER
)
{
mp
->
m_quotainfo
->
qi_itimelimit
=
newlim
->
d_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
)
{
if
(
newlim
->
d_fieldmask
&
FS_DQ_RTBTIMER
)
{
mp
->
m_quotainfo
->
qi_rtbtimelimit
=
newlim
->
d_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)) */
{
}
else
/* if (XFS_IS_QUOTA_ENFORCED(mp)) */
{
/*
/*
...
...
fs/xfs/quota/xfs_trans_dquot.c
View file @
2125f957
...
@@ -452,9 +452,13 @@ xfs_trans_apply_dquot_deltas(
...
@@ -452,9 +452,13 @@ xfs_trans_apply_dquot_deltas(
INT_MOD
(
d
->
d_rtbcount
,
ARCH_CONVERT
,
(
xfs_qcnt_t
)
totalrtbdelta
);
INT_MOD
(
d
->
d_rtbcount
,
ARCH_CONVERT
,
(
xfs_qcnt_t
)
totalrtbdelta
);
/*
/*
* Get any default limits in use.
* Start/reset the timer(s) if needed.
* 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
;
dqp
->
dq_flags
|=
XFS_DQ_DIRTY
;
/*
/*
...
@@ -625,6 +629,7 @@ xfs_trans_unreserve_and_mod_dquots(
...
@@ -625,6 +629,7 @@ xfs_trans_unreserve_and_mod_dquots(
STATIC
int
STATIC
int
xfs_trans_dqresv
(
xfs_trans_dqresv
(
xfs_trans_t
*
tp
,
xfs_trans_t
*
tp
,
xfs_mount_t
*
mp
,
xfs_dquot_t
*
dqp
,
xfs_dquot_t
*
dqp
,
long
nblks
,
long
nblks
,
long
ninos
,
long
ninos
,
...
@@ -635,6 +640,7 @@ xfs_trans_dqresv(
...
@@ -635,6 +640,7 @@ xfs_trans_dqresv(
xfs_qcnt_t
softlimit
;
xfs_qcnt_t
softlimit
;
time_t
btimer
;
time_t
btimer
;
xfs_qcnt_t
*
resbcountp
;
xfs_qcnt_t
*
resbcountp
;
xfs_quotainfo_t
*
q
=
mp
->
m_quotainfo
;
if
(
!
(
flags
&
XFS_QMOPT_DQLOCK
))
{
if
(
!
(
flags
&
XFS_QMOPT_DQLOCK
))
{
xfs_dqlock
(
dqp
);
xfs_dqlock
(
dqp
);
...
@@ -642,13 +648,21 @@ xfs_trans_dqresv(
...
@@ -642,13 +648,21 @@ xfs_trans_dqresv(
ASSERT
(
XFS_DQ_IS_LOCKED
(
dqp
));
ASSERT
(
XFS_DQ_IS_LOCKED
(
dqp
));
if
(
flags
&
XFS_TRANS_DQ_RES_BLKS
)
{
if
(
flags
&
XFS_TRANS_DQ_RES_BLKS
)
{
hardlimit
=
INT_GET
(
dqp
->
q_core
.
d_blk_hardlimit
,
ARCH_CONVERT
);
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
);
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
);
btimer
=
INT_GET
(
dqp
->
q_core
.
d_btimer
,
ARCH_CONVERT
);
resbcountp
=
&
dqp
->
q_res_bcount
;
resbcountp
=
&
dqp
->
q_res_bcount
;
}
else
{
}
else
{
ASSERT
(
flags
&
XFS_TRANS_DQ_RES_RTBLKS
);
ASSERT
(
flags
&
XFS_TRANS_DQ_RES_RTBLKS
);
hardlimit
=
INT_GET
(
dqp
->
q_core
.
d_rtb_hardlimit
,
ARCH_CONVERT
);
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
);
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
);
btimer
=
INT_GET
(
dqp
->
q_core
.
d_rtbtimer
,
ARCH_CONVERT
);
resbcountp
=
&
dqp
->
q_res_rtbcount
;
resbcountp
=
&
dqp
->
q_res_rtbcount
;
}
}
...
@@ -689,14 +703,18 @@ xfs_trans_dqresv(
...
@@ -689,14 +703,18 @@ xfs_trans_dqresv(
}
}
}
}
if
(
ninos
>
0
)
{
if
(
ninos
>
0
)
{
if
(
INT_GET
(
dqp
->
q_core
.
d_ino_hardlimit
,
ARCH_CONVERT
)
>
0ULL
&&
hardlimit
=
INT_GET
(
dqp
->
q_core
.
d_ino_hardlimit
,
ARCH_CONVERT
);
INT_GET
(
dqp
->
q_core
.
d_icount
,
ARCH_CONVERT
)
>=
if
(
!
hardlimit
)
INT_GET
(
dqp
->
q_core
.
d_ino_hardlimit
,
ARCH_CONVERT
))
{
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
;
error
=
EDQUOT
;
goto
error_return
;
goto
error_return
;
}
else
if
(
INT_GET
(
dqp
->
q_core
.
d_ino_softlimit
,
ARCH_CONVERT
)
>
0ULL
&&
}
else
if
(
softlimit
>
0ULL
&&
INT_GET
(
dqp
->
q_core
.
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
dqp
->
q_core
.
d_icount
,
ARCH_CONVERT
)
>=
softlimit
)
{
INT_GET
(
dqp
->
q_core
.
d_ino_softlimit
,
ARCH_CONVERT
))
{
/*
/*
* If timer or warnings has expired,
* If timer or warnings has expired,
* return EDQUOT
* return EDQUOT
...
@@ -786,19 +804,20 @@ xfs_trans_reserve_quota_bydquots(
...
@@ -786,19 +804,20 @@ xfs_trans_reserve_quota_bydquots(
resvd
=
0
;
resvd
=
0
;
if
(
udqp
)
{
if
(
udqp
)
{
if
(
xfs_trans_dqresv
(
tp
,
udqp
,
nblks
,
ninos
,
flags
))
if
(
xfs_trans_dqresv
(
tp
,
mp
,
udqp
,
nblks
,
ninos
,
flags
))
return
(
EDQUOT
);
return
(
EDQUOT
);
resvd
=
1
;
resvd
=
1
;
}
}
if
(
gdqp
)
{
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
* can't do it, so backout previous reservation
*/
*/
if
(
resvd
)
{
if
(
resvd
)
{
xfs_trans_dqresv
(
tp
,
udqp
,
-
nblks
,
-
ninos
,
flags
|=
XFS_QMOPT_FORCE_RES
;
flags
);
xfs_trans_dqresv
(
tp
,
mp
,
udqp
,
-
nblks
,
-
ninos
,
flags
);
}
}
return
(
EDQUOT
);
return
(
EDQUOT
);
}
}
...
...
fs/xfs/xfs_bmap.c
View file @
2125f957
...
@@ -3427,19 +3427,20 @@ xfs_bmap_do_search_extents(
...
@@ -3427,19 +3427,20 @@ xfs_bmap_do_search_extents(
int
high
;
/* high index of binary search */
int
high
;
/* high index of binary search */
int
low
;
/* low index of binary search */
int
low
;
/* low index of binary search */
/* Initialize the extent entry structure to catch access to
/*
* uninitialized br_startblock field.
* Initialize the extent entry structure to catch access to
*/
* uninitialized br_startblock field.
*/
got
.
br_startoff
=
0xffa5a5a5a5a5a5a5
;
got
.
br_startoff
=
0xffa5a5a5a5a5a5a5LL
;
got
.
br_blockcount
=
0xa55a5a5a5a5a5a5a
;
got
.
br_blockcount
=
0xa55a5a5a5a5a5a5aLL
;
got
.
br_state
=
XFS_EXT_INVALID
;
got
.
br_state
=
XFS_EXT_INVALID
;
#if XFS_BIG_BLKNOS
#if XFS_BIG_BLKNOS
got
.
br_startblock
=
0xffffa5a5a5a5a5a5
;
got
.
br_startblock
=
0xffffa5a5a5a5a5a5LL
;
#else
#else
got
.
br_startblock
=
0xffffa5a5
;
got
.
br_startblock
=
0xffffa5a5
;
#endif
#endif
if
(
lastx
!=
NULLEXTNUM
&&
lastx
<
nextents
)
if
(
lastx
!=
NULLEXTNUM
&&
lastx
<
nextents
)
ep
=
base
+
lastx
;
ep
=
base
+
lastx
;
else
else
...
...
fs/xfs/xfs_fsops.c
View file @
2125f957
...
@@ -142,6 +142,7 @@ xfs_growfs_data_private(
...
@@ -142,6 +142,7 @@ xfs_growfs_data_private(
int
dpct
;
int
dpct
;
int
error
;
int
error
;
xfs_agnumber_t
nagcount
;
xfs_agnumber_t
nagcount
;
xfs_agnumber_t
nagimax
=
0
;
xfs_rfsblock_t
nb
,
nb_mod
;
xfs_rfsblock_t
nb
,
nb_mod
;
xfs_rfsblock_t
new
;
xfs_rfsblock_t
new
;
xfs_rfsblock_t
nfree
;
xfs_rfsblock_t
nfree
;
...
@@ -183,7 +184,7 @@ xfs_growfs_data_private(
...
@@ -183,7 +184,7 @@ xfs_growfs_data_private(
memset
(
&
mp
->
m_perag
[
oagcount
],
0
,
memset
(
&
mp
->
m_perag
[
oagcount
],
0
,
(
nagcount
-
oagcount
)
*
sizeof
(
xfs_perag_t
));
(
nagcount
-
oagcount
)
*
sizeof
(
xfs_perag_t
));
mp
->
m_flags
|=
XFS_MOUNT_32BITINODES
;
mp
->
m_flags
|=
XFS_MOUNT_32BITINODES
;
xfs_initialize_perag
(
mp
,
nagcount
);
nagimax
=
xfs_initialize_perag
(
mp
,
nagcount
);
up_write
(
&
mp
->
m_peraglock
);
up_write
(
&
mp
->
m_peraglock
);
}
}
tp
=
xfs_trans_alloc
(
mp
,
XFS_TRANS_GROWFS
);
tp
=
xfs_trans_alloc
(
mp
,
XFS_TRANS_GROWFS
);
...
@@ -372,6 +373,9 @@ xfs_growfs_data_private(
...
@@ -372,6 +373,9 @@ xfs_growfs_data_private(
if
(
error
)
{
if
(
error
)
{
return
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
)
{
if
(
mp
->
m_sb
.
sb_imax_pct
)
{
__uint64_t
icount
=
mp
->
m_sb
.
sb_dblocks
*
mp
->
m_sb
.
sb_imax_pct
;
__uint64_t
icount
=
mp
->
m_sb
.
sb_dblocks
*
mp
->
m_sb
.
sb_imax_pct
;
do_div
(
icount
,
100
);
do_div
(
icount
,
100
);
...
...
fs/xfs/xfs_log_recover.c
View file @
2125f957
...
@@ -2047,12 +2047,11 @@ xfs_qm_dqcheck(
...
@@ -2047,12 +2047,11 @@ xfs_qm_dqcheck(
errs
++
;
errs
++
;
}
}
if
(
!
errs
)
{
if
(
!
errs
&&
!
INT_ISZERO
(
ddq
->
d_id
,
ARCH_CONVERT
)
)
{
if
(
INT_GET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
)
&&
if
(
INT_GET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
)
&&
INT_GET
(
ddq
->
d_bcount
,
ARCH_CONVERT
)
>=
INT_GET
(
ddq
->
d_bcount
,
ARCH_CONVERT
)
>=
INT_GET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
))
{
INT_GET
(
ddq
->
d_blk_softlimit
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
ddq
->
d_btimer
,
ARCH_CONVERT
)
&&
if
(
INT_ISZERO
(
ddq
->
d_btimer
,
ARCH_CONVERT
))
{
!
INT_ISZERO
(
ddq
->
d_id
,
ARCH_CONVERT
))
{
if
(
flags
&
XFS_QMOPT_DOWARN
)
if
(
flags
&
XFS_QMOPT_DOWARN
)
cmn_err
(
CE_ALERT
,
cmn_err
(
CE_ALERT
,
"%s : Dquot ID 0x%x (0x%p) "
"%s : Dquot ID 0x%x (0x%p) "
...
@@ -2065,8 +2064,7 @@ xfs_qm_dqcheck(
...
@@ -2065,8 +2064,7 @@ xfs_qm_dqcheck(
if
(
INT_GET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
)
&&
if
(
INT_GET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
)
&&
INT_GET
(
ddq
->
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
ddq
->
d_icount
,
ARCH_CONVERT
)
>=
INT_GET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
))
{
INT_GET
(
ddq
->
d_ino_softlimit
,
ARCH_CONVERT
))
{
if
(
INT_ISZERO
(
ddq
->
d_itimer
,
ARCH_CONVERT
)
&&
if
(
INT_ISZERO
(
ddq
->
d_itimer
,
ARCH_CONVERT
))
{
!
INT_ISZERO
(
ddq
->
d_id
,
ARCH_CONVERT
))
{
if
(
flags
&
XFS_QMOPT_DOWARN
)
if
(
flags
&
XFS_QMOPT_DOWARN
)
cmn_err
(
CE_ALERT
,
cmn_err
(
CE_ALERT
,
"%s : Dquot ID 0x%x (0x%p) "
"%s : Dquot ID 0x%x (0x%p) "
...
@@ -2076,6 +2074,19 @@ xfs_qm_dqcheck(
...
@@ -2076,6 +2074,19 @@ xfs_qm_dqcheck(
errs
++
;
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
))
if
(
!
errs
||
!
(
flags
&
XFS_QMOPT_DQREPAIR
))
...
...
fs/xfs/xfs_mount.c
View file @
2125f957
...
@@ -318,10 +318,10 @@ xfs_mount_validate_sb(
...
@@ -318,10 +318,10 @@ xfs_mount_validate_sb(
return
0
;
return
0
;
}
}
void
xfs_agnumber_t
xfs_initialize_perag
(
xfs_mount_t
*
mp
,
in
t
agcount
)
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_perag_t
*
pag
;
xfs_agino_t
agino
;
xfs_agino_t
agino
;
xfs_ino_t
ino
;
xfs_ino_t
ino
;
...
@@ -377,7 +377,7 @@ xfs_initialize_perag(xfs_mount_t *mp, int agcount)
...
@@ -377,7 +377,7 @@ xfs_initialize_perag(xfs_mount_t *mp, int agcount)
pag
->
pagi_inodeok
=
1
;
pag
->
pagi_inodeok
=
1
;
}
}
}
}
mp
->
m_maxagi
=
index
;
return
index
;
}
}
/*
/*
...
@@ -951,7 +951,7 @@ xfs_mountfs(
...
@@ -951,7 +951,7 @@ xfs_mountfs(
mp
->
m_perag
=
mp
->
m_perag
=
kmem_zalloc
(
sbp
->
sb_agcount
*
sizeof
(
xfs_perag_t
),
KM_SLEEP
);
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
* log's mount-time initialization. Perform 1st part recovery if needed
...
...
fs/xfs/xfs_mount.h
View file @
2125f957
...
@@ -551,7 +551,7 @@ extern int xfs_readsb(xfs_mount_t *mp);
...
@@ -551,7 +551,7 @@ extern int xfs_readsb(xfs_mount_t *mp);
extern
void
xfs_freesb
(
xfs_mount_t
*
);
extern
void
xfs_freesb
(
xfs_mount_t
*
);
extern
void
xfs_do_force_shutdown
(
bhv_desc_t
*
,
int
,
char
*
,
int
);
extern
void
xfs_do_force_shutdown
(
bhv_desc_t
*
,
int
,
char
*
,
int
);
extern
int
xfs_syncsub
(
xfs_mount_t
*
,
int
,
int
,
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
,
extern
void
xfs_xlatesb
(
void
*
,
struct
xfs_sb
*
,
int
,
xfs_arch_t
,
__int64_t
);
__int64_t
);
...
...
fs/xfs/xfs_vnodeops.c
View file @
2125f957
...
@@ -283,7 +283,7 @@ xfs_getattr(
...
@@ -283,7 +283,7 @@ xfs_getattr(
/*
/*
* xfs_setattr
* xfs_setattr
*/
*/
STATIC
int
int
xfs_setattr
(
xfs_setattr
(
bhv_desc_t
*
bdp
,
bhv_desc_t
*
bdp
,
vattr_t
*
vap
,
vattr_t
*
vap
,
...
@@ -305,6 +305,7 @@ xfs_setattr(
...
@@ -305,6 +305,7 @@ xfs_setattr(
int
mandlock_before
,
mandlock_after
;
int
mandlock_before
,
mandlock_after
;
struct
xfs_dquot
*
udqp
,
*
gdqp
,
*
olddquot1
,
*
olddquot2
;
struct
xfs_dquot
*
udqp
,
*
gdqp
,
*
olddquot1
,
*
olddquot2
;
int
file_owner
;
int
file_owner
;
int
need_iolock
=
(
flags
&
ATTR_DMI
)
==
0
;
vp
=
BHV_TO_VNODE
(
bdp
);
vp
=
BHV_TO_VNODE
(
bdp
);
vn_trace_entry
(
vp
,
__FUNCTION__
,
(
inst_t
*
)
__return_address
);
vn_trace_entry
(
vp
,
__FUNCTION__
,
(
inst_t
*
)
__return_address
);
...
@@ -406,7 +407,8 @@ xfs_setattr(
...
@@ -406,7 +407,8 @@ xfs_setattr(
goto
error_return
;
goto
error_return
;
}
}
}
}
lock_flags
|=
XFS_IOLOCK_EXCL
;
if
(
need_iolock
)
lock_flags
|=
XFS_IOLOCK_EXCL
;
}
}
xfs_ilock
(
ip
,
lock_flags
);
xfs_ilock
(
ip
,
lock_flags
);
...
@@ -678,7 +680,8 @@ xfs_setattr(
...
@@ -678,7 +680,8 @@ xfs_setattr(
XFS_TRANS_PERM_LOG_RES
,
XFS_TRANS_PERM_LOG_RES
,
XFS_ITRUNCATE_LOG_COUNT
)))
{
XFS_ITRUNCATE_LOG_COUNT
)))
{
xfs_trans_cancel
(
tp
,
0
);
xfs_trans_cancel
(
tp
,
0
);
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
if
(
need_iolock
)
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
return
code
;
return
code
;
}
}
commit_flags
=
XFS_TRANS_RELEASE_LOG_RES
;
commit_flags
=
XFS_TRANS_RELEASE_LOG_RES
;
...
@@ -4297,6 +4300,7 @@ xfs_free_file_space(
...
@@ -4297,6 +4300,7 @@ xfs_free_file_space(
int
rt
;
int
rt
;
xfs_fileoff_t
startoffset_fsb
;
xfs_fileoff_t
startoffset_fsb
;
xfs_trans_t
*
tp
;
xfs_trans_t
*
tp
;
int
need_iolock
=
(
attr_flags
&
ATTR_DMI
)
==
0
;
vn_trace_entry
(
XFS_ITOV
(
ip
),
__FUNCTION__
,
(
inst_t
*
)
__return_address
);
vn_trace_entry
(
XFS_ITOV
(
ip
),
__FUNCTION__
,
(
inst_t
*
)
__return_address
);
mp
=
ip
->
i_mount
;
mp
=
ip
->
i_mount
;
...
@@ -4324,7 +4328,8 @@ xfs_free_file_space(
...
@@ -4324,7 +4328,8 @@ xfs_free_file_space(
return
(
error
);
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
),
rounding
=
MAX
((
__uint8_t
)(
1
<<
mp
->
m_sb
.
sb_blocklog
),
(
__uint8_t
)
NBPP
);
(
__uint8_t
)
NBPP
);
ilen
=
len
+
(
offset
&
(
rounding
-
1
));
ilen
=
len
+
(
offset
&
(
rounding
-
1
));
...
@@ -4342,10 +4347,8 @@ xfs_free_file_space(
...
@@ -4342,10 +4347,8 @@ xfs_free_file_space(
nimap
=
1
;
nimap
=
1
;
error
=
xfs_bmapi
(
NULL
,
ip
,
startoffset_fsb
,
1
,
0
,
NULL
,
0
,
error
=
xfs_bmapi
(
NULL
,
ip
,
startoffset_fsb
,
1
,
0
,
NULL
,
0
,
&
imap
,
&
nimap
,
NULL
);
&
imap
,
&
nimap
,
NULL
);
if
(
error
)
{
if
(
error
)
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
goto
out_unlock_iolock
;
return
error
;
}
ASSERT
(
nimap
==
0
||
nimap
==
1
);
ASSERT
(
nimap
==
0
||
nimap
==
1
);
if
(
nimap
&&
imap
.
br_startblock
!=
HOLESTARTBLOCK
)
{
if
(
nimap
&&
imap
.
br_startblock
!=
HOLESTARTBLOCK
)
{
xfs_daddr_t
block
;
xfs_daddr_t
block
;
...
@@ -4359,10 +4362,8 @@ xfs_free_file_space(
...
@@ -4359,10 +4362,8 @@ xfs_free_file_space(
nimap
=
1
;
nimap
=
1
;
error
=
xfs_bmapi
(
NULL
,
ip
,
endoffset_fsb
-
1
,
1
,
0
,
NULL
,
0
,
error
=
xfs_bmapi
(
NULL
,
ip
,
endoffset_fsb
-
1
,
1
,
0
,
NULL
,
0
,
&
imap
,
&
nimap
,
NULL
);
&
imap
,
&
nimap
,
NULL
);
if
(
error
)
{
if
(
error
)
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
goto
out_unlock_iolock
;
return
error
;
}
ASSERT
(
nimap
==
0
||
nimap
==
1
);
ASSERT
(
nimap
==
0
||
nimap
==
1
);
if
(
nimap
&&
imap
.
br_startblock
!=
HOLESTARTBLOCK
)
{
if
(
nimap
&&
imap
.
br_startblock
!=
HOLESTARTBLOCK
)
{
ASSERT
(
imap
.
br_startblock
!=
DELAYSTARTBLOCK
);
ASSERT
(
imap
.
br_startblock
!=
DELAYSTARTBLOCK
);
...
@@ -4451,14 +4452,17 @@ xfs_free_file_space(
...
@@ -4451,14 +4452,17 @@ xfs_free_file_space(
xfs_iunlock
(
ip
,
XFS_ILOCK_EXCL
);
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
;
return
error
;
error0:
error0:
xfs_bmap_cancel
(
&
free_list
);
xfs_bmap_cancel
(
&
free_list
);
error1:
error1:
xfs_trans_cancel
(
tp
,
XFS_TRANS_RELEASE_LOG_RES
|
XFS_TRANS_ABORT
);
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
;
return
error
;
}
}
...
@@ -4615,20 +4619,21 @@ xfs_change_file_space(
...
@@ -4615,20 +4619,21 @@ xfs_change_file_space(
xfs_trans_ijoin
(
tp
,
ip
,
XFS_ILOCK_EXCL
);
xfs_trans_ijoin
(
tp
,
ip
,
XFS_ILOCK_EXCL
);
xfs_trans_ihold
(
tp
,
ip
);
xfs_trans_ihold
(
tp
,
ip
);
ip
->
i_d
.
di_mode
&=
~
S_ISUID
;
if
((
attr_flags
&
ATTR_DMI
)
==
0
)
{
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
;
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
)
if
(
setprealloc
)
ip
->
i_d
.
di_flags
|=
XFS_DIFLAG_PREALLOC
;
ip
->
i_d
.
di_flags
|=
XFS_DIFLAG_PREALLOC
;
else
if
(
clrprealloc
)
else
if
(
clrprealloc
)
...
...
mm/filemap.c
View file @
2125f957
...
@@ -277,6 +277,7 @@ int sync_page_range(struct inode *inode, struct address_space *mapping,
...
@@ -277,6 +277,7 @@ int sync_page_range(struct inode *inode, struct address_space *mapping,
ret
=
wait_on_page_writeback_range
(
mapping
,
start
,
end
);
ret
=
wait_on_page_writeback_range
(
mapping
,
start
,
end
);
return
ret
;
return
ret
;
}
}
EXPORT_SYMBOL
(
sync_page_range
);
/**
/**
* filemap_fdatawait - walk the list of under-writeback pages of the given
* 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