Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit deeb1034 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 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()
parents c8bce3d3 5c8563d7
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -700,8 +700,10 @@ int bus_add_driver(struct device_driver *drv)
	}
	}


	kobject_uevent(&priv->kobj, KOBJ_ADD);
	kobject_uevent(&priv->kobj, KOBJ_ADD);
	return error;
	return 0;
out_unregister:
out_unregister:
	kfree(drv->p);
	drv->p = NULL;
	kobject_put(&priv->kobj);
	kobject_put(&priv->kobj);
out_put_bus:
out_put_bus:
	bus_put(bus);
	bus_put(bus);
+4 −1
Original line number Original line Diff line number Diff line
@@ -879,7 +879,7 @@ int device_add(struct device *dev)
	}
	}


	if (!dev_name(dev))
	if (!dev_name(dev))
		goto done;
		goto name_error;


	pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
	pr_debug("device: '%s': %s\n", dev_name(dev), __func__);


@@ -978,6 +978,9 @@ int device_add(struct device *dev)
	cleanup_device_parent(dev);
	cleanup_device_parent(dev);
	if (parent)
	if (parent)
		put_device(parent);
		put_device(parent);
name_error:
	kfree(dev->p);
	dev->p = NULL;
	goto done;
	goto done;
}
}


+4 −0
Original line number Original line Diff line number Diff line
@@ -257,6 +257,10 @@ EXPORT_SYMBOL_GPL(driver_register);
 */
 */
void driver_unregister(struct device_driver *drv)
void driver_unregister(struct device_driver *drv)
{
{
	if (!drv || !drv->p) {
		WARN(1, "Unexpected driver unregister!\n");
		return;
	}
	driver_remove_groups(drv, drv->groups);
	driver_remove_groups(drv, drv->groups);
	bus_remove_driver(drv);
	bus_remove_driver(drv);
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -723,7 +723,7 @@ int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
	mutex_unlock(&sysfs_workq_mutex);
	mutex_unlock(&sysfs_workq_mutex);


	if (sysfs_workqueue == NULL) {
	if (sysfs_workqueue == NULL) {
		sysfs_workqueue = create_workqueue("sysfsd");
		sysfs_workqueue = create_singlethread_workqueue("sysfsd");
		if (sysfs_workqueue == NULL) {
		if (sysfs_workqueue == NULL) {
			module_put(owner);
			module_put(owner);
			return -ENOMEM;
			return -ENOMEM;