diff options
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/kernel/module.c b/kernel/module.c index 0f4489af3e2..9de4209f6a6 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -1131,12 +1131,6 @@ static int mod_sysfs_setup(struct module *mod, if (err) goto out; - mod->mkobj.drivers_dir = kobject_add_dir(&mod->mkobj.kobj, "drivers"); - if (!mod->mkobj.drivers_dir) { - err = -ENOMEM; - goto out_unreg; - } - err = module_param_sysfs_setup(mod, kparam, num_params); if (err) goto out_unreg_drivers; @@ -1151,8 +1145,6 @@ static int mod_sysfs_setup(struct module *mod, out_unreg_param: module_param_sysfs_remove(mod); out_unreg_drivers: - kobject_unregister(mod->mkobj.drivers_dir); -out_unreg: kobject_del(&mod->mkobj.kobj); kobject_put(&mod->mkobj.kobj); out: @@ -1163,7 +1155,8 @@ static void mod_kobject_remove(struct module *mod) { module_remove_modinfo_attrs(mod); module_param_sysfs_remove(mod); - kobject_unregister(mod->mkobj.drivers_dir); + if (mod->mkobj.drivers_dir) + kobject_unregister(mod->mkobj.drivers_dir); kobject_unregister(&mod->mkobj.kobj); } @@ -2340,6 +2333,14 @@ static char *make_driver_name(struct device_driver *drv) return driver_name; } +static void module_create_drivers_dir(struct module_kobject *mk) +{ + if (!mk || mk->drivers_dir) + return; + + mk->drivers_dir = kobject_add_dir(&mk->kobj, "drivers"); +} + void module_add_driver(struct module *mod, struct device_driver *drv) { char *driver_name; @@ -2367,6 +2368,7 @@ void module_add_driver(struct module *mod, struct device_driver *drv) no_warn = sysfs_create_link(&drv->kobj, &mk->kobj, "module"); driver_name = make_driver_name(drv); if (driver_name) { + module_create_drivers_dir(mk); no_warn = sysfs_create_link(mk->drivers_dir, &drv->kobj, driver_name); kfree(driver_name); |