mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
jbd2: use a per-journal lock_class_key for jbd2_trans_commit_key
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
This commit is contained in:
committed by
Theodore Ts'o
parent
b97cb7d6a0
commit
524c385383
@@ -1521,7 +1521,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;
|
||||
@@ -1530,6 +1529,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;
|
||||
@@ -1560,7 +1560,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;
|
||||
@@ -1611,6 +1611,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);
|
||||
}
|
||||
@@ -2187,6 +2188,7 @@ int jbd2_journal_destroy(journal_t *journal)
|
||||
jbd2_journal_destroy_revoke(journal);
|
||||
kfree(journal->j_fc_wbuf);
|
||||
kfree(journal->j_wbuf);
|
||||
lockdep_unregister_key(&journal->jbd2_trans_commit_key);
|
||||
kfree(journal);
|
||||
|
||||
return err;
|
||||
|
||||
@@ -1253,6 +1253,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