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