diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2010-02-09 11:53:36 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-04-01 19:02:12 -0400 |
commit | 1f371c1a285e3dab9c6951cb9f4410c17bcb6ba1 (patch) | |
tree | 78fadda328734944ec9bbc26abca14b948c9bdc1 /fs/quota | |
parent | e3f1272e2083ee9cf0a21a405ff24b95c2423a97 (diff) |
quota: manage reserved space when quota is not active [v2]
commit c469070aea5a0ada45a836937c776fd3083dae2b upstream.
Since we implemented generic reserved space management interface,
then it is possible to account reserved space even when quota
is not active (similar to i_blocks/i_bytes).
Without this patch following testcase result in massive comlain from
WARN_ON in dquot_claim_space()
TEST_CASE:
mount /dev/sdb /mnt -oquota
dd if=/dev/zero of=/mnt/test bs=1M count=1
quotaon /mnt
# fs_reserved_spave == 1Mb
# quota_reserved_space == 0, because quota was disabled
dd if=/dev/zero of=/mnt/test seek=1 bs=1M count=1
# fs_reserved_spave == 2Mb
# quota_reserved_space == 1Mb
sync # ->dquot_claim_space() -> WARN_ON
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'fs/quota')
-rw-r--r-- | fs/quota/dquot.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 3fc62b097bed..7b980954993b 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -1351,28 +1351,30 @@ static qsize_t *inode_reserved_space(struct inode * inode) | |||
1351 | return inode->i_sb->dq_op->get_reserved_space(inode); | 1351 | return inode->i_sb->dq_op->get_reserved_space(inode); |
1352 | } | 1352 | } |
1353 | 1353 | ||
1354 | static void inode_add_rsv_space(struct inode *inode, qsize_t number) | 1354 | void inode_add_rsv_space(struct inode *inode, qsize_t number) |
1355 | { | 1355 | { |
1356 | spin_lock(&inode->i_lock); | 1356 | spin_lock(&inode->i_lock); |
1357 | *inode_reserved_space(inode) += number; | 1357 | *inode_reserved_space(inode) += number; |
1358 | spin_unlock(&inode->i_lock); | 1358 | spin_unlock(&inode->i_lock); |
1359 | } | 1359 | } |
1360 | EXPORT_SYMBOL(inode_add_rsv_space); | ||
1360 | 1361 | ||
1361 | 1362 | void inode_claim_rsv_space(struct inode *inode, qsize_t number) | |
1362 | static void inode_claim_rsv_space(struct inode *inode, qsize_t number) | ||
1363 | { | 1363 | { |
1364 | spin_lock(&inode->i_lock); | 1364 | spin_lock(&inode->i_lock); |
1365 | *inode_reserved_space(inode) -= number; | 1365 | *inode_reserved_space(inode) -= number; |
1366 | __inode_add_bytes(inode, number); | 1366 | __inode_add_bytes(inode, number); |
1367 | spin_unlock(&inode->i_lock); | 1367 | spin_unlock(&inode->i_lock); |
1368 | } | 1368 | } |
1369 | EXPORT_SYMBOL(inode_claim_rsv_space); | ||
1369 | 1370 | ||
1370 | static void inode_sub_rsv_space(struct inode *inode, qsize_t number) | 1371 | void inode_sub_rsv_space(struct inode *inode, qsize_t number) |
1371 | { | 1372 | { |
1372 | spin_lock(&inode->i_lock); | 1373 | spin_lock(&inode->i_lock); |
1373 | *inode_reserved_space(inode) -= number; | 1374 | *inode_reserved_space(inode) -= number; |
1374 | spin_unlock(&inode->i_lock); | 1375 | spin_unlock(&inode->i_lock); |
1375 | } | 1376 | } |
1377 | EXPORT_SYMBOL(inode_sub_rsv_space); | ||
1376 | 1378 | ||
1377 | static qsize_t inode_get_rsv_space(struct inode *inode) | 1379 | static qsize_t inode_get_rsv_space(struct inode *inode) |
1378 | { | 1380 | { |