jbd2: minimize region locked by j_list_lock in jbd2_journal_forget()
authorTheodore Ts'o <tytso@mit.edu>
Sun, 9 Mar 2014 05:56:58 +0000 (00:56 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 9 Mar 2014 05:56:58 +0000 (00:56 -0500)
It's not needed until we start trying to modifying fields in the
journal_head which are protected by j_list_lock.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/jbd2/transaction.c

index 357f3dc5201f6e56bfdae6797a386cd32130af0f..d999b1f6847c0185c61e8a41ac24de8bef342488 100644 (file)
@@ -1416,7 +1416,6 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
        BUFFER_TRACE(bh, "entry");
 
        jbd_lock_bh_state(bh);
-       spin_lock(&journal->j_list_lock);
 
        if (!buffer_jbd(bh))
                goto not_jbd;
@@ -1469,6 +1468,7 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
                 * we know to remove the checkpoint after we commit.
                 */
 
+               spin_lock(&journal->j_list_lock);
                if (jh->b_cp_transaction) {
                        __jbd2_journal_temp_unlink_buffer(jh);
                        __jbd2_journal_file_buffer(jh, transaction, BJ_Forget);
@@ -1481,6 +1481,7 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
                                goto drop;
                        }
                }
+               spin_unlock(&journal->j_list_lock);
        } else if (jh->b_transaction) {
                J_ASSERT_JH(jh, (jh->b_transaction ==
                                 journal->j_committing_transaction));
@@ -1492,7 +1493,9 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
 
                if (jh->b_next_transaction) {
                        J_ASSERT(jh->b_next_transaction == transaction);
+                       spin_lock(&journal->j_list_lock);
                        jh->b_next_transaction = NULL;
+                       spin_unlock(&journal->j_list_lock);
 
                        /*
                         * only drop a reference if this transaction modified
@@ -1504,7 +1507,6 @@ int jbd2_journal_forget (handle_t *handle, struct buffer_head *bh)
        }
 
 not_jbd:
-       spin_unlock(&journal->j_list_lock);
        jbd_unlock_bh_state(bh);
        __brelse(bh);
 drop: