[Devel,RHEL7,COMMIT] ms/jbd2: fix incorrect unlock on j_list_lock

Submitted by Konstantin Khorenko on March 16, 2017, 11:42 a.m.

Details

Message ID 201703161142.v2GBgKax014049@finist_cl7.x64_64.work.ct
State New
Series "jbd2: fix incorrect unlock on j_list_lock"
Headers show

Commit Message

Konstantin Khorenko March 16, 2017, 11:42 a.m.
The commit is pushed to "branch-rh7-3.10.0-514.10.2.vz7.29.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-514.10.2.vz7.29.3
------>
commit 0672ec203b2c812f45694f2cc0a5121adf2ca4ec
Author: Taesoo Kim <tsgatesv@gmail.com>
Date:   Thu Mar 16 15:42:20 2017 +0400

    ms/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).
    
    Signed-off-by: Taesoo Kim <tsgatesv@gmail.com>
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Reviewed-by: Andreas Dilger <adilger@dilger.ca>
    Fixes: 6e4862a5bb9d12be87e4ea5d9a60836ebed71d28
    Cc: stable@vger.kernel.org # 3.14+
    
    ms commit: 559cce6 ("jbd2: fix incorrect unlock on j_list_lock")
    
    Signed-off-by: Anatoly Stepanov <astepanov@cloudlinux.com>
---
 fs/jbd2/transaction.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Patch hide | download patch | download mbox

diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
index b249f40..ed52bf7 100644
--- a/fs/jbd2/transaction.c
+++ b/fs/jbd2/transaction.c
@@ -1106,6 +1106,7 @@  int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh)
 		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;
@@ -1113,8 +1114,8 @@  int jbd2_journal_get_create_access(handle_t *handle, struct buffer_head *bh)
 		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);
 
 	/*