btrfs: handle errors in btrfs_sysfs_add_fs_devices
authorAnand Jain <anand.jain@oracle.com>
Fri, 4 Sep 2020 17:34:29 +0000 (01:34 +0800)
committerDavid Sterba <dsterba@suse.com>
Wed, 7 Oct 2020 10:12:22 +0000 (12:12 +0200)
btrfs_sysfs_add_fs_devices() is called by btrfs_sysfs_add_mounted().
btrfs_sysfs_add_mounted() assumes that btrfs_sysfs_add_fs_devices() will
either add sysfs entries for all the devices or none. So this patch keeps up
to its caller expecatation and cleans up the created sysfs entries if it
has to fail at some device in the list.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/sysfs.c

index f66632fefe0acf7d12a54f16e20719fb84c8e4d9..c71db7acb89d053b43622fd2a2a4001d7b2c36bf 100644 (file)
@@ -1362,18 +1362,22 @@ static int btrfs_sysfs_add_fs_devices(struct btrfs_fs_devices *fs_devices)
        list_for_each_entry(device, &fs_devices->devices, dev_list) {
                ret = btrfs_sysfs_add_device(device);
                if (ret)
-                       return ret;
+                       goto fail;
        }
 
        list_for_each_entry(seed, &fs_devices->seed_list, seed_list) {
                list_for_each_entry(device, &seed->devices, dev_list) {
                        ret = btrfs_sysfs_add_device(device);
                        if (ret)
-                               return ret;
+                               goto fail;
                }
        }
 
        return 0;
+
+fail:
+       btrfs_sysfs_remove_fs_devices(fs_devices);
+       return ret;
 }
 
 void btrfs_kobject_uevent(struct block_device *bdev, enum kobject_action action)