mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
jbd2: use a per-journal lock_class_key for jbd2_trans_commit_key
commit 524c3853831cf4f7e1db579e487c757c3065165c upstream. syzbot is reporting possibility of deadlock due to sharing lock_class_key for jbd2_handle across ext4 and ocfs2. But this is a false positive, for one disk partition can't have two filesystems at the same time. Reported-by: syzbot+6e493c165d26d6fcbf72@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=6e493c165d26d6fcbf72 Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Tested-by: syzbot+6e493c165d26d6fcbf72@syzkaller.appspotmail.com Reviewed-by: Jan Kara <jack@suse.cz> Message-ID: <987110fc-5470-457a-a218-d286a09dd82f@I-love.SAKURA.ne.jp> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
79a0e4d3fb
commit
815327958e
@@ -1563,7 +1563,6 @@ static journal_t *journal_init_common(struct block_device *bdev,
|
||||
struct block_device *fs_dev,
|
||||
unsigned long long start, int len, int blocksize)
|
||||
{
|
||||
static struct lock_class_key jbd2_trans_commit_key;
|
||||
journal_t *journal;
|
||||
int err;
|
||||
int n;
|
||||
@@ -1572,6 +1571,7 @@ static journal_t *journal_init_common(struct block_device *bdev,
|
||||
if (!journal)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
lockdep_register_key(&journal->jbd2_trans_commit_key);
|
||||
journal->j_blocksize = blocksize;
|
||||
journal->j_dev = bdev;
|
||||
journal->j_fs_dev = fs_dev;
|
||||
@@ -1601,7 +1601,7 @@ static journal_t *journal_init_common(struct block_device *bdev,
|
||||
journal->j_max_batch_time = 15000; /* 15ms */
|
||||
atomic_set(&journal->j_reserved_credits, 0);
|
||||
lockdep_init_map(&journal->j_trans_commit_map, "jbd2_handle",
|
||||
&jbd2_trans_commit_key, 0);
|
||||
&journal->jbd2_trans_commit_key, 0);
|
||||
|
||||
/* The journal is marked for error until we succeed with recovery! */
|
||||
journal->j_flags = JBD2_ABORT;
|
||||
@@ -1648,6 +1648,7 @@ err_cleanup:
|
||||
kfree(journal->j_wbuf);
|
||||
jbd2_journal_destroy_revoke(journal);
|
||||
journal_fail_superblock(journal);
|
||||
lockdep_unregister_key(&journal->jbd2_trans_commit_key);
|
||||
kfree(journal);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
@@ -2229,6 +2230,7 @@ int jbd2_journal_destroy(journal_t *journal)
|
||||
crypto_free_shash(journal->j_chksum_driver);
|
||||
kfree(journal->j_fc_wbuf);
|
||||
kfree(journal->j_wbuf);
|
||||
lockdep_unregister_key(&journal->jbd2_trans_commit_key);
|
||||
kfree(journal);
|
||||
|
||||
return err;
|
||||
|
||||
@@ -1266,6 +1266,12 @@ struct journal_s
|
||||
*/
|
||||
struct lockdep_map j_trans_commit_map;
|
||||
#endif
|
||||
/**
|
||||
* @jbd2_trans_commit_key:
|
||||
*
|
||||
* "struct lock_class_key" for @j_trans_commit_map
|
||||
*/
|
||||
struct lock_class_key jbd2_trans_commit_key;
|
||||
|
||||
/**
|
||||
* @j_fc_cleanup_callback:
|
||||
|
||||
Reference in New Issue
Block a user