fs/partitions/check.c: add_partition() warning fixes (take 2)
PATCH 1/1 fs/partitions/check.c: add_partition() warning fixes (take 2)
This patch 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_resultfs/partitions/check.c:394: warning: ignoring return value of
'sysfs_create_link', declared with attribute warn_unused_resultfs/partitions/check.c:401: warning: ignoring return value of
'sysfs_create_file', declared with attribute warn_unused_result
--- fs/partitions/check.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-)
fs/partitions/check.c +20 -3
@@ -371,6 +371,7 @@ void delete_partition(struct gendisk *disk, int part)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, int part, sector_t start, sector_t len, 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_put (&p->kobj); +err_out: +kfree (p); }static char *make_block_name (struct gendisk *disk)
fs/partitions/check.c void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len, · line 422
Quoted 9 lines · Eugene Teo
fs/partitions/check.c +8
-0+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_put (&p->kobj); +err_out: +kfree (p); }
No, this is wrong. You need to move the put behind err_out and remove the kfree. (The release function will take care of p.)
Quoted 15 lines · Cornelia Huck
fs/partitions/check.c void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len, · line 422
Quoted 9 lines · Eugene Teo
fs/partitions/check.c +8
-0+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_put (&p->kobj); +err_out: +kfree (p); }No, this is wrong. You need to move the put behind
err_outand remove the kfree. (The release function will take care of p.)
503 void kobject_put(struct kobject * kobj)
504 {
505 if (kobj)
506 kref_put(&kobj->kref, kobject_release);
[...]
52 int kref_put(struct kref *kref, void (*release)(struct kref *kref)) 53 {
[...]
57 if (atomic_dec_and_test(&kref->refcount)) {
58 release(kref);
59 return 1;
Nod, thanks for your guidance.
Eugene