jbd2: check jh->b_transaction without taking j_list_lock
authorTheodore Ts'o <tytso@mit.edu>
Sun, 9 Mar 2014 05:07:19 +0000 (00:07 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 9 Mar 2014 05:07:19 +0000 (00:07 -0500)
jh->b_transaction is adequately protected for reading by the
jbd_lock_bh_state(bh), so we don't need to take j_list_lock in
__journal_try_to_free_buffer().

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

index 60bb365f54a52efb8ff859ff746ac1af201bb7d2..78900a1252b28ad7dfda5e7141b3cc49460b0d47 100644 (file)
@@ -1821,11 +1821,11 @@ __journal_try_to_free_buffer(journal_t *journal, struct buffer_head *bh)
        if (buffer_locked(bh) || buffer_dirty(bh))
                goto out;
 
-       if (jh->b_next_transaction != NULL)
+       if (jh->b_next_transaction != NULL || jh->b_transaction != NULL)
                goto out;
 
        spin_lock(&journal->j_list_lock);
-       if (jh->b_cp_transaction != NULL && jh->b_transaction == NULL) {
+       if (jh->b_cp_transaction != NULL) {
                /* written-back checkpointed metadata buffer */
                JBUFFER_TRACE(jh, "remove from checkpoint list");
                __jbd2_journal_remove_checkpoint(jh);