[PATCH] fs/partitions/check: add sysfs error handling
authorJeff Garzik <jeff@garzik.org>
Tue, 17 Oct 2006 07:10:23 +0000 (00:10 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 17 Oct 2006 15:18:47 +0000 (08:18 -0700)
Handle errors thrown in disk_sysfs_symlinks(), and propagate back to
caller.

The callers and associated functions don't do a real good job of handling
kobject errors anyway (add_partition, register_disk, rescan_partitions), so
this should do until something better comes along.

Signed-off-by: Jeff Garzik <jeff@garzik.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/partitions/check.c

index 51c6a748df4921947659abb114fc189f2508fa95..6fb4b6150d7701cd57085f80a0f9222f31be53ed 100644 (file)
@@ -376,18 +376,48 @@ static char *make_block_name(struct gendisk *disk)
        return name;
 }
 
-static void disk_sysfs_symlinks(struct gendisk *disk)
+static int disk_sysfs_symlinks(struct gendisk *disk)
 {
        struct device *target = get_device(disk->driverfs_dev);
+       int err;
+       char *disk_name = NULL;
+
        if (target) {
-               char *disk_name = make_block_name(disk);
-               sysfs_create_link(&disk->kobj,&target->kobj,"device");
-               if (disk_name) {
-                       sysfs_create_link(&target->kobj,&disk->kobj,disk_name);
-                       kfree(disk_name);
+               disk_name = make_block_name(disk);
+               if (!disk_name) {
+                       err = -ENOMEM;
+                       goto err_out;
                }
+
+               err = sysfs_create_link(&disk->kobj, &target->kobj, "device");
+               if (err)
+                       goto err_out_disk_name;
+
+               err = sysfs_create_link(&target->kobj, &disk->kobj, disk_name);
+               if (err)
+                       goto err_out_dev_link;
        }
-       sysfs_create_link(&disk->kobj, &block_subsys.kset.kobj, "subsystem");
+
+       err = sysfs_create_link(&disk->kobj, &block_subsys.kset.kobj,
+                               "subsystem");
+       if (err)
+               goto err_out_disk_name_lnk;
+
+       kfree(disk_name);
+
+       return 0;
+
+err_out_disk_name_lnk:
+       if (target) {
+               sysfs_remove_link(&target->kobj, disk_name);
+err_out_dev_link:
+               sysfs_remove_link(&disk->kobj, "device");
+err_out_disk_name:
+               kfree(disk_name);
+err_out:
+               put_device(target);
+       }
+       return err;
 }
 
 /* Not exported, helper to add_disk(). */
@@ -406,7 +436,11 @@ void register_disk(struct gendisk *disk)
                *s = '!';
        if ((err = kobject_add(&disk->kobj)))
                return;
-       disk_sysfs_symlinks(disk);
+       err = disk_sysfs_symlinks(disk);
+       if (err) {
+               kobject_del(&disk->kobj);
+               return;
+       }
        disk_sysfs_add_subdirs(disk);
 
        /* No minors to use for partitions */