Driver core fix for 2.6.20-rc3
PATCH 1/1 Driver core fix for 2.6.20-rc3
Here is a single driver core patch for 2.6.20-rc3. It somehow got dropped in the last round of patches for 2.6.20-rc1, and has been in the -mm tree for quite a while. It fixes an issue with driver names in modules to make sure we do not create duplicate symlinks.
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6.git/
Patches will be sent as a follow-on to this message to lkml for people to see.
thanks,
greg k-h
kernel/module.c | 38 +++++++++++++++++++++++++++++++++----- 1 files changed, 33 insertions(+), 5 deletions(-)
---------------
Kay Sievers (1):
Driver core: Fix prefix driver links in /sys/module by bus-name
PATCH 1/1 Driver core: Fix prefix driver links in /sys/module by bus-name
From: Kay Sievers <[email protected]>
Modules may have drivers with the same name on different buses. This patch fixes this problem.
--- kernel/module.c | 38 +++++++++++++++++++++++++++++++++----- 1 files changed, 33 insertions(+), 5 deletions(-)
kernel/module.c +33 -5
@@ -1148,10 +1148,10 @@ static int mod_sysfs_setup(struct module *mod,kobject_uevent (&mod->mkobj.kobj,KOBJ_ADD );return 0 ; -out_unreg_drivers: -kobject_unregister (mod->drivers_dir); out_unreg_param:module_param_sysfs_remove (mod); +out_unreg_drivers: +kobject_unregister (mod->drivers_dir); out_unreg:kobject_del (&mod->mkobj.kobj);kobject_put (&mod->mkobj.kobj);
@@ -2327,8 +2327,22 @@ void print_modules(void)printk ("\n" ); } +static char *make_driver_name (struct device_driver *drv) +{ +char *driver_name; + + driver_name =kmalloc (strlen (drv->name) +strlen (drv->bus->name) +2 , +GFP_KERNEL ); +if (!driver_name) +return NULL ; + +sprintf (driver_name,"%s:%s" , drv->bus->name, drv->name); +return driver_name; +} +void module_add_driver (struct module *mod,struct device_driver *drv) { +char *driver_name;int no_warn;if (!mod || !drv)
@@ -2336,17 +2350,31 @@ void module_add_driver(struct module *mod, struct device_driver *drv)/* Don't check return codes; these calls are idempotent */ no_warn =sysfs_create_link (&drv->kobj, &mod->mkobj.kobj,"module" ); - no_warn =sysfs_create_link (mod->drivers_dir, &drv->kobj, drv->name); + driver_name =make_driver_name (drv); +if (driver_name) { + no_warn =sysfs_create_link (mod->drivers_dir, &drv->kobj, + driver_name); +kfree (driver_name); + } }EXPORT_SYMBOL (module_add_driver);void module_remove_driver (struct device_driver *drv) { +char *driver_name; +if (!drv)return ; +sysfs_remove_link (&drv->kobj,"module" ); -if (drv->owner && drv->owner->drivers_dir) -sysfs_remove_link (drv->owner->drivers_dir, drv->name); +if (drv->owner && drv->owner->drivers_dir) { + driver_name =make_driver_name (drv); +if (driver_name) { +sysfs_remove_link (drv->owner->drivers_dir, + driver_name); +kfree (driver_name); + } + } }EXPORT_SYMBOL (module_remove_driver);
Signature · 1 line
1.4.4.3