summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/sysfs.c
diff options
context:
space:
mode:
authorAnand Jain <anand.jain@oracle.com>2020-09-04 19:34:29 +0200
committerDavid Sterba <dsterba@suse.com>2020-10-07 12:12:22 +0200
commit7ad3912a70a696197d03856749f89dad7a377bc9 (patch)
tree3e3a6fce64cef2dc1fe238d542295e693ba50c93 /fs/btrfs/sysfs.c
parentbtrfs: initialize sysfs devid and device link for seed device (diff)
downloadlinux-7ad3912a70a696197d03856749f89dad7a377bc9.tar.xz
linux-7ad3912a70a696197d03856749f89dad7a377bc9.zip
btrfs: handle errors in btrfs_sysfs_add_fs_devices
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>
Diffstat (limited to 'fs/btrfs/sysfs.c')
-rw-r--r--fs/btrfs/sysfs.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
index f66632fefe0a..c71db7acb89d 100644
--- a/fs/btrfs/sysfs.c
+++ b/fs/btrfs/sysfs.c
@@ -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)