Applied to the ext4 tree, with the following changes: 1) I made the one-line summary clearer: ext4: fix i_blocks/quota accounting when extent insertion fails 2) I used the flag name EXT4_FREE_BLOCKS_NO_QUOT_UPDATE which was clearer than "..._SKIP_QUPD". Apologies for the delay in getting back to you, and thanks for the patch. - Ted On Fri, Jun 10, 2011 at 02:17:30PM +0400, Maxim Patlasov wrote: > I apologise for flooding, patch description in former email was for > slightly different kernel version. Correct description is below: > > Existent implementation of ext4_free_blocks() always calls dquot_free_block > This looks quite sensible in the most cases: blocks to be freed are associated > with inode and were accounted in quota and i_blocks some time ago. > > However, there is a case when blocks to free were not accounted by the time > calling ext4_free_blocks() yet: > > 1. delalloc is on, write_begin pre-allocated some space in quota > 2. write-back happens, ext4 allocates some blocks in ext4_ext_map_blocks() > 3. then ext4_ext_map_blocks() gets an error (e.g. ENOSPC) from > ext4_ext_insert_extent() and calls ext4_free_blocks(). > > In this scenario, ext4_free_blocks() calls dquot_free_block() who, in turn, > decrements i_blocks for blocks which were not accounted yet (due to delalloc) > After clean umount, e2fsck reports something like: > > > Inode 21, i_blocks is 5080, should be 5128. Fix<y>? > because i_blocks was erroneously decremented as explained above. > > The patch fixes the problem by passing EXT4_FREE_BLOCKS_SKIP_QUPD flag to > ext4_free_blocks(). This flag forces ext4_free_blocks() to skip > dquot_free_block() call. > > Signed-off-by: Maxim Patlasov <maxim.patlasov@xxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html