| From: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Date: Wed, 8 Jan 2020 17:21:32 -0800 |
| Subject: scsi: enclosure: Fix stale device oops with hot replug |
| |
| commit 529244bd1afc102ab164429d338d310d5d65e60d upstream. |
| |
| Doing an add/remove/add on a SCSI device in an enclosure leads to an oops |
| caused by poisoned values in the enclosure device list pointers. The |
| reason is because we are keeping the enclosure device across the enclosed |
| device add/remove/add but the current code is doing a |
| device_add/device_del/device_add on it. This is the wrong thing to do in |
| sysfs, so fix it by not doing a device_del on the enclosure device simply |
| because of a hot remove of the drive in the slot. |
| |
| [mkp: added missing email addresses] |
| |
| Fixes: 43d8eb9cfd0a ("[SCSI] ses: add support for enclosure component hot removal") |
| Link: https://lore.kernel.org/r/1578532892.3852.10.camel@HansenPartnership.com |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Reported-by: Luo Jiaxing <luojiaxing@huawei.com> |
| Tested-by: John Garry <john.garry@huawei.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/misc/enclosure.c | 3 +-- |
| 1 file changed, 1 insertion(+), 2 deletions(-) |
| |
| --- a/drivers/misc/enclosure.c |
| +++ b/drivers/misc/enclosure.c |
| @@ -364,10 +364,9 @@ int enclosure_remove_device(struct enclo |
| 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 0; |
| } |
| } |
| return -ENODEV; |