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.

Reply via email to