aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/module.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/module.c')
-rw-r--r--kernel/module.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/kernel/module.c b/kernel/module.c
index fbc51de6444e..9da5af668a20 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1148,8 +1148,10 @@ int mod_sysfs_setup(struct module *mod,
1148 goto out; 1148 goto out;
1149 1149
1150 mod->holders_dir = kobject_add_dir(&mod->mkobj.kobj, "holders"); 1150 mod->holders_dir = kobject_add_dir(&mod->mkobj.kobj, "holders");
1151 if (!mod->holders_dir) 1151 if (!mod->holders_dir) {
1152 err = -ENOMEM;
1152 goto out_unreg; 1153 goto out_unreg;
1154 }
1153 1155
1154 err = module_param_sysfs_setup(mod, kparam, num_params); 1156 err = module_param_sysfs_setup(mod, kparam, num_params);
1155 if (err) 1157 if (err)
@@ -2384,8 +2386,13 @@ void module_add_driver(struct module *mod, struct device_driver *drv)
2384 2386
2385 /* Lookup built-in module entry in /sys/modules */ 2387 /* Lookup built-in module entry in /sys/modules */
2386 mkobj = kset_find_obj(&module_subsys.kset, drv->mod_name); 2388 mkobj = kset_find_obj(&module_subsys.kset, drv->mod_name);
2387 if (mkobj) 2389 if (mkobj) {
2388 mk = container_of(mkobj, struct module_kobject, kobj); 2390 mk = container_of(mkobj, struct module_kobject, kobj);
2391 /* remember our module structure */
2392 drv->mkobj = mk;
2393 /* kset_find_obj took a reference */
2394 kobject_put(mkobj);
2395 }
2389 } 2396 }
2390 2397
2391 if (!mk) 2398 if (!mk)
@@ -2405,17 +2412,22 @@ EXPORT_SYMBOL(module_add_driver);
2405 2412
2406void module_remove_driver(struct device_driver *drv) 2413void module_remove_driver(struct device_driver *drv)
2407{ 2414{
2415 struct module_kobject *mk = NULL;
2408 char *driver_name; 2416 char *driver_name;
2409 2417
2410 if (!drv) 2418 if (!drv)
2411 return; 2419 return;
2412 2420
2413 sysfs_remove_link(&drv->kobj, "module"); 2421 sysfs_remove_link(&drv->kobj, "module");
2414 if (drv->owner && drv->owner->mkobj.drivers_dir) { 2422
2423 if (drv->owner)
2424 mk = &drv->owner->mkobj;
2425 else if (drv->mkobj)
2426 mk = drv->mkobj;
2427 if (mk && mk->drivers_dir) {
2415 driver_name = make_driver_name(drv); 2428 driver_name = make_driver_name(drv);
2416 if (driver_name) { 2429 if (driver_name) {
2417 sysfs_remove_link(drv->owner->mkobj.drivers_dir, 2430 sysfs_remove_link(mk->drivers_dir, driver_name);
2418 driver_name);
2419 kfree(driver_name); 2431 kfree(driver_name);
2420 } 2432 }
2421 } 2433 }