diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2019-01-27 04:58:00 +0000 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2019-01-30 18:16:40 +0100 |
commit | 92900e5160a5444d47dd376bc40066b709fbb5a6 (patch) | |
tree | 16fe4e2b48d4610448fe00759383ad686838ce08 /fs/btrfs/volumes.c | |
parent | 302167c50b32e7fccc98994a91d40ddbbab04e52 (diff) | |
download | linux-92900e5160a5444d47dd376bc40066b709fbb5a6.tar.gz linux-92900e5160a5444d47dd376bc40066b709fbb5a6.tar.bz2 linux-92900e5160a5444d47dd376bc40066b709fbb5a6.zip |
btrfs: fix potential oops in device_list_add
alloc_fs_devices() can return ERR_PTR(-ENOMEM), so dereferencing its
result before the check for IS_ERR() is a bad idea.
Fixes: d1a63002829a4 ("btrfs: add members to fs_devices to track fsid changes")
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r-- | fs/btrfs/volumes.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 3e4f8f88353e..15561926ab32 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -957,11 +957,11 @@ static noinline struct btrfs_device *device_list_add(const char *path, else fs_devices = alloc_fs_devices(disk_super->fsid, NULL); - fs_devices->fsid_change = fsid_change_in_progress; - if (IS_ERR(fs_devices)) return ERR_CAST(fs_devices); + fs_devices->fsid_change = fsid_change_in_progress; + mutex_lock(&fs_devices->device_list_mutex); list_add(&fs_devices->fs_list, &fs_uuids); |