]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.6-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 14 Aug 2016 19:47:43 +0000 (21:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 14 Aug 2016 19:47:43 +0000 (21:47 +0200)
added patches:
ext4-fix-reference-counting-bug-on-block-allocation-error.patch

queue-4.6/ext4-fix-reference-counting-bug-on-block-allocation-error.patch [new file with mode: 0644]
queue-4.6/series

diff --git a/queue-4.6/ext4-fix-reference-counting-bug-on-block-allocation-error.patch b/queue-4.6/ext4-fix-reference-counting-bug-on-block-allocation-error.patch
new file mode 100644 (file)
index 0000000..dc9a56b
--- /dev/null
@@ -0,0 +1,74 @@
+From 554a5ccc4e4a20c5f3ec859de0842db4b4b9c77e Mon Sep 17 00:00:00 2001
+From: Vegard Nossum <vegard.nossum@oracle.com>
+Date: Thu, 14 Jul 2016 23:02:47 -0400
+Subject: ext4: fix reference counting bug on block allocation error
+
+From: Vegard Nossum <vegard.nossum@oracle.com>
+
+commit 554a5ccc4e4a20c5f3ec859de0842db4b4b9c77e upstream.
+
+If we hit this error when mounted with errors=continue or
+errors=remount-ro:
+
+    EXT4-fs error (device loop0): ext4_mb_mark_diskspace_used:2940: comm ext4.exe: Allocating blocks 5090-6081 which overlap fs metadata
+
+then ext4_mb_new_blocks() will call ext4_mb_release_context() and try to
+continue. However, ext4_mb_release_context() is the wrong thing to call
+here since we are still actually using the allocation context.
+
+Instead, just error out. We could retry the allocation, but there is a
+possibility of getting stuck in an infinite loop instead, so this seems
+safer.
+
+[ Fixed up so we don't return EAGAIN to userspace. --tytso ]
+
+Fixes: 8556e8f3b6 ("ext4: Don't allow new groups to be added during block allocation")
+Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ext4/mballoc.c |   17 +++--------------
+ 1 file changed, 3 insertions(+), 14 deletions(-)
+
+--- a/fs/ext4/mballoc.c
++++ b/fs/ext4/mballoc.c
+@@ -2939,7 +2939,7 @@ ext4_mb_mark_diskspace_used(struct ext4_
+               ext4_error(sb, "Allocating blocks %llu-%llu which overlap "
+                          "fs metadata", block, block+len);
+               /* File system mounted not to panic on error
+-               * Fix the bitmap and repeat the block allocation
++               * Fix the bitmap and return EFSCORRUPTED
+                * We leak some of the blocks here.
+                */
+               ext4_lock_group(sb, ac->ac_b_ex.fe_group);
+@@ -2948,7 +2948,7 @@ ext4_mb_mark_diskspace_used(struct ext4_
+               ext4_unlock_group(sb, ac->ac_b_ex.fe_group);
+               err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh);
+               if (!err)
+-                      err = -EAGAIN;
++                      err = -EFSCORRUPTED;
+               goto out_err;
+       }
+@@ -4513,18 +4513,7 @@ repeat:
+       }
+       if (likely(ac->ac_status == AC_STATUS_FOUND)) {
+               *errp = ext4_mb_mark_diskspace_used(ac, handle, reserv_clstrs);
+-              if (*errp == -EAGAIN) {
+-                      /*
+-                       * drop the reference that we took
+-                       * in ext4_mb_use_best_found
+-                       */
+-                      ext4_mb_release_context(ac);
+-                      ac->ac_b_ex.fe_group = 0;
+-                      ac->ac_b_ex.fe_start = 0;
+-                      ac->ac_b_ex.fe_len = 0;
+-                      ac->ac_status = AC_STATUS_CONTINUE;
+-                      goto repeat;
+-              } else if (*errp) {
++              if (*errp) {
+                       ext4_discard_allocated_blocks(ac);
+                       goto errout;
+               } else {
index c23e64f14f2640e75b89d8e13ea15166139da0a1..95a1bb6bd19bccfac9532f3c570b82094ee3cd93 100644 (file)
@@ -53,3 +53,4 @@ ext4-fix-deadlock-during-page-writeback.patch
 ext4-don-t-call-ext4_should_journal_data-on-the-journal-inode.patch
 ext4-validate-s_reserved_gdt_blocks-on-mount.patch
 ext4-short-cut-orphan-cleanup-on-error.patch
+ext4-fix-reference-counting-bug-on-block-allocation-error.patch