Whamcloud - gitweb
LU-8685 kernel: jbd2: fix incorrect unlock on j_list_lock 50/23050/2
authorBruno Faccini <bruno.faccini@intel.com>
Mon, 10 Oct 2016 13:10:47 +0000 (15:10 +0200)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 25 Oct 2016 02:24:02 +0000 (02:24 +0000)
This patch has been back-ported to avoid kernel Oopses/BUG()s
due to j_list_lock found unlocked when expected to be locked!

In jbd2_journal_get_create_access(),
when 'jh->b_transaction == transaction' (asserted by below)

  J_ASSERT_JH(jh, (jh->b_transaction == transaction || ...

'journal->j_list_lock' will be incorrectly unlocked, since
the the lock is aquired only at the end of if / else-if
statements (missing the else case).

This bug has been introduced by an earlier change named
"jbd2: minimize region locked by j_list_lock in
journal_get_create_access()".

Signed-off-by: Taesoo Kim <tsgatesv@gmail.com>
Signed-off-by: Bruno Faccini <bruno.faccini@intel.com>
Change-Id: Ifb8b038333e523caa1b274f53f49317182895de5
Reviewed-on: http://review.whamcloud.com/23050
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Bob Glossman <bob.glossman@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Niu Yawei <yawei.niu@intel.com>
Reviewed-by: Wang Shilong <wshilong@ddn.com>
lustre/kernel_patches/patches/jbd2-fix-j_list_lock-unlock-3.10-rhel7.patch [new file with mode: 0644]
lustre/kernel_patches/series/3.10-rhel7.series

diff --git a/lustre/kernel_patches/patches/jbd2-fix-j_list_lock-unlock-3.10-rhel7.patch b/lustre/kernel_patches/patches/jbd2-fix-j_list_lock-unlock-3.10-rhel7.patch
new file mode 100644 (file)
index 0000000..8a0a422
--- /dev/null
@@ -0,0 +1,37 @@
+jbd2: fix incorrect unlock on j_list_lock
+
+When 'jh->b_transaction == transaction' (asserted by below)
+
+  J_ASSERT_JH(jh, (jh->b_transaction == transaction || ...
+
+'journal->j_list_lock' will be incorrectly unlocked, since
+the the lock is aquired only at the end of if / else-if
+statements (missing the else case).
+
+This bug has been introduced by an earlier change named
+"jbd2: minimize region locked by j_list_lock in journal_get_create_access()".
+
+Signed-off-by: Taesoo Kim <tsgatesv@gmail.com>
+
+Index: linux-3.10.0-327.36.1.el7/fs/jbd2/transaction.c
+===================================================================
+--- linux-3.10.0-327.36.1.el7.orig/fs/jbd2/transaction.c
++++ linux-3.10.0-327.36.1.el7/fs/jbd2/transaction.c
+@@ -1091,6 +1091,7 @@
+               JBUFFER_TRACE(jh, "file as BJ_Reserved");
+               spin_lock(&journal->j_list_lock);
+               __jbd2_journal_file_buffer(jh, transaction, BJ_Reserved);
++              spin_unlock(&journal->j_list_lock);
+       } else if (jh->b_transaction == journal->j_committing_transaction) {
+               /* first access by this transaction */
+               jh->b_modified = 0;
+@@ -1098,8 +1099,8 @@
+               JBUFFER_TRACE(jh, "set next transaction");
+               spin_lock(&journal->j_list_lock);
+               jh->b_next_transaction = transaction;
++              spin_unlock(&journal->j_list_lock);
+       }
+-      spin_unlock(&journal->j_list_lock);
+       jbd_unlock_bh_state(bh);
+       /*
index 20f9b3a..f0a840d 100644 (file)
@@ -1,3 +1,5 @@
 raid5-mmp-unplug-dev-3.7.patch
 dev_read_only-3.7.patch
 blkdev_tunables-3.7.patch
+jbd2-fix-j_list_lock-unlock-3.10-rhel7.patch
+