From: Eugene Teo Add error handling to add_partition(). Also fixes these warnings: fs/partitions/check.c: In function `add_partition': fs/partitions/check.c:391: warning: ignoring return value of `kobject_add', declared with attribute warn_unused_result fs/partitions/check.c:394: warning: ignoring return value of `sysfs_create_link', declared with attribute warn_unused_result fs/partitions/check.c:401: warning: ignoring return value of `sysfs_create_file', declared with attribute warn_unused_result Signed-off-by: Eugene Teo Signed-off-by: Andrew Morton --- fs/partitions/check.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff -puN fs/partitions/check.c~fs-partitions-checkc-add-add_partition-error-handling fs/partitions/check.c --- a/fs/partitions/check.c~fs-partitions-checkc-add-add_partition-error-handling +++ a/fs/partitions/check.c @@ -371,6 +371,7 @@ void delete_partition(struct gendisk *di void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len, int flags) { struct hd_struct *p; + int err; p = kzalloc(sizeof(*p), GFP_KERNEL); if (!p) @@ -388,20 +389,36 @@ void add_partition(struct gendisk *disk, p->kobj.parent = &disk->kobj; p->kobj.ktype = &ktype_part; kobject_init(&p->kobj); - kobject_add(&p->kobj); + err = kobject_add(&p->kobj); + if (err) + goto err_out; if (!disk->part_uevent_suppress) kobject_uevent(&p->kobj, KOBJ_ADD); - sysfs_create_link(&p->kobj, &block_subsys.kobj, "subsystem"); + err = sysfs_create_link(&p->kobj, &block_subsys.kobj, "subsystem"); + if (err) + goto err_out_del_kobj; if (flags & ADDPART_FLAG_WHOLEDISK) { static struct attribute addpartattr = { .name = "whole_disk", .mode = S_IRUSR | S_IRGRP | S_IROTH, }; - sysfs_create_file(&p->kobj, &addpartattr); + err = sysfs_create_file(&p->kobj, &addpartattr); + if (err) + goto err_out_del_link; } partition_sysfs_add_subdir(p); disk->part[part-1] = p; + return; + +err_out_del_link: + sysfs_remove_link(&p->kobj, "subsystem"); +err_out_del_kobj: + if (!disk->part_uevent_suppress) + kobject_uevent(&p->kobj, KOBJ_REMOVE); + kobject_del(&p->kobj); +err_out: + kobject_put(&p->kobj); } static char *make_block_name(struct gendisk *disk) _