On Thu, 2017-03-16 at 13:56 -0700, Bart Van Assche wrote: > scsi_target_unblock() must unblock SCSI devices even if this function > is called after unloading of the LLD that created these devices has > started. This is necessary to prevent that __scsi_remove_device() > hangs on the SYNCHRONIZE CACHE command issued by the sd driver during > shutdown.
Your special get function misses the try_module_get(). But this is all really a bit ugly. Since the only problem is the SYNC CACHE triggered by device_del, isn't a better solution a new state: SDEV_CANCEL_BLOCK. This will make the device visible to scsi_get_device() and we can take it back from CANCEL_BLOCKED->CANCEL when the queue is unblocked. I suspect we could also simply throw away the sync cache command when the device is blocked (the cache should destage naturally in the time it takes for the device to be unblocked). James