> > 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 (agains 2.6.11-rc2), comments? Yes, the patch looks right. Please apply it, Andrew. BTW ext2 needs a similar fix - will submit in the next mail.
Honza > --- ./fs/ext3/xattr.c.orig 2005-01-22 15:07:50 +0100 > +++ ./fs/ext3/xattr.c 2005-01-22 16:45:09 +0100 > @@ -773,7 +773,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)); > @@ -783,7 +783,7 @@ inserted: > error = ext3_journal_dirty_metadata(handle, > new_bh); > if (error) > - goto cleanup; > + goto cleanup_dquot; > } > mb_cache_entry_release(ce); > ce = NULL; > @@ -844,6 +844,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, > -- Jan Kara <[EMAIL PROTECTED]> SuSE CR Labs - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/