Message ID | 20201116030459.13963-6-bvanassche@acm.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Rework runtime suspend and SCSI domain validation | expand |
On Sun, Nov 15, 2020 at 07:04:55PM -0800, Bart Van Assche wrote: > scsi_eh_lock_door() is the only function in the SCSI error handler that > calls blk_get_request(). It is not guaranteed that a request is available > when scsi_eh_lock_door() is called. Hence pass the BLK_MQ_REQ_NOWAIT flag > to blk_get_request(). This patch has a second purpose, namely preventing > that scsi_eh_lock_door() deadlocks if sdev->request_queue is frozen and if > a SCSI command is submitted to a SCSI device through a second request > queue that has not been frozen. A later patch will namely modify the SPI > DV code such that sdev->requeust_queue is frozen during domain validation. Looks good, Reviewed-by: Christoph Hellwig <hch@lst.de>
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index d94449188270..6de6e1bf3dcb 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -1993,7 +1993,12 @@ static void scsi_eh_lock_door(struct scsi_device *sdev) struct request *req; struct scsi_request *rq; - req = blk_get_request(sdev->request_queue, REQ_OP_SCSI_IN, 0); + /* + * It is not guaranteed that a request is available nor that + * sdev->request_queue is unfrozen. Hence the BLK_MQ_REQ_NOWAIT below. + */ + req = blk_get_request(sdev->request_queue, REQ_OP_SCSI_IN, + BLK_MQ_REQ_NOWAIT); if (IS_ERR(req)) return; rq = scsi_req(req);