--- /dev/null
+From 6f2e9f0e7d795214b9cf5a47724a273b705fd113 Mon Sep 17 00:00:00 2001
+From: Tao Ma <boyu.mt@taobao.com>
+Date: Mon, 28 May 2012 18:20:59 -0400
+Subject: ext4: protect group inode free counting with group lock
+
+From: Tao Ma <boyu.mt@taobao.com>
+
+commit 6f2e9f0e7d795214b9cf5a47724a273b705fd113 upstream.
+
+Now when we set the group inode free count, we don't have a proper
+group lock so that multiple threads may decrease the inode free
+count at the same time. And e2fsck will complain something like:
+
+Free inodes count wrong for group #1 (1, counted=0).
+Fix? no
+
+Free inodes count wrong for group #2 (3, counted=0).
+Fix? no
+
+Directories count wrong for group #2 (780, counted=779).
+Fix? no
+
+Free inodes count wrong for group #3 (2272, counted=2273).
+Fix? no
+
+So this patch try to protect it with the ext4_lock_group.
+
+btw, it is found by xfstests test case 269 and the volume is
+mkfsed with the parameter
+"-O ^resize_inode,^uninit_bg,extent,meta_bg,flex_bg,ext_attr"
+and I have run it 100 times and the error in e2fsck doesn't
+show up again.
+
+Signed-off-by: Tao Ma <boyu.mt@taobao.com>
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+Signed-off-by: Benjamin LaHaise <bcrl@kvack.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+
+---
+ fs/ext4/ialloc.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/fs/ext4/ialloc.c
++++ b/fs/ext4/ialloc.c
+@@ -778,6 +778,8 @@ got:
+ ext4_itable_unused_set(sb, gdp,
+ (EXT4_INODES_PER_GROUP(sb) - ino));
+ up_read(&grp->alloc_sem);
++ } else {
++ ext4_lock_group(sb, group);
+ }
+ ext4_free_inodes_set(sb, gdp, ext4_free_inodes_count(sb, gdp) - 1);
+ if (S_ISDIR(mode)) {
+@@ -790,8 +792,8 @@ got:
+ }
+ if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+ gdp->bg_checksum = ext4_group_desc_csum(sbi, group, gdp);
+- ext4_unlock_group(sb, group);
+ }
++ ext4_unlock_group(sb, group);
+
+ BUFFER_TRACE(group_desc_bh, "call ext4_handle_dirty_metadata");
+ err = ext4_handle_dirty_metadata(handle, NULL, group_desc_bh);
--- /dev/null
+From 85eae82a0855d49852b87deac8653e4ebc8b291f Mon Sep 17 00:00:00 2001
+From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
+Date: Mon, 15 Oct 2012 21:35:59 -0700
+Subject: printk: Fix scheduling-while-atomic problem in console_cpu_notify()
+
+From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
+
+commit 85eae82a0855d49852b87deac8653e4ebc8b291f upstream.
+
+The console_cpu_notify() function runs with interrupts disabled in the
+CPU_DYING case. It therefore cannot block, for example, as will happen
+when it calls console_lock(). Therefore, remove the CPU_DYING leg of
+the switch statement to avoid this problem.
+
+Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
+Reviewed-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Guillaume Morin <guillaume@morinfr.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ kernel/printk.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -1172,7 +1172,6 @@ static int __cpuinit console_cpu_notify(
+ switch (action) {
+ case CPU_ONLINE:
+ case CPU_DEAD:
+- case CPU_DYING:
+ case CPU_DOWN_FAILED:
+ case CPU_UP_CANCELED:
+ console_lock();