jbd2: check jh->b_transaction without taking j_list_lock
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>
This commit is contained in:
parent
d4e839d4a9
commit
d2eb0b9989
|
@ -1821,11 +1821,11 @@ __journal_try_to_free_buffer(journal_t *journal, struct buffer_head *bh)
|
||||||
if (buffer_locked(bh) || buffer_dirty(bh))
|
if (buffer_locked(bh) || buffer_dirty(bh))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (jh->b_next_transaction != NULL)
|
if (jh->b_next_transaction != NULL || jh->b_transaction != NULL)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
spin_lock(&journal->j_list_lock);
|
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 */
|
/* written-back checkpointed metadata buffer */
|
||||||
JBUFFER_TRACE(jh, "remove from checkpoint list");
|
JBUFFER_TRACE(jh, "remove from checkpoint list");
|
||||||
__jbd2_journal_remove_checkpoint(jh);
|
__jbd2_journal_remove_checkpoint(jh);
|
||||||
|
|
Loading…
Reference in New Issue