diff options
| author | Jean Delvare <khali@linux-fr.org> | 2006-08-15 12:30:24 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-26 18:38:50 -0400 |
| commit | defcb46ed4666095677c8f52904b9e328587a20d (patch) | |
| tree | 99ff28198c12230510a9864d64971268c2d75617 | |
| parent | b119c6c952a086f74202ccda4b7ed72161bb6522 (diff) | |
i2c: __must_check fixes, i2c-dev
i2c: __must_check fixes (i2c-dev)
Check for error on sysfs file creation.
Check for error on device creation.
Delete sysfs file on device destruction.
I couldn't test this one beyond compilation, as it applies on top of
another patch in Greg's tree [1] which breaks all my systems when I
apply it (my udev isn't recent enough.) Anyone with bleeding edge udev
is welcome to test and report.
[1] http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/i2c/i2c-dev-device.patch
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/i2c/i2c-dev.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 2ce0833912..567fb05aec 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c | |||
| @@ -406,6 +406,7 @@ static struct class *i2c_dev_class; | |||
| 406 | static int i2cdev_attach_adapter(struct i2c_adapter *adap) | 406 | static int i2cdev_attach_adapter(struct i2c_adapter *adap) |
| 407 | { | 407 | { |
| 408 | struct i2c_dev *i2c_dev; | 408 | struct i2c_dev *i2c_dev; |
| 409 | int res; | ||
| 409 | 410 | ||
| 410 | i2c_dev = get_free_i2c_dev(adap); | 411 | i2c_dev = get_free_i2c_dev(adap); |
| 411 | if (IS_ERR(i2c_dev)) | 412 | if (IS_ERR(i2c_dev)) |
| @@ -419,14 +420,20 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap) | |||
| 419 | MKDEV(I2C_MAJOR, adap->nr), | 420 | MKDEV(I2C_MAJOR, adap->nr), |
| 420 | &adap->dev, "i2c-%d", | 421 | &adap->dev, "i2c-%d", |
| 421 | adap->nr); | 422 | adap->nr); |
| 422 | if (!i2c_dev->class_dev) | 423 | if (!i2c_dev->class_dev) { |
| 424 | res = -ENODEV; | ||
| 423 | goto error; | 425 | goto error; |
| 424 | class_device_create_file(i2c_dev->class_dev, &class_device_attr_name); | 426 | } |
| 427 | res = class_device_create_file(i2c_dev->class_dev, &class_device_attr_name); | ||
| 428 | if (res) | ||
| 429 | goto error_destroy; | ||
| 425 | return 0; | 430 | return 0; |
| 431 | error_destroy: | ||
| 432 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); | ||
| 426 | error: | 433 | error: |
| 427 | return_i2c_dev(i2c_dev); | 434 | return_i2c_dev(i2c_dev); |
| 428 | kfree(i2c_dev); | 435 | kfree(i2c_dev); |
| 429 | return -ENODEV; | 436 | return res; |
| 430 | } | 437 | } |
| 431 | 438 | ||
| 432 | static int i2cdev_detach_adapter(struct i2c_adapter *adap) | 439 | static int i2cdev_detach_adapter(struct i2c_adapter *adap) |
| @@ -437,6 +444,7 @@ static int i2cdev_detach_adapter(struct i2c_adapter *adap) | |||
| 437 | if (!i2c_dev) | 444 | if (!i2c_dev) |
| 438 | return -ENODEV; | 445 | return -ENODEV; |
| 439 | 446 | ||
| 447 | class_device_remove_file(i2c_dev->class_dev, &class_device_attr_name); | ||
| 440 | return_i2c_dev(i2c_dev); | 448 | return_i2c_dev(i2c_dev); |
| 441 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); | 449 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); |
| 442 | kfree(i2c_dev); | 450 | kfree(i2c_dev); |
