diff options
author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-08-01 02:41:22 +0200 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2009-08-23 00:52:13 +0200 |
commit | 43d8eb9cfd0aea93be32181c64e18191b69c211c (patch) | |
tree | 76725fe2ea080cb26c7503dbab8226181de1aa04 /drivers/misc/enclosure.c | |
parent | [SCSI] ses: fix hotplug with multiple devices and expanders (diff) | |
download | linux-43d8eb9cfd0aea93be32181c64e18191b69c211c.tar.xz linux-43d8eb9cfd0aea93be32181c64e18191b69c211c.zip |
[SCSI] ses: add support for enclosure component hot removal
Right at the moment, hot removal of a device within an enclosure does
nothing (because the intf_remove only copes with enclosure removal not
with component removal). Fix this by adding a function to remove the
component. Also needed to fix the prototype of
enclosure_remove_device, since we know the device we've removed but
not the internal component number
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/misc/enclosure.c')
-rw-r--r-- | drivers/misc/enclosure.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c index 789d12128c24..850706a5e553 100644 --- a/drivers/misc/enclosure.c +++ b/drivers/misc/enclosure.c @@ -332,19 +332,25 @@ EXPORT_SYMBOL_GPL(enclosure_add_device); * Returns zero on success or an error. * */ -int enclosure_remove_device(struct enclosure_device *edev, int component) +int enclosure_remove_device(struct enclosure_device *edev, struct device *dev) { struct enclosure_component *cdev; + int i; - if (!edev || component >= edev->components) + if (!edev || !dev) return -EINVAL; - cdev = &edev->component[component]; - - device_del(&cdev->cdev); - put_device(cdev->dev); - cdev->dev = NULL; - return device_add(&cdev->cdev); + for (i = 0; i < edev->components; i++) { + cdev = &edev->component[i]; + if (cdev->dev == dev) { + enclosure_remove_links(cdev); + device_del(&cdev->cdev); + put_device(dev); + cdev->dev = NULL; + return device_add(&cdev->cdev); + } + } + return -ENODEV; } EXPORT_SYMBOL_GPL(enclosure_remove_device); |