Re: Linux 3.0 oopses when pulling a USB CDROM

Andi Kleen
2011-07-02T18:11:47Z

> The problem is that blk_peek_request() calls scsi_prep_fn(), which
> does this:
>
> struct scsi_device *sdev = q->queuedata;
> int ret = BLKPREP_KILL;
>
> if (req->cmd_type == REQ_TYPE_BLOCK_PC)
> ret = scsi_setup_blk_pc_cmnd(sdev, req);
> return scsi_prep_return(q, req, ret);
>
> It doesn't check to see if sdev is NULL, nor does
> scsi_setup_blk_pc_cmnd(). That accounts for this error:

I actually added a NULL check in scsi_setup_blk_pc_cmnd early on,
but that just caused RCU CPU stalls afterwards and then eventually
a hung system.

-Andi