Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6:
Driver Core: do not oops when driver_unregister() is called for unregistered drivers
sysfs: file.c: use create_singlethread_workqueue()

+12 -3
+3 -1
drivers/base/bus.c
··· 700 700 } 701 701 702 702 kobject_uevent(&priv->kobj, KOBJ_ADD); 703 - return error; 703 + return 0; 704 704 out_unregister: 705 + kfree(drv->p); 706 + drv->p = NULL; 705 707 kobject_put(&priv->kobj); 706 708 out_put_bus: 707 709 bus_put(bus);
+4 -1
drivers/base/core.c
··· 879 879 } 880 880 881 881 if (!dev_name(dev)) 882 - goto done; 882 + goto name_error; 883 883 884 884 pr_debug("device: '%s': %s\n", dev_name(dev), __func__); 885 885 ··· 978 978 cleanup_device_parent(dev); 979 979 if (parent) 980 980 put_device(parent); 981 + name_error: 982 + kfree(dev->p); 983 + dev->p = NULL; 981 984 goto done; 982 985 } 983 986
+4
drivers/base/driver.c
··· 257 257 */ 258 258 void driver_unregister(struct device_driver *drv) 259 259 { 260 + if (!drv || !drv->p) { 261 + WARN(1, "Unexpected driver unregister!\n"); 262 + return; 263 + } 260 264 driver_remove_groups(drv, drv->groups); 261 265 bus_remove_driver(drv); 262 266 }
+1 -1
fs/sysfs/file.c
··· 723 723 mutex_unlock(&sysfs_workq_mutex); 724 724 725 725 if (sysfs_workqueue == NULL) { 726 - sysfs_workqueue = create_workqueue("sysfsd"); 726 + sysfs_workqueue = create_singlethread_workqueue("sysfsd"); 727 727 if (sysfs_workqueue == NULL) { 728 728 module_put(owner); 729 729 return -ENOMEM;