--- /dev/null
+commit 229309caebe4508d650bb6d8f7d51f2b116f5bbd
+Author: Jan Kara <jack@suse.cz>
+Date: Sun May 8 19:09:53 2011 -0400
+
+jbd2: Fix forever sleeping process in do_get_write_access()
+
+In do_get_write_access() we wait on BH_Unshadow bit for buffer to get
+from shadow state. The waking code in journal_commit_transaction() has
+a bug because it does not issue a memory barrier after the buffer is
+moved from the shadow state and before wake_up_bit() is called. Thus a
+waitqueue check can happen before the buffer is actually moved from
+the shadow state and waiting process may never be woken. Fix the
+problem by issuing proper barrier.
+
+Reported-by: Tao Ma <boyu.mt@taobao.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
+---
+ fs/jbd2/commit.c | 9 +++++++--
+ 1 files changed, 7 insertions(+), 2 deletions(-)
+
+Index: linux-2.6.18.4/fs/jbd2/commit.c
+===================================================================
+--- linux-2.6.18.4.orig/fs/jbd2/commit.c
++++ linux-2.6.18.4/fs/jbd2/commit.c
+@@ -788,8 +788,13 @@ wait_for_iobuf:
+ required. */
+ JBUFFER_TRACE(jh, "file as BJ_Forget");
+ jbd2_journal_file_buffer(jh, commit_transaction, BJ_Forget);
+- /* Wake up any transactions which were waiting for this
+- IO to complete */
++ /*
++ * Wake up any transactions which were waiting for this IO to
++ * complete. The barrier must be here so that changes by
++ * jbd2_journal_file_buffer() take effect before wake_up_bit()
++ * does the waitqueue check.
++ */
++ smp_mb();
+ wake_up_bit(&bh->b_state, BH_Unshadow);
+ JBUFFER_TRACE(jh, "brelse shadowed buffer");
+ __brelse(bh);