diff options
Diffstat (limited to 'drivers/scsi/scsi_sysfs.c')
| -rw-r--r-- | drivers/scsi/scsi_sysfs.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 8d2312239ae0..21930c9ac9cd 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
| @@ -1102,6 +1102,14 @@ void __scsi_remove_device(struct scsi_device *sdev) | |||
| 1102 | { | 1102 | { |
| 1103 | struct device *dev = &sdev->sdev_gendev; | 1103 | struct device *dev = &sdev->sdev_gendev; |
| 1104 | 1104 | ||
| 1105 | /* | ||
| 1106 | * This cleanup path is not reentrant and while it is impossible | ||
| 1107 | * to get a new reference with scsi_device_get() someone can still | ||
| 1108 | * hold a previously acquired one. | ||
| 1109 | */ | ||
| 1110 | if (sdev->sdev_state == SDEV_DEL) | ||
| 1111 | return; | ||
| 1112 | |||
| 1105 | if (sdev->is_visible) { | 1113 | if (sdev->is_visible) { |
| 1106 | if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) | 1114 | if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) |
| 1107 | return; | 1115 | return; |
| @@ -1110,7 +1118,9 @@ void __scsi_remove_device(struct scsi_device *sdev) | |||
| 1110 | device_unregister(&sdev->sdev_dev); | 1118 | device_unregister(&sdev->sdev_dev); |
| 1111 | transport_remove_device(dev); | 1119 | transport_remove_device(dev); |
| 1112 | scsi_dh_remove_device(sdev); | 1120 | scsi_dh_remove_device(sdev); |
| 1113 | } | 1121 | device_del(dev); |
| 1122 | } else | ||
| 1123 | put_device(&sdev->sdev_dev); | ||
| 1114 | 1124 | ||
| 1115 | /* | 1125 | /* |
| 1116 | * Stop accepting new requests and wait until all queuecommand() and | 1126 | * Stop accepting new requests and wait until all queuecommand() and |
| @@ -1121,16 +1131,6 @@ void __scsi_remove_device(struct scsi_device *sdev) | |||
| 1121 | blk_cleanup_queue(sdev->request_queue); | 1131 | blk_cleanup_queue(sdev->request_queue); |
| 1122 | cancel_work_sync(&sdev->requeue_work); | 1132 | cancel_work_sync(&sdev->requeue_work); |
| 1123 | 1133 | ||
| 1124 | /* | ||
| 1125 | * Remove the device after blk_cleanup_queue() has been called such | ||
| 1126 | * a possible bdi_register() call with the same name occurs after | ||
| 1127 | * blk_cleanup_queue() has called bdi_destroy(). | ||
| 1128 | */ | ||
| 1129 | if (sdev->is_visible) | ||
| 1130 | device_del(dev); | ||
| 1131 | else | ||
| 1132 | put_device(&sdev->sdev_dev); | ||
| 1133 | |||
| 1134 | if (sdev->host->hostt->slave_destroy) | 1134 | if (sdev->host->hostt->slave_destroy) |
| 1135 | sdev->host->hostt->slave_destroy(sdev); | 1135 | sdev->host->hostt->slave_destroy(sdev); |
| 1136 | transport_destroy_device(dev); | 1136 | transport_destroy_device(dev); |
