From: Greg Kroah-Hartman Date: Mon, 6 Aug 2012 21:44:57 +0000 (-0700) Subject: 3.0-stable patches X-Git-Tag: v3.5.1~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d0c4ef45441e5cb1a113021454e3bfcb61325909;p=thirdparty%2Fkernel%2Fstable-queue.git 3.0-stable patches added patches: ext4-don-t-let-i_reserved_meta_blocks-go-negative.patch --- diff --git a/queue-3.0/ext4-don-t-let-i_reserved_meta_blocks-go-negative.patch b/queue-3.0/ext4-don-t-let-i_reserved_meta_blocks-go-negative.patch new file mode 100644 index 00000000000..e06f07c0945 --- /dev/null +++ b/queue-3.0/ext4-don-t-let-i_reserved_meta_blocks-go-negative.patch @@ -0,0 +1,53 @@ +From 97795d2a5b8d3c8dc4365d4bd3404191840453ba Mon Sep 17 00:00:00 2001 +From: Brian Foster +Date: Sun, 22 Jul 2012 23:59:40 -0400 +Subject: ext4: don't let i_reserved_meta_blocks go negative + +From: Brian Foster + +commit 97795d2a5b8d3c8dc4365d4bd3404191840453ba upstream. + +If we hit a condition where we have allocated metadata blocks that +were not appropriately reserved, we risk underflow of +ei->i_reserved_meta_blocks. In turn, this can throw +sbi->s_dirtyclusters_counter significantly out of whack and undermine +the nondelalloc fallback logic in ext4_nonda_switch(). Warn if this +occurs and set i_allocated_meta_blocks to avoid this problem. + +This condition is reproduced by xfstests 270 against ext2 with +delalloc enabled: + +Mar 28 08:58:02 localhost kernel: [ 171.526344] EXT4-fs (loop1): delayed block allocation failed for inode 14 at logical offset 64486 with max blocks 64 with error -28 +Mar 28 08:58:02 localhost kernel: [ 171.526346] EXT4-fs (loop1): This should not happen!! Data will be lost + +270 ultimately fails with an inconsistent filesystem and requires an +fsck to repair. The cause of the error is an underflow in +ext4_da_update_reserve_space() due to an unreserved meta block +allocation. + +Signed-off-by: Brian Foster +Signed-off-by: "Theodore Ts'o" +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ext4/inode.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -1134,6 +1134,15 @@ void ext4_da_update_reserve_space(struct + used = ei->i_reserved_data_blocks; + } + ++ if (unlikely(ei->i_allocated_meta_blocks > ei->i_reserved_meta_blocks)) { ++ ext4_msg(inode->i_sb, KERN_NOTICE, "%s: ino %lu, allocated %d " ++ "with only %d reserved metadata blocks\n", __func__, ++ inode->i_ino, ei->i_allocated_meta_blocks, ++ ei->i_reserved_meta_blocks); ++ WARN_ON(1); ++ ei->i_allocated_meta_blocks = ei->i_reserved_meta_blocks; ++ } ++ + /* Update per-inode reservations */ + ei->i_reserved_data_blocks -= used; + ei->i_reserved_meta_blocks -= ei->i_allocated_meta_blocks; diff --git a/queue-3.0/series b/queue-3.0/series index 974c1dc9b24..e0a95d53309 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -24,3 +24,4 @@ drm-radeon-on-hotplug-force-link-training-to-happen-v2.patch nfsd4-our-filesystems-are-normally-case-sensitive.patch nfs-skip-commit-in-releasepage-if-we-re-freeing-memory-for-fs-related-reasons.patch ext4-pass-a-char-to-ext4_count_free-instead-of-a-buffer_head-ptr.patch +ext4-don-t-let-i_reserved_meta_blocks-go-negative.patch