diff options
author | Hannes Reinecke <hare@suse.de> | 2005-05-18 04:42:23 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-06-20 18:15:31 -0400 |
commit | ca2b94ba12f3c36fd3d6ed9d38b3798d4dad0d8b (patch) | |
tree | d9b85e0f423d1cd0a9ad1c72cec7464bcf50c126 /drivers/base | |
parent | acaefc25d21f850e47ecc5098d1e0bc442c526be (diff) |
[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>
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/bus.c | 13 | ||||
-rw-r--r-- | drivers/base/dd.c | 3 |
2 files changed, 10 insertions, 6 deletions
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 4eb19525e064..43722af90bdd 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
@@ -270,11 +270,14 @@ int bus_add_device(struct device * dev) | |||
270 | 270 | ||
271 | if (bus) { | 271 | if (bus) { |
272 | pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id); | 272 | pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id); |
273 | device_attach(dev); | 273 | error = device_attach(dev); |
274 | klist_add_tail(&bus->klist_devices, &dev->knode_bus); | 274 | klist_add_tail(&bus->klist_devices, &dev->knode_bus); |
275 | device_add_attrs(bus, dev); | 275 | if (error >= 0) |
276 | sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id); | 276 | error = device_add_attrs(bus, dev); |
277 | sysfs_create_link(&dev->kobj, &dev->bus->subsys.kset.kobj, "bus"); | 277 | if (!error) { |
278 | sysfs_create_link(&bus->devices.kobj, &dev->kobj, dev->bus_id); | ||
279 | sysfs_create_link(&dev->kobj, &dev->bus->subsys.kset.kobj, "bus"); | ||
280 | } | ||
278 | } | 281 | } |
279 | return error; | 282 | return error; |
280 | } | 283 | } |
@@ -394,7 +397,7 @@ static int bus_rescan_devices_helper(struct device *dev, void *data) | |||
394 | { | 397 | { |
395 | int *count = data; | 398 | int *count = data; |
396 | 399 | ||
397 | if (!dev->driver && device_attach(dev)) | 400 | if (!dev->driver && (device_attach(dev) > 0)) |
398 | (*count)++; | 401 | (*count)++; |
399 | 402 | ||
400 | return 0; | 403 | return 0; |
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index eab2030c506d..6db3a789c54f 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -119,7 +119,8 @@ static int __device_attach(struct device_driver * drv, void * data) | |||
119 | * driver_probe_device() for each pair. If a compatible | 119 | * driver_probe_device() for each pair. If a compatible |
120 | * pair is found, break out and return. | 120 | * pair is found, break out and return. |
121 | * | 121 | * |
122 | * Returns 1 if the device was bound to a driver; 0 otherwise. | 122 | * Returns 1 if the device was bound to a driver; |
123 | * 0 if no matching device was found; error code otherwise. | ||
123 | */ | 124 | */ |
124 | int device_attach(struct device * dev) | 125 | int device_attach(struct device * dev) |
125 | { | 126 | { |