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 bf2cf3baa2
.
Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
Родитель
8005c49d9a
Коммит
e619e6cbec
|
@ -1110,7 +1110,9 @@ void __scsi_remove_device(struct scsi_device *sdev)
|
|||
device_unregister(&sdev->sdev_dev);
|
||||
transport_remove_device(dev);
|
||||
scsi_dh_remove_device(sdev);
|
||||
}
|
||||
device_del(dev);
|
||||
} else
|
||||
put_device(&sdev->sdev_dev);
|
||||
|
||||
/*
|
||||
* Stop accepting new requests and wait until all queuecommand() and
|
||||
|
@ -1121,16 +1123,6 @@ void __scsi_remove_device(struct scsi_device *sdev)
|
|||
blk_cleanup_queue(sdev->request_queue);
|
||||
cancel_work_sync(&sdev->requeue_work);
|
||||
|
||||
/*
|
||||
* Remove the device after blk_cleanup_queue() has been called such
|
||||
* a possible bdi_register() call with the same name occurs after
|
||||
* blk_cleanup_queue() has called bdi_destroy().
|
||||
*/
|
||||
if (sdev->is_visible)
|
||||
device_del(dev);
|
||||
else
|
||||
put_device(&sdev->sdev_dev);
|
||||
|
||||
if (sdev->host->hostt->slave_destroy)
|
||||
sdev->host->hostt->slave_destroy(sdev);
|
||||
transport_destroy_device(dev);
|
||||
|
|
Загрузка…
Ссылка в новой задаче