提交 eee44cca 编写于 作者: J Jeff Garzik 提交者: Linus Torvalds

[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: NJeff Garzik <jeff@garzik.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 6b5f2967
...@@ -376,18 +376,48 @@ static char *make_block_name(struct gendisk *disk) ...@@ -376,18 +376,48 @@ static char *make_block_name(struct gendisk *disk)
return name; 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); struct device *target = get_device(disk->driverfs_dev);
int err;
char *disk_name = NULL;
if (target) { if (target) {
char *disk_name = make_block_name(disk); disk_name = make_block_name(disk);
sysfs_create_link(&disk->kobj,&target->kobj,"device"); if (!disk_name) {
if (disk_name) { err = -ENOMEM;
sysfs_create_link(&target->kobj,&disk->kobj,disk_name); goto err_out;
kfree(disk_name);
} }
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(). */ /* Not exported, helper to add_disk(). */
...@@ -406,7 +436,11 @@ void register_disk(struct gendisk *disk) ...@@ -406,7 +436,11 @@ void register_disk(struct gendisk *disk)
*s = '!'; *s = '!';
if ((err = kobject_add(&disk->kobj))) if ((err = kobject_add(&disk->kobj)))
return; return;
disk_sysfs_symlinks(disk); err = disk_sysfs_symlinks(disk);
if (err) {
kobject_del(&disk->kobj);
return;
}
disk_sysfs_add_subdirs(disk); disk_sysfs_add_subdirs(disk);
/* No minors to use for partitions */ /* No minors to use for partitions */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册