History

[PATCH] Driver core: Fix prefix driver links in /sys/module by bus-name

Modules may have drivers with the same name on different buses. This patch fixes this problem.

Kay Sievers committed 19 years ago

Commit 7f422e21 parent 05a80571 file · +33 −5Browse files

Showing the changes to kernel/module.c (1 of 1 file). Show all

Unified · Split

kernel/module.c+33−5
@@ -1148,10 +1148,10 @@ static int mod_sysfs_setup(struct module *mod, · 1147 unmodified lines
11481148 kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD);
11491149 return 0;
11501150
1151−out_unreg_drivers:
1152− kobject_unregister(mod->drivers_dir);
11531151 out_unreg_param:
11541152 module_param_sysfs_remove(mod);
1153+out_unreg_drivers:
1154+ kobject_unregister(mod->drivers_dir);
11551155 out_unreg:
11561156 kobject_del(&mod->mkobj.kobj);
11571157 kobject_put(&mod->mkobj.kobj);
@@ -2327,8 +2327,22 @@ void print_modules(void) · 1169 unmodified lines
23272327 printk("\n");
23282328 }
23292329
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+
23302343 void module_add_driver(struct module *mod, struct device_driver *drv)
23312344 {
2345+ char *driver_name;
23322346 int no_warn;
23332347
23342348 if (!mod || !drv)
@@ -2336,17 +2350,31 @@ void module_add_driver(struct module *mod, struct device_driver *drv) · 1 unmodified line
23362350
23372351 /* Don't check return codes; these calls are idempotent */
23382352 no_warn = sysfs_create_link(&drv->kobj, &mod->mkobj.kobj, "module");
2339− 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+ }
23402359 }
23412360 EXPORT_SYMBOL(module_add_driver);
23422361
23432362 void module_remove_driver(struct device_driver *drv)
23442363 {
2364+ char *driver_name;
2365+
23452366 if (!drv)
23462367 return;
2368+
23472369 sysfs_remove_link(&drv->kobj, "module");
2348− if (drv->owner && drv->owner->drivers_dir)
2349− sysfs_remove_link(drv->owner->drivers_dir, drv->name);
2370+ if (drv->owner && drv->owner->drivers_dir) {
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+ }
23502378 }
23512379 EXPORT_SYMBOL(module_remove_driver);
23522380