diff options
author | Bart Van Assche <bart.vanassche@sandisk.com> | 2015-11-20 17:11:01 -0500 |
---|---|---|
committer | James Bottomley <JBottomley@Odin.com> | 2015-12-02 14:53:44 -0500 |
commit | e619e6cbecb7fe97a924d625e848605333457b13 (patch) | |
tree | 7ea5bbe715b8a571028dc83e6200428f8c14d48b | |
parent | 8005c49d9aea74d382f474ce11afbbc7d7130bec (diff) |
Revert "scsi: Fix a bdi reregistration race"
The SCSI sd driver probes SCSI devices asynchronously. The sd_remove()
function, called indirectly by device_del(), waits until asynchronous
probing has finished. Since the block layer queue must only be cleaned
up after probing has finished, device_del() has to be called before
blk_cleanup_queue(). Hence revert commit bf2cf3baa20b.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
-rw-r--r-- | drivers/scsi/scsi_sysfs.c | 14 |
1 files changed, 3 insertions, 11 deletions
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 8d2312239ae0..f5ace2bfc6db 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -1110,7 +1110,9 @@ void __scsi_remove_device(struct scsi_device *sdev) | |||
1110 | device_unregister(&sdev->sdev_dev); | 1110 | device_unregister(&sdev->sdev_dev); |
1111 | transport_remove_device(dev); | 1111 | transport_remove_device(dev); |
1112 | scsi_dh_remove_device(sdev); | 1112 | scsi_dh_remove_device(sdev); |
1113 | } | 1113 | device_del(dev); |
1114 | } else | ||
1115 | put_device(&sdev->sdev_dev); | ||
1114 | 1116 | ||
1115 | /* | 1117 | /* |
1116 | * Stop accepting new requests and wait until all queuecommand() and | 1118 | * Stop accepting new requests and wait until all queuecommand() and |
@@ -1121,16 +1123,6 @@ void __scsi_remove_device(struct scsi_device *sdev) | |||
1121 | blk_cleanup_queue(sdev->request_queue); | 1123 | blk_cleanup_queue(sdev->request_queue); |
1122 | cancel_work_sync(&sdev->requeue_work); | 1124 | cancel_work_sync(&sdev->requeue_work); |
1123 | 1125 | ||
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) | 1126 | if (sdev->host->hostt->slave_destroy) |
1135 | sdev->host->hostt->slave_destroy(sdev); | 1127 | sdev->host->hostt->slave_destroy(sdev); |
1136 | transport_destroy_device(dev); | 1128 | transport_destroy_device(dev); |