diff options
author | Wang Chen <wangchen@cn.fujitsu.com> | 2008-07-24 00:30:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-07-24 13:47:30 -0400 |
commit | 0293902a4d66fab27d0ddcc0766e05dae68f004e (patch) | |
tree | 3a02e64ec212aa568eeaeae38065877e36a0c833 /drivers/message/i2o | |
parent | f700d6e5e5549cb9349d22043f4bd153792c621f (diff) |
I2O: handle sysfs_create_link() failures
Compile warning:
ignoring return value of `sysfs_create_link', declared with attribute warn_unused_result.
If sysfs_create_link failed, take care of the return value and do some
error handle after the failure.
Since sysfs_remove_link() will check whether a link exists, when removing the
link in error path, we don't need to care whether a link was created.
Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com>
Cc: Markus Lidel <Markus.Lidel@shadowconnect.com>
Cc: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/message/i2o')
-rw-r--r-- | drivers/message/i2o/device.c | 54 |
1 files changed, 42 insertions, 12 deletions
diff --git a/drivers/message/i2o/device.c b/drivers/message/i2o/device.c index 489d7c5c4965..8774c670e668 100644 --- a/drivers/message/i2o/device.c +++ b/drivers/message/i2o/device.c | |||
@@ -243,29 +243,41 @@ static int i2o_device_add(struct i2o_controller *c, i2o_lct_entry *entry) | |||
243 | 243 | ||
244 | /* create user entries for this device */ | 244 | /* create user entries for this device */ |
245 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.user_tid); | 245 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.user_tid); |
246 | if (tmp && (tmp != i2o_dev)) | 246 | if (tmp && (tmp != i2o_dev)) { |
247 | sysfs_create_link(&i2o_dev->device.kobj, &tmp->device.kobj, | 247 | rc = sysfs_create_link(&i2o_dev->device.kobj, |
248 | "user"); | 248 | &tmp->device.kobj, "user"); |
249 | if (rc) | ||
250 | goto unreg_dev; | ||
251 | } | ||
249 | 252 | ||
250 | /* create user entries refering to this device */ | 253 | /* create user entries refering to this device */ |
251 | list_for_each_entry(tmp, &c->devices, list) | 254 | list_for_each_entry(tmp, &c->devices, list) |
252 | if ((tmp->lct_data.user_tid == i2o_dev->lct_data.tid) | 255 | if ((tmp->lct_data.user_tid == i2o_dev->lct_data.tid) |
253 | && (tmp != i2o_dev)) | 256 | && (tmp != i2o_dev)) { |
254 | sysfs_create_link(&tmp->device.kobj, | 257 | rc = sysfs_create_link(&tmp->device.kobj, |
255 | &i2o_dev->device.kobj, "user"); | 258 | &i2o_dev->device.kobj, "user"); |
259 | if (rc) | ||
260 | goto rmlink1; | ||
261 | } | ||
256 | 262 | ||
257 | /* create parent entries for this device */ | 263 | /* create parent entries for this device */ |
258 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.parent_tid); | 264 | tmp = i2o_iop_find_device(i2o_dev->iop, i2o_dev->lct_data.parent_tid); |
259 | if (tmp && (tmp != i2o_dev)) | 265 | if (tmp && (tmp != i2o_dev)) { |
260 | sysfs_create_link(&i2o_dev->device.kobj, &tmp->device.kobj, | 266 | rc = sysfs_create_link(&i2o_dev->device.kobj, |
261 | "parent"); | 267 | &tmp->device.kobj, "parent"); |
268 | if (rc) | ||
269 | goto rmlink1; | ||
270 | } | ||
262 | 271 | ||
263 | /* create parent entries refering to this device */ | 272 | /* create parent entries refering to this device */ |
264 | list_for_each_entry(tmp, &c->devices, list) | 273 | list_for_each_entry(tmp, &c->devices, list) |
265 | if ((tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) | 274 | if ((tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) |
266 | && (tmp != i2o_dev)) | 275 | && (tmp != i2o_dev)) { |
267 | sysfs_create_link(&tmp->device.kobj, | 276 | rc = sysfs_create_link(&tmp->device.kobj, |
268 | &i2o_dev->device.kobj, "parent"); | 277 | &i2o_dev->device.kobj, "parent"); |
278 | if (rc) | ||
279 | goto rmlink2; | ||
280 | } | ||
269 | 281 | ||
270 | i2o_driver_notify_device_add_all(i2o_dev); | 282 | i2o_driver_notify_device_add_all(i2o_dev); |
271 | 283 | ||
@@ -273,6 +285,24 @@ static int i2o_device_add(struct i2o_controller *c, i2o_lct_entry *entry) | |||
273 | 285 | ||
274 | return 0; | 286 | return 0; |
275 | 287 | ||
288 | rmlink2: | ||
289 | /* If link creating failed halfway, we loop whole list to cleanup. | ||
290 | * And we don't care wrong removing of link, because sysfs_remove_link | ||
291 | * will take care of it. | ||
292 | */ | ||
293 | list_for_each_entry(tmp, &c->devices, list) { | ||
294 | if (tmp->lct_data.parent_tid == i2o_dev->lct_data.tid) | ||
295 | sysfs_remove_link(&tmp->device.kobj, "parent"); | ||
296 | } | ||
297 | sysfs_remove_link(&i2o_dev->device.kobj, "parent"); | ||
298 | rmlink1: | ||
299 | list_for_each_entry(tmp, &c->devices, list) | ||
300 | if (tmp->lct_data.user_tid == i2o_dev->lct_data.tid) | ||
301 | sysfs_remove_link(&tmp->device.kobj, "user"); | ||
302 | sysfs_remove_link(&i2o_dev->device.kobj, "user"); | ||
303 | unreg_dev: | ||
304 | list_del(&i2o_dev->list); | ||
305 | device_unregister(&i2o_dev->device); | ||
276 | err: | 306 | err: |
277 | kfree(i2o_dev); | 307 | kfree(i2o_dev); |
278 | return rc; | 308 | return rc; |