diff options
author | Herbert Pƶtzl <herbert@13thfloor.at> | 2005-01-25 18:43:01 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-25 18:43:01 -0800 |
commit | c4eadeb71803d271a4b1c09f976824190e4f1f60 (patch) | |
tree | 32ca3943fe573b1adcfcdf97721ceed542ab0cbb /fs/ext3/xattr.c | |
parent | 9a6008b6b8e208abbbc4abf5a02672cfcefdf7a3 (diff) | |
download | history-c4eadeb71803d271a4b1c09f976824190e4f1f60.tar.gz |
[PATCH] fix ext3 quota allocation bug on error path ...
looking at ext3_xattr_block_set() [fs/ext3/xattr.c] ...
I see that
error = -EDQUOT;
if (DQUOT_ALLOC_BLOCK(inode, 1))
goto cleanup;
allocates a quota block, but right after that several
error echecks happen ...
if (error)
goto cleanup;
and I don't see any DQUOT_FREE_BLOCK() in the errorpath
cleanup:
if (ce)
mb_cache_entry_release(ce);
brelse(new_bh);
if (!(bs->bh && s->base == bs->bh->b_data))
kfree(s->base);
return error;
I'd suggest the attached fix.
Acked-by: Jan Kara <jack@suse.cz>
Acked-by: Andreas Gruenbacher <agruen@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/ext3/xattr.c')
-rw-r--r-- | fs/ext3/xattr.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c index 5e08c0940d60f8..26c6ad693474d6 100644 --- a/fs/ext3/xattr.c +++ b/fs/ext3/xattr.c @@ -771,7 +771,7 @@ inserted: error = ext3_journal_get_write_access(handle, new_bh); if (error) - goto cleanup; + goto cleanup_dquot; lock_buffer(new_bh); BHDR(new_bh)->h_refcount = cpu_to_le32(1 + le32_to_cpu(BHDR(new_bh)->h_refcount)); @@ -781,7 +781,7 @@ inserted: error = ext3_journal_dirty_metadata(handle, new_bh); if (error) - goto cleanup; + goto cleanup_dquot; } mb_cache_entry_release(ce); ce = NULL; @@ -841,6 +841,10 @@ cleanup: return error; +cleanup_dquot: + DQUOT_FREE_BLOCK(inode, 1); + goto cleanup; + bad_block: ext3_error(inode->i_sb, __FUNCTION__, "inode %ld: bad block %d", inode->i_ino, |