forked from Minki/linux
btrfs: zoned: move log tree node allocation out of log_root_tree->log_mutex
Commit6e37d24599
("btrfs: zoned: fix deadlock on log sync") pointed out a deadlock warning and removed mutex_{lock,unlock} of fs_info::tree_root->log_mutex. While it looks like it always cause a deadlock, we didn't see actual deadlock in fstests runs. The reason is log_root_tree->log_mutex != fs_info->tree_root->log_mutex, not taking the same lock. So, the warning was actually a false-positive. Since btrfs_alloc_log_tree_node() is protected only by fs_info->tree_root->log_mutex, we can (and should) move the code out of the lock scope of log_root_tree->log_mutex and silence the warning. Fixes:6e37d24599
("btrfs: zoned: fix deadlock on log sync") Reviewed-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
2cdb3909c9
commit
e75f9fd194
@ -3165,20 +3165,22 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans,
|
||||
*/
|
||||
mutex_unlock(&root->log_mutex);
|
||||
|
||||
btrfs_init_log_ctx(&root_log_ctx, NULL);
|
||||
|
||||
mutex_lock(&log_root_tree->log_mutex);
|
||||
|
||||
if (btrfs_is_zoned(fs_info)) {
|
||||
mutex_lock(&fs_info->tree_root->log_mutex);
|
||||
if (!log_root_tree->node) {
|
||||
ret = btrfs_alloc_log_tree_node(trans, log_root_tree);
|
||||
if (ret) {
|
||||
mutex_unlock(&log_root_tree->log_mutex);
|
||||
mutex_unlock(&fs_info->tree_log_mutex);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&fs_info->tree_root->log_mutex);
|
||||
}
|
||||
|
||||
btrfs_init_log_ctx(&root_log_ctx, NULL);
|
||||
|
||||
mutex_lock(&log_root_tree->log_mutex);
|
||||
|
||||
index2 = log_root_tree->log_transid % 2;
|
||||
list_add_tail(&root_log_ctx.list, &log_root_tree->log_ctxs[index2]);
|
||||
root_log_ctx.log_transid = log_root_tree->log_transid;
|
||||
|
Loading…
Reference in New Issue
Block a user