Skip to content

Commit

Permalink
jbd2: fix incorrect unlock on j_list_lock
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Theodore Ts'o <[email protected]>
Reviewed-by: Andreas Dilger <[email protected]>
Fixes: 6e4862a
Cc: [email protected] # 3.14+
  • Loading branch information
tsgates authored and tytso committed Oct 13, 2016
1 parent 651e1c3 commit 559cce6
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion fs/jbd2/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -1149,15 +1149,16 @@ 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;

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);

/*
Expand Down

0 comments on commit 559cce6

Please sign in to comment.