diff options
author | Mingming Cao <cmm@us.ibm.com> | 2009-09-28 15:49:52 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2009-09-28 15:49:52 -0400 |
commit | 9f0ccfd8e07d61b413e6536ffa02fbf60d2e20d8 (patch) | |
tree | b90ea9f8dc2542d029b15d94a0588b36937dbbab /fs/ext4/inode.c | |
parent | 55138e0bc29c0751e2152df9ad35deea542f29b3 (diff) |
ext4: release reserved quota when block reservation for delalloc retry
ext4_da_reserve_space() can reserve quota blocks multiple times if
ext4_claim_free_blocks() fail and we retry the allocation. We should
release the quota reservation before restarting.
Bug found by Jan Kara.
Signed-off-by: Mingming Cao <cmm@us.ibm.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 20e2d704dc2e..219067ce09d9 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -1854,11 +1854,11 @@ repeat: | |||
1854 | 1854 | ||
1855 | if (ext4_claim_free_blocks(sbi, total)) { | 1855 | if (ext4_claim_free_blocks(sbi, total)) { |
1856 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 1856 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
1857 | vfs_dq_release_reservation_block(inode, total); | ||
1857 | if (ext4_should_retry_alloc(inode->i_sb, &retries)) { | 1858 | if (ext4_should_retry_alloc(inode->i_sb, &retries)) { |
1858 | yield(); | 1859 | yield(); |
1859 | goto repeat; | 1860 | goto repeat; |
1860 | } | 1861 | } |
1861 | vfs_dq_release_reservation_block(inode, total); | ||
1862 | return -ENOSPC; | 1862 | return -ENOSPC; |
1863 | } | 1863 | } |
1864 | EXT4_I(inode)->i_reserved_data_blocks += nrblocks; | 1864 | EXT4_I(inode)->i_reserved_data_blocks += nrblocks; |