|
@@ -322,14 +322,8 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work)
|
|
|
kfree(evt);
|
|
|
}
|
|
|
|
|
|
- if (sdev->request_queue) {
|
|
|
- sdev->request_queue->queuedata = NULL;
|
|
|
- /* user context needed to free queue */
|
|
|
- scsi_free_queue(sdev->request_queue);
|
|
|
- /* temporary expedient, try to catch use of queue lock
|
|
|
- * after free of sdev */
|
|
|
- sdev->request_queue = NULL;
|
|
|
- }
|
|
|
+ /* NULL queue means the device can't be used */
|
|
|
+ sdev->request_queue = NULL;
|
|
|
|
|
|
scsi_target_reap(scsi_target(sdev));
|
|
|
|
|
@@ -937,6 +931,12 @@ void __scsi_remove_device(struct scsi_device *sdev)
|
|
|
if (sdev->host->hostt->slave_destroy)
|
|
|
sdev->host->hostt->slave_destroy(sdev);
|
|
|
transport_destroy_device(dev);
|
|
|
+
|
|
|
+ /* cause the request function to reject all I/O requests */
|
|
|
+ sdev->request_queue->queuedata = NULL;
|
|
|
+
|
|
|
+ /* Freeing the queue signals to block that we're done */
|
|
|
+ scsi_free_queue(sdev->request_queue);
|
|
|
put_device(dev);
|
|
|
}
|
|
|
|