Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

[PATCH] driver core: fix built-in drivers sysfs links

built-in drivers had broken sysfs links that caused bootup hangs for
certain driver unregistry sequences.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Kay Sievers and committed by
Linus Torvalds
0c84ce26 bcd9b89c

+15 -4
+1
include/linux/device.h
··· 128 128 129 129 struct module * owner; 130 130 const char * mod_name; /* used for built-in modules */ 131 + struct module_kobject * mkobj; 131 132 132 133 int (*probe) (struct device * dev); 133 134 int (*remove) (struct device * dev);
+14 -4
kernel/module.c
··· 2384 2384 2385 2385 /* Lookup built-in module entry in /sys/modules */ 2386 2386 mkobj = kset_find_obj(&module_subsys.kset, drv->mod_name); 2387 - if (mkobj) 2387 + if (mkobj) { 2388 2388 mk = container_of(mkobj, struct module_kobject, kobj); 2389 + /* remember our module structure */ 2390 + drv->mkobj = mk; 2391 + /* kset_find_obj took a reference */ 2392 + kobject_put(mkobj); 2393 + } 2389 2394 } 2390 2395 2391 2396 if (!mk) ··· 2410 2405 2411 2406 void module_remove_driver(struct device_driver *drv) 2412 2407 { 2408 + struct module_kobject *mk = NULL; 2413 2409 char *driver_name; 2414 2410 2415 2411 if (!drv) 2416 2412 return; 2417 2413 2418 2414 sysfs_remove_link(&drv->kobj, "module"); 2419 - if (drv->owner && drv->owner->mkobj.drivers_dir) { 2415 + 2416 + if (drv->owner) 2417 + mk = &drv->owner->mkobj; 2418 + else if (drv->mkobj) 2419 + mk = drv->mkobj; 2420 + if (mk && mk->drivers_dir) { 2420 2421 driver_name = make_driver_name(drv); 2421 2422 if (driver_name) { 2422 - sysfs_remove_link(drv->owner->mkobj.drivers_dir, 2423 - driver_name); 2423 + sysfs_remove_link(mk->drivers_dir, driver_name); 2424 2424 kfree(driver_name); 2425 2425 } 2426 2426 }