Skip to content

Commit

Permalink
jbd: Fix lock ordering bug in journal_unmap_buffer()
Browse files Browse the repository at this point in the history
Commit 09e05d4 introduced a wait for transaction commit into
journal_unmap_buffer() in the case we are truncating a buffer undergoing commit
in the page stradding i_size on a filesystem with blocksize < pagesize. Sadly
we forgot to drop buffer lock before waiting for transaction commit and thus
deadlock is possible when kjournald wants to lock the buffer.

Fix the problem by dropping the buffer lock before waiting for transaction
commit. Since we are still holding page lock (and that is OK), buffer cannot
disappear under us.

CC: stable@vger.kernel.org # Wherever commit 09e05d4 was taken
Signed-off-by: Jan Kara <jack@suse.cz>
  • Loading branch information
jankara committed Nov 23, 2012
1 parent ae49eee commit 25389bb
Showing 1 changed file with 2 additions and 0 deletions.
2 changes: 2 additions & 0 deletions fs/jbd/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -1961,7 +1961,9 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh,
spin_unlock(&journal->j_list_lock);
jbd_unlock_bh_state(bh);
spin_unlock(&journal->j_state_lock);
unlock_buffer(bh);
log_wait_commit(journal, tid);
lock_buffer(bh);
goto retry;
}
/*
Expand Down

0 comments on commit 25389bb

Please sign in to comment.