diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2010-02-09 11:53:36 -0500 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2010-03-04 18:20:21 -0500 |
commit | c469070aea5a0ada45a836937c776fd3083dae2b (patch) | |
tree | 8c36117b34aba28a73c2fe4e03c7e89c2f43aef3 /fs/quota/dquot.c | |
parent | c7e8d4d6dceeb6fd236991f590d3fa6f97c59874 (diff) |
quota: manage reserved space when quota is not active [v2]
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>
Diffstat (limited to 'fs/quota/dquot.c')
-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 f6eaf0d8fd6a..f11255b18b58 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -1354,28 +1354,30 @@ static qsize_t *inode_reserved_space(struct inode * inode) | |||
1354 | return inode->i_sb->dq_op->get_reserved_space(inode); | 1354 | return inode->i_sb->dq_op->get_reserved_space(inode); |
1355 | } | 1355 | } |
1356 | 1356 | ||
1357 | static void inode_add_rsv_space(struct inode *inode, qsize_t number) | 1357 | void inode_add_rsv_space(struct inode *inode, qsize_t number) |
1358 | { | 1358 | { |
1359 | spin_lock(&inode->i_lock); | 1359 | spin_lock(&inode->i_lock); |
1360 | *inode_reserved_space(inode) += number; | 1360 | *inode_reserved_space(inode) += number; |
1361 | spin_unlock(&inode->i_lock); | 1361 | spin_unlock(&inode->i_lock); |
1362 | } | 1362 | } |
1363 | EXPORT_SYMBOL(inode_add_rsv_space); | ||
1363 | 1364 | ||
1364 | 1365 | void inode_claim_rsv_space(struct inode *inode, qsize_t number) | |
1365 | static void inode_claim_rsv_space(struct inode *inode, qsize_t number) | ||
1366 | { | 1366 | { |
1367 | spin_lock(&inode->i_lock); | 1367 | spin_lock(&inode->i_lock); |
1368 | *inode_reserved_space(inode) -= number; | 1368 | *inode_reserved_space(inode) -= number; |
1369 | __inode_add_bytes(inode, number); | 1369 | __inode_add_bytes(inode, number); |
1370 | spin_unlock(&inode->i_lock); | 1370 | spin_unlock(&inode->i_lock); |
1371 | } | 1371 | } |
1372 | EXPORT_SYMBOL(inode_claim_rsv_space); | ||
1372 | 1373 | ||
1373 | static void inode_sub_rsv_space(struct inode *inode, qsize_t number) | 1374 | void inode_sub_rsv_space(struct inode *inode, qsize_t number) |
1374 | { | 1375 | { |
1375 | spin_lock(&inode->i_lock); | 1376 | spin_lock(&inode->i_lock); |
1376 | *inode_reserved_space(inode) -= number; | 1377 | *inode_reserved_space(inode) -= number; |
1377 | spin_unlock(&inode->i_lock); | 1378 | spin_unlock(&inode->i_lock); |
1378 | } | 1379 | } |
1380 | EXPORT_SYMBOL(inode_sub_rsv_space); | ||
1379 | 1381 | ||
1380 | static qsize_t inode_get_rsv_space(struct inode *inode) | 1382 | static qsize_t inode_get_rsv_space(struct inode *inode) |
1381 | { | 1383 | { |