> 
> 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/

Reply via email to