[PATCH] driver core: fix error handling in bus_add_device
The error handling in bus_add_device() and device_attach() is simply non-existing. This patch propagates any error from device_attach to the upper layers to allow for a proper recovery. From: Hannes Reinecke <hare@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
acaefc25d2
commit
ca2b94ba12
@@ -270,12 +270,15 @@ int bus_add_device(struct device * dev)
|
|||||||
|
|
||||||
if (bus) {
|
if (bus) {
|
||||||
pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
|
pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
|
||||||
device_attach(dev);
|
error = device_attach(dev);
|
||||||
klist_add_tail(&bus->klist_devices, &dev->knode_bus);
|
klist_add_tail(&bus->klist_devices, &dev->knode_bus);
|
||||||
device_add_attrs(bus, dev);
|
if (error >= 0)
|
||||||
|
error = device_add_attrs(bus, dev);
|
||||||
|
if (!error) {
|
||||||
sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
|
sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id);
|
||||||
sysfs_create_link(&dev->kobj, &dev->bus->subsys.kset.kobj, "bus");
|
sysfs_create_link(&dev->kobj, &dev->bus->subsys.kset.kobj, "bus");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -394,7 +397,7 @@ static int bus_rescan_devices_helper(struct device *dev, void *data)
|
|||||||
{
|
{
|
||||||
int *count = data;
|
int *count = data;
|
||||||
|
|
||||||
if (!dev->driver && device_attach(dev))
|
if (!dev->driver && (device_attach(dev) > 0))
|
||||||
(*count)++;
|
(*count)++;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -119,7 +119,8 @@ static int __device_attach(struct device_driver * drv, void * data)
|
|||||||
* driver_probe_device() for each pair. If a compatible
|
* driver_probe_device() for each pair. If a compatible
|
||||||
* pair is found, break out and return.
|
* pair is found, break out and return.
|
||||||
*
|
*
|
||||||
* Returns 1 if the device was bound to a driver; 0 otherwise.
|
* Returns 1 if the device was bound to a driver;
|
||||||
|
* 0 if no matching device was found; error code otherwise.
|
||||||
*/
|
*/
|
||||||
int device_attach(struct device * dev)
|
int device_attach(struct device * dev)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user