diff options
Diffstat (limited to 'kernel/module.c')
-rw-r--r-- | kernel/module.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/kernel/module.c b/kernel/module.c index b565eaeff7e6..d0f2260a0210 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -1132,8 +1132,10 @@ static int mod_sysfs_setup(struct module *mod, | |||
1132 | goto out; | 1132 | goto out; |
1133 | 1133 | ||
1134 | mod->drivers_dir = kobject_add_dir(&mod->mkobj.kobj, "drivers"); | 1134 | mod->drivers_dir = kobject_add_dir(&mod->mkobj.kobj, "drivers"); |
1135 | if (!mod->drivers_dir) | 1135 | if (!mod->drivers_dir) { |
1136 | err = -ENOMEM; | ||
1136 | goto out_unreg; | 1137 | goto out_unreg; |
1138 | } | ||
1137 | 1139 | ||
1138 | err = module_param_sysfs_setup(mod, kparam, num_params); | 1140 | err = module_param_sysfs_setup(mod, kparam, num_params); |
1139 | if (err) | 1141 | if (err) |
@@ -1146,10 +1148,10 @@ static int mod_sysfs_setup(struct module *mod, | |||
1146 | kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD); | 1148 | kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD); |
1147 | return 0; | 1149 | return 0; |
1148 | 1150 | ||
1149 | out_unreg_drivers: | ||
1150 | kobject_unregister(mod->drivers_dir); | ||
1151 | out_unreg_param: | 1151 | out_unreg_param: |
1152 | module_param_sysfs_remove(mod); | 1152 | module_param_sysfs_remove(mod); |
1153 | out_unreg_drivers: | ||
1154 | kobject_unregister(mod->drivers_dir); | ||
1153 | out_unreg: | 1155 | out_unreg: |
1154 | kobject_del(&mod->mkobj.kobj); | 1156 | kobject_del(&mod->mkobj.kobj); |
1155 | kobject_put(&mod->mkobj.kobj); | 1157 | kobject_put(&mod->mkobj.kobj); |
@@ -2325,8 +2327,22 @@ void print_modules(void) | |||
2325 | printk("\n"); | 2327 | printk("\n"); |
2326 | } | 2328 | } |
2327 | 2329 | ||
2330 | static char *make_driver_name(struct device_driver *drv) | ||
2331 | { | ||
2332 | char *driver_name; | ||
2333 | |||
2334 | driver_name = kmalloc(strlen(drv->name) + strlen(drv->bus->name) + 2, | ||
2335 | GFP_KERNEL); | ||
2336 | if (!driver_name) | ||
2337 | return NULL; | ||
2338 | |||
2339 | sprintf(driver_name, "%s:%s", drv->bus->name, drv->name); | ||
2340 | return driver_name; | ||
2341 | } | ||
2342 | |||
2328 | void module_add_driver(struct module *mod, struct device_driver *drv) | 2343 | void module_add_driver(struct module *mod, struct device_driver *drv) |
2329 | { | 2344 | { |
2345 | char *driver_name; | ||
2330 | int no_warn; | 2346 | int no_warn; |
2331 | 2347 | ||
2332 | if (!mod || !drv) | 2348 | if (!mod || !drv) |
@@ -2334,17 +2350,31 @@ void module_add_driver(struct module *mod, struct device_driver *drv) | |||
2334 | 2350 | ||
2335 | /* Don't check return codes; these calls are idempotent */ | 2351 | /* Don't check return codes; these calls are idempotent */ |
2336 | no_warn = sysfs_create_link(&drv->kobj, &mod->mkobj.kobj, "module"); | 2352 | no_warn = sysfs_create_link(&drv->kobj, &mod->mkobj.kobj, "module"); |
2337 | no_warn = sysfs_create_link(mod->drivers_dir, &drv->kobj, drv->name); | 2353 | driver_name = make_driver_name(drv); |
2354 | if (driver_name) { | ||
2355 | no_warn = sysfs_create_link(mod->drivers_dir, &drv->kobj, | ||
2356 | driver_name); | ||
2357 | kfree(driver_name); | ||
2358 | } | ||
2338 | } | 2359 | } |
2339 | EXPORT_SYMBOL(module_add_driver); | 2360 | EXPORT_SYMBOL(module_add_driver); |
2340 | 2361 | ||
2341 | void module_remove_driver(struct device_driver *drv) | 2362 | void module_remove_driver(struct device_driver *drv) |
2342 | { | 2363 | { |
2364 | char *driver_name; | ||
2365 | |||
2343 | if (!drv) | 2366 | if (!drv) |
2344 | return; | 2367 | return; |
2368 | |||
2345 | sysfs_remove_link(&drv->kobj, "module"); | 2369 | sysfs_remove_link(&drv->kobj, "module"); |
2346 | if (drv->owner && drv->owner->drivers_dir) | 2370 | if (drv->owner && drv->owner->drivers_dir) { |
2347 | sysfs_remove_link(drv->owner->drivers_dir, drv->name); | 2371 | driver_name = make_driver_name(drv); |
2372 | if (driver_name) { | ||
2373 | sysfs_remove_link(drv->owner->drivers_dir, | ||
2374 | driver_name); | ||
2375 | kfree(driver_name); | ||
2376 | } | ||
2377 | } | ||
2348 | } | 2378 | } |
2349 | EXPORT_SYMBOL(module_remove_driver); | 2379 | EXPORT_SYMBOL(module_remove_driver); |
2350 | 2380 | ||