Commit f30c53a873d0d227493197064b8886af2d57bbd6
Committed by
Greg Kroah-Hartman
1 parent
c744aeae9d
Exists in
master
and in
4 other branches
MODULES: add the module name for built in kernel drivers
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Showing 4 changed files with 31 additions and 17 deletions Side-by-side Diff
include/linux/device.h
include/linux/module.h
... | ... | @@ -58,6 +58,7 @@ |
58 | 58 | { |
59 | 59 | struct kobject kobj; |
60 | 60 | struct module *mod; |
61 | + struct kobject *drivers_dir; | |
61 | 62 | }; |
62 | 63 | |
63 | 64 | /* These are either module local, or the kernel's dummy ones. */ |
... | ... | @@ -263,7 +264,6 @@ |
263 | 264 | struct module_attribute *modinfo_attrs; |
264 | 265 | const char *version; |
265 | 266 | const char *srcversion; |
266 | - struct kobject *drivers_dir; | |
267 | 267 | |
268 | 268 | /* Exported symbols */ |
269 | 269 | const struct kernel_symbol *syms; |
kernel/module.c
... | ... | @@ -1131,8 +1131,8 @@ |
1131 | 1131 | if (err) |
1132 | 1132 | goto out; |
1133 | 1133 | |
1134 | - mod->drivers_dir = kobject_add_dir(&mod->mkobj.kobj, "drivers"); | |
1135 | - if (!mod->drivers_dir) { | |
1134 | + mod->mkobj.drivers_dir = kobject_add_dir(&mod->mkobj.kobj, "drivers"); | |
1135 | + if (!mod->mkobj.drivers_dir) { | |
1136 | 1136 | err = -ENOMEM; |
1137 | 1137 | goto out_unreg; |
1138 | 1138 | } |
... | ... | @@ -1151,7 +1151,7 @@ |
1151 | 1151 | out_unreg_param: |
1152 | 1152 | module_param_sysfs_remove(mod); |
1153 | 1153 | out_unreg_drivers: |
1154 | - kobject_unregister(mod->drivers_dir); | |
1154 | + kobject_unregister(mod->mkobj.drivers_dir); | |
1155 | 1155 | out_unreg: |
1156 | 1156 | kobject_del(&mod->mkobj.kobj); |
1157 | 1157 | kobject_put(&mod->mkobj.kobj); |
... | ... | @@ -1163,7 +1163,7 @@ |
1163 | 1163 | { |
1164 | 1164 | module_remove_modinfo_attrs(mod); |
1165 | 1165 | module_param_sysfs_remove(mod); |
1166 | - kobject_unregister(mod->drivers_dir); | |
1166 | + kobject_unregister(mod->mkobj.drivers_dir); | |
1167 | 1167 | |
1168 | 1168 | kobject_unregister(&mod->mkobj.kobj); |
1169 | 1169 | } |
1170 | 1170 | |
1171 | 1171 | |
1172 | 1172 | |
1173 | 1173 | |
... | ... | @@ -2344,15 +2344,30 @@ |
2344 | 2344 | { |
2345 | 2345 | char *driver_name; |
2346 | 2346 | int no_warn; |
2347 | + struct module_kobject *mk = NULL; | |
2347 | 2348 | |
2348 | - if (!mod || !drv) | |
2349 | + if (!drv) | |
2349 | 2350 | return; |
2350 | 2351 | |
2352 | + if (mod) | |
2353 | + mk = &mod->mkobj; | |
2354 | + else if (drv->mod_name) { | |
2355 | + struct kobject *mkobj; | |
2356 | + | |
2357 | + /* Lookup built-in module entry in /sys/modules */ | |
2358 | + mkobj = kset_find_obj(&module_subsys.kset, drv->mod_name); | |
2359 | + if (mkobj) | |
2360 | + mk = container_of(mkobj, struct module_kobject, kobj); | |
2361 | + } | |
2362 | + | |
2363 | + if (!mk) | |
2364 | + return; | |
2365 | + | |
2351 | 2366 | /* Don't check return codes; these calls are idempotent */ |
2352 | - no_warn = sysfs_create_link(&drv->kobj, &mod->mkobj.kobj, "module"); | |
2367 | + no_warn = sysfs_create_link(&drv->kobj, &mk->kobj, "module"); | |
2353 | 2368 | driver_name = make_driver_name(drv); |
2354 | 2369 | if (driver_name) { |
2355 | - no_warn = sysfs_create_link(mod->drivers_dir, &drv->kobj, | |
2370 | + no_warn = sysfs_create_link(mk->drivers_dir, &drv->kobj, | |
2356 | 2371 | driver_name); |
2357 | 2372 | kfree(driver_name); |
2358 | 2373 | } |
2359 | 2374 | |
... | ... | @@ -2367,10 +2382,10 @@ |
2367 | 2382 | return; |
2368 | 2383 | |
2369 | 2384 | sysfs_remove_link(&drv->kobj, "module"); |
2370 | - if (drv->owner && drv->owner->drivers_dir) { | |
2385 | + if (drv->owner && drv->owner->mkobj.drivers_dir) { | |
2371 | 2386 | driver_name = make_driver_name(drv); |
2372 | 2387 | if (driver_name) { |
2373 | - sysfs_remove_link(drv->owner->drivers_dir, | |
2388 | + sysfs_remove_link(drv->owner->mkobj.drivers_dir, | |
2374 | 2389 | driver_name); |
2375 | 2390 | kfree(driver_name); |
2376 | 2391 | } |
kernel/params.c
... | ... | @@ -561,14 +561,12 @@ |
561 | 561 | mk->mod = THIS_MODULE; |
562 | 562 | kobj_set_kset_s(mk, module_subsys); |
563 | 563 | kobject_set_name(&mk->kobj, name); |
564 | - ret = kobject_register(&mk->kobj); | |
564 | + kobject_init(&mk->kobj); | |
565 | + ret = kobject_add(&mk->kobj); | |
565 | 566 | BUG_ON(ret < 0); |
566 | - | |
567 | - /* no need to keep the kobject if no parameter is exported */ | |
568 | - if (!param_sysfs_setup(mk, kparam, num_params, name_skip)) { | |
569 | - kobject_unregister(&mk->kobj); | |
570 | - kfree(mk); | |
571 | - } | |
567 | + param_sysfs_setup(mk, kparam, num_params, name_skip); | |
568 | + mk->drivers_dir = kobject_add_dir(&mk->kobj, "drivers"); | |
569 | + kobject_uevent(&mk->kobj, KOBJ_ADD); | |
572 | 570 | } |
573 | 571 | |
574 | 572 | /* |