btrfs: consolidate device_list_mutex in prepare_sprout to its parent
authorAnand Jain <anand.jain@oracle.com>
Tue, 9 Nov 2021 09:51:58 +0000 (17:51 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 3 Jan 2022 14:09:44 +0000 (15:09 +0100)
commit849eae5e57a703105aa6cdce0d860ab95f44d81c
tree326390a0588a30974bf3717fe22cf6a732eaacf1
parentfd8808097ad23ad8ae79f002b7b2a62e50f2c7eb
btrfs: consolidate device_list_mutex in prepare_sprout to its parent

btrfs_prepare_sprout() splices seed devices into its own struct fs_devices,
so that its parent function btrfs_init_new_device() can add the new sprout
device to fs_info->fs_devices.

Both btrfs_prepare_sprout() and btrfs_init_new_device() need
device_list_mutex. But they are holding it separately, thus create a
small race window. Close it and hold device_list_mutex across both
functions btrfs_init_new_device() and btrfs_prepare_sprout().

Split btrfs_prepare_sprout() into btrfs_init_sprout() and
btrfs_setup_sprout(). This split is essential because device_list_mutex
must not be held for allocations in btrfs_init_sprout() but must be held
for btrfs_setup_sprout(). So now a common device_list_mutex can be used
between btrfs_init_new_device() and btrfs_setup_sprout().

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/volumes.c