On Thu, Feb 16, 2017 at 02:30:34PM +0000, Bart Van Assche wrote: > > sdev = q->queuedata; > > - if (!sdev || !get_device(&sdev->sdev_gendev)) > > + if (!sdev || > > + !scsi_is_sdev_device(&sdev->sdev_gendev) || > > + !get_device(&sdev->sdev_gendev)) > > sdev = NULL; > > spin_unlock_irqrestore(q->queue_lock, flags); > > Hello Hannes, > > Sorry but this approach looks wrong to me. A block driver can store any data > in .queuedata, even data that would cause the scsi_is_sdev_device() function > to crash. Yes, I fear you're right. I guess we need to call into the scsi_dh_* functions through an indirection mediated by the block layer.