[PATCH] fs/partitions/check: add sysfs error handling
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>
This commit is contained in:
parent
6b5f29675c
commit
eee44cca66
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue