diff options
author | Riccardo Schirone <sirmy15@gmail.com> | 2018-01-11 21:11:32 +0100 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2018-01-11 21:11:32 +0100 |
commit | b99fee58a20ab8e0557cce87b6f187e325993142 (patch) | |
tree | 41d6f830358a3d851cd12622ccc810492f073b5d /fs/ext4 | |
parent | ext4: release kobject/kset even when init/register fail (diff) | |
download | linux-b99fee58a20ab8e0557cce87b6f187e325993142.tar.xz linux-b99fee58a20ab8e0557cce87b6f187e325993142.zip |
ext4: create ext4_feat kobject dynamically
kobjects should always be allocated dynamically, because it is unknown
to whoever creates them when kobjects can be released.
Signed-off-by: Riccardo Schirone <sirmy15@gmail.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/sysfs.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c index 4389fe4893c2..192ade7d6fe6 100644 --- a/fs/ext4/sysfs.c +++ b/fs/ext4/sysfs.c @@ -11,6 +11,7 @@ #include <linux/time.h> #include <linux/fs.h> #include <linux/seq_file.h> +#include <linux/slab.h> #include <linux/proc_fs.h> #include "ext4.h" @@ -351,11 +352,10 @@ static struct kset ext4_kset = { static struct kobj_type ext4_feat_ktype = { .default_attrs = ext4_feat_attrs, .sysfs_ops = &ext4_attr_ops, + .release = (void (*)(struct kobject *))kfree, }; -static struct kobject ext4_feat = { - .kset = &ext4_kset, -}; +static struct kobject *ext4_feat; #define PROC_FILE_SHOW_DEFN(name) \ static int name##_open(struct inode *inode, struct file *file) \ @@ -438,20 +438,31 @@ int __init ext4_init_sysfs(void) return ret; } - ret = kobject_init_and_add(&ext4_feat, &ext4_feat_ktype, - NULL, "features"); - if (ret) { - kobject_put(&ext4_feat); - kset_unregister(&ext4_kset); - } else { - ext4_proc_root = proc_mkdir(proc_dirname, NULL); + ext4_feat = kzalloc(sizeof(*ext4_feat), GFP_KERNEL); + if (!ext4_feat) { + ret = -ENOMEM; + goto kset_err; } + + ext4_feat->kset = &ext4_kset; + ret = kobject_init_and_add(ext4_feat, &ext4_feat_ktype, + NULL, "features"); + if (ret) + goto feat_err; + + ext4_proc_root = proc_mkdir(proc_dirname, NULL); + return ret; + +feat_err: + kobject_put(ext4_feat); +kset_err: + kset_unregister(&ext4_kset); return ret; } void ext4_exit_sysfs(void) { - kobject_put(&ext4_feat); + kobject_put(ext4_feat); kset_unregister(&ext4_kset); remove_proc_entry(proc_dirname, NULL); ext4_proc_root = NULL; |