From 77e28905d9bc508b668f0db701f7df55ff97a3d1 Mon Sep 17 00:00:00 2001 From: Bruno Faccini Date: Mon, 10 Oct 2016 15:10:47 +0200 Subject: [PATCH] LU-8685 kernel: jbd2: fix incorrect unlock on j_list_lock 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 Signed-off-by: Bruno Faccini Change-Id: Ifb8b038333e523caa1b274f53f49317182895de5 Reviewed-on: http://review.whamcloud.com/23050 Tested-by: Jenkins Reviewed-by: Andreas Dilger Reviewed-by: Bob Glossman Tested-by: Maloo Reviewed-by: Niu Yawei Reviewed-by: Wang Shilong --- .../jbd2-fix-j_list_lock-unlock-3.10-rhel7.patch | 37 ++++++++++++++++++++++ lustre/kernel_patches/series/3.10-rhel7.series | 2 ++ 2 files changed, 39 insertions(+) create mode 100644 lustre/kernel_patches/patches/jbd2-fix-j_list_lock-unlock-3.10-rhel7.patch 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 index 0000000..8a0a422 --- /dev/null +++ b/lustre/kernel_patches/patches/jbd2-fix-j_list_lock-unlock-3.10-rhel7.patch @@ -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 + +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); + + /* diff --git a/lustre/kernel_patches/series/3.10-rhel7.series b/lustre/kernel_patches/series/3.10-rhel7.series index 20f9b3a..f0a840d 100644 --- a/lustre/kernel_patches/series/3.10-rhel7.series +++ b/lustre/kernel_patches/series/3.10-rhel7.series @@ -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 + -- 1.8.3.1