]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ext4: release kobject/kset even when init/register fail
authorRiccardo Schirone <sirmy15@gmail.com>
Thu, 11 Jan 2018 19:28:13 +0000 (14:28 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 11 Jan 2018 19:28:13 +0000 (14:28 -0500)
Even when kobject_init_and_add/kset_register fail, the kobject has been
already initialized and the refcount set to 1. Thus it is necessary to
release the kobject/kset, to avoid the memory associated with it hanging
around forever.

Signed-off-by: Riccardo Schirone <sirmy15@gmail.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/sysfs.c

index e21afd52e7d7906bd1ff473b090a1d938307c492..4389fe4893c216523c40eb960e8880f69eed7a6a 100644 (file)
@@ -396,8 +396,11 @@ int ext4_register_sysfs(struct super_block *sb)
        init_completion(&sbi->s_kobj_unregister);
        err = kobject_init_and_add(&sbi->s_kobj, &ext4_sb_ktype, NULL,
                                   "%s", sb->s_id);
-       if (err)
+       if (err) {
+               kobject_put(&sbi->s_kobj);
+               wait_for_completion(&sbi->s_kobj_unregister);
                return err;
+       }
 
        if (ext4_proc_root)
                sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root);
@@ -430,15 +433,19 @@ int __init ext4_init_sysfs(void)
        kobject_set_name(&ext4_kset.kobj, "ext4");
        ext4_kset.kobj.parent = fs_kobj;
        ret = kset_register(&ext4_kset);
-       if (ret)
+       if (ret) {
+               kset_unregister(&ext4_kset);
                return ret;
+       }
 
        ret = kobject_init_and_add(&ext4_feat, &ext4_feat_ktype,
                                   NULL, "features");
-       if (ret)
+       if (ret) {
+               kobject_put(&ext4_feat);
                kset_unregister(&ext4_kset);
-       else
+       } else {
                ext4_proc_root = proc_mkdir(proc_dirname, NULL);
+       }
        return ret;
 }