diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2010-04-08 14:04:20 -0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2010-05-21 13:30:45 -0400 |
commit | 12755627bdcddcdb30a1bfb9a09395a52b1d6838 (patch) | |
tree | b2d69696975d5457648020324f683a45302fbf3c | |
parent | fcbc59f96e38a0999e827be9d04d46b62b53b20a (diff) |
quota: unify quota init condition in setattr
Quota must being initialized if size or uid/git changes requested.
But initialization performed in two different places:
in case of i_size file system is responsible for dquot init
, but in case of uid/gid init will be called internally in
dquot_transfer().
This ambiguity makes code harder to understand.
Let's move this logic to one common helper function.
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | fs/ext2/inode.c | 2 | ||||
-rw-r--r-- | fs/ext3/inode.c | 2 | ||||
-rw-r--r-- | fs/ext4/inode.c | 2 | ||||
-rw-r--r-- | fs/jfs/file.c | 2 | ||||
-rw-r--r-- | fs/ocfs2/file.c | 4 | ||||
-rw-r--r-- | fs/quota/dquot.c | 5 | ||||
-rw-r--r-- | fs/reiserfs/inode.c | 3 | ||||
-rw-r--r-- | fs/udf/file.c | 2 | ||||
-rw-r--r-- | fs/ufs/truncate.c | 8 | ||||
-rw-r--r-- | include/linux/quotaops.h | 8 |
10 files changed, 23 insertions, 15 deletions
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index b90c3bf6e9ba..527c46d9bc1f 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -1466,7 +1466,7 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr) | |||
1466 | if (error) | 1466 | if (error) |
1467 | return error; | 1467 | return error; |
1468 | 1468 | ||
1469 | if (iattr->ia_valid & ATTR_SIZE) | 1469 | if (is_quota_modification(inode, iattr)) |
1470 | dquot_initialize(inode); | 1470 | dquot_initialize(inode); |
1471 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || | 1471 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || |
1472 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { | 1472 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { |
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index ea33bdf0a300..735f0190ec2a 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
@@ -3151,7 +3151,7 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr) | |||
3151 | if (error) | 3151 | if (error) |
3152 | return error; | 3152 | return error; |
3153 | 3153 | ||
3154 | if (ia_valid & ATTR_SIZE) | 3154 | if (is_quota_modification(inode, attr)) |
3155 | dquot_initialize(inode); | 3155 | dquot_initialize(inode); |
3156 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || | 3156 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || |
3157 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { | 3157 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 81d605412844..3e0f6af9d08d 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -5425,7 +5425,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) | |||
5425 | if (error) | 5425 | if (error) |
5426 | return error; | 5426 | return error; |
5427 | 5427 | ||
5428 | if (ia_valid & ATTR_SIZE) | 5428 | if (is_quota_modification(inode, attr)) |
5429 | dquot_initialize(inode); | 5429 | dquot_initialize(inode); |
5430 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || | 5430 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || |
5431 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { | 5431 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { |
diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 14ba982b3f24..85d9ec659225 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c | |||
@@ -98,7 +98,7 @@ int jfs_setattr(struct dentry *dentry, struct iattr *iattr) | |||
98 | if (rc) | 98 | if (rc) |
99 | return rc; | 99 | return rc; |
100 | 100 | ||
101 | if (iattr->ia_valid & ATTR_SIZE) | 101 | if (is_quota_modification(inode, iattr)) |
102 | dquot_initialize(inode); | 102 | dquot_initialize(inode); |
103 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || | 103 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || |
104 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { | 104 | (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) { |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index f74f1400eccd..e127c53ec2e7 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -966,10 +966,10 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) | |||
966 | if (status) | 966 | if (status) |
967 | return status; | 967 | return status; |
968 | 968 | ||
969 | if (is_quota_modification(inode, attr)) | ||
970 | dquot_initialize(inode); | ||
969 | size_change = S_ISREG(inode->i_mode) && attr->ia_valid & ATTR_SIZE; | 971 | size_change = S_ISREG(inode->i_mode) && attr->ia_valid & ATTR_SIZE; |
970 | if (size_change) { | 972 | if (size_change) { |
971 | dquot_initialize(inode); | ||
972 | |||
973 | status = ocfs2_rw_lock(inode, 1); | 973 | status = ocfs2_rw_lock(inode, 1); |
974 | if (status < 0) { | 974 | if (status < 0) { |
975 | mlog_errno(status); | 975 | mlog_errno(status); |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index b1a5036560a9..1056a21f0300 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -1822,10 +1822,9 @@ int dquot_transfer(struct inode *inode, struct iattr *iattr) | |||
1822 | mask |= 1 << GRPQUOTA; | 1822 | mask |= 1 << GRPQUOTA; |
1823 | chid[GRPQUOTA] = iattr->ia_gid; | 1823 | chid[GRPQUOTA] = iattr->ia_gid; |
1824 | } | 1824 | } |
1825 | if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode)) { | 1825 | if (sb_any_quota_active(inode->i_sb) && !IS_NOQUOTA(inode)) |
1826 | dquot_initialize(inode); | ||
1827 | return __dquot_transfer(inode, chid, mask); | 1826 | return __dquot_transfer(inode, chid, mask); |
1828 | } | 1827 | |
1829 | return 0; | 1828 | return 0; |
1830 | } | 1829 | } |
1831 | EXPORT_SYMBOL(dquot_transfer); | 1830 | EXPORT_SYMBOL(dquot_transfer); |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index dc2c65e04853..0f22fdaf54ac 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -3076,9 +3076,10 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3076 | ia_valid = attr->ia_valid &= ~(ATTR_KILL_SUID|ATTR_KILL_SGID); | 3076 | ia_valid = attr->ia_valid &= ~(ATTR_KILL_SUID|ATTR_KILL_SGID); |
3077 | 3077 | ||
3078 | depth = reiserfs_write_lock_once(inode->i_sb); | 3078 | depth = reiserfs_write_lock_once(inode->i_sb); |
3079 | if (attr->ia_valid & ATTR_SIZE) { | 3079 | if (is_quota_modification(inode, attr)) |
3080 | dquot_initialize(inode); | 3080 | dquot_initialize(inode); |
3081 | 3081 | ||
3082 | if (attr->ia_valid & ATTR_SIZE) { | ||
3082 | /* version 2 items will be caught by the s_maxbytes check | 3083 | /* version 2 items will be caught by the s_maxbytes check |
3083 | ** done for us in vmtruncate | 3084 | ** done for us in vmtruncate |
3084 | */ | 3085 | */ |
diff --git a/fs/udf/file.c b/fs/udf/file.c index 4b6a46ccbf46..6ebc043f3a2a 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
@@ -227,7 +227,7 @@ int udf_setattr(struct dentry *dentry, struct iattr *iattr) | |||
227 | if (error) | 227 | if (error) |
228 | return error; | 228 | return error; |
229 | 229 | ||
230 | if (iattr->ia_valid & ATTR_SIZE) | 230 | if (is_quota_modification(inode, iattr)) |
231 | dquot_initialize(inode); | 231 | dquot_initialize(inode); |
232 | 232 | ||
233 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || | 233 | if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) || |
diff --git a/fs/ufs/truncate.c b/fs/ufs/truncate.c index ee8db3e77bfe..f294c44577dc 100644 --- a/fs/ufs/truncate.c +++ b/fs/ufs/truncate.c | |||
@@ -518,18 +518,18 @@ int ufs_setattr(struct dentry *dentry, struct iattr *attr) | |||
518 | if (error) | 518 | if (error) |
519 | return error; | 519 | return error; |
520 | 520 | ||
521 | if (is_quota_modification(inode, attr)) | ||
522 | dquot_initialize(inode); | ||
523 | |||
521 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || | 524 | if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) || |
522 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { | 525 | (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) { |
523 | error = dquot_transfer(inode, attr); | 526 | error = dquot_transfer(inode, attr); |
524 | if (error) | 527 | if (error) |
525 | return error; | 528 | return error; |
526 | } | 529 | } |
527 | if (ia_valid & ATTR_SIZE && | 530 | if (ia_valid & ATTR_SIZE && attr->ia_size != inode->i_size) { |
528 | attr->ia_size != i_size_read(inode)) { | ||
529 | loff_t old_i_size = inode->i_size; | 531 | loff_t old_i_size = inode->i_size; |
530 | 532 | ||
531 | dquot_initialize(inode); | ||
532 | |||
533 | error = vmtruncate(inode, attr->ia_size); | 533 | error = vmtruncate(inode, attr->ia_size); |
534 | if (error) | 534 | if (error) |
535 | return error; | 535 | return error; |
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 82c70c42d035..8a7818764a67 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h | |||
@@ -14,6 +14,14 @@ static inline struct quota_info *sb_dqopt(struct super_block *sb) | |||
14 | return &sb->s_dquot; | 14 | return &sb->s_dquot; |
15 | } | 15 | } |
16 | 16 | ||
17 | /* i_mutex must being held */ | ||
18 | static inline bool is_quota_modification(struct inode *inode, struct iattr *ia) | ||
19 | { | ||
20 | return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) || | ||
21 | (ia->ia_valid & ATTR_UID && ia->ia_uid != inode->i_uid) || | ||
22 | (ia->ia_valid & ATTR_GID && ia->ia_gid != inode->i_gid); | ||
23 | } | ||
24 | |||
17 | #if defined(CONFIG_QUOTA) | 25 | #if defined(CONFIG_QUOTA) |
18 | 26 | ||
19 | /* | 27 | /* |