scsi: core: Clear driver private data when retrying request
After commit1bad6c4a57
("scsi: zero per-cmd private driver data for each MQ I/O"), the xen-scsifront/virtio_scsi/snic drivers all removed code that explicitly zeroed driver-private command data. In combination with commit464a00c9e0
("scsi: core: Kill DRIVER_SENSE"), after virtio_scsi performs a capacity expansion, the first request will return a unit attention to indicate that the capacity has changed. And then the original command is retried. As driver-private command data was not cleared, the request would return UA again and eventually time out and fail. Zero driver-private command data when a request is retried. Fixes:f7de50da14
("scsi: xen-scsifront: Remove code that zeroes driver-private command data") Fixes:c2bb87318b
("scsi: virtio_scsi: Remove code that zeroes driver-private command data") Fixes:c3006a9264
("scsi: snic: Remove code that zeroes driver-private command data") Signed-off-by: Ye Bin <yebin10@huawei.com> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Link: https://lore.kernel.org/r/20250217021628.2929248-1-yebin@huaweicloud.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
4fa382be43
commit
dce5c4afd0
1 changed files with 7 additions and 7 deletions
|
@ -1669,13 +1669,6 @@ static blk_status_t scsi_prepare_cmd(struct request *req)
|
|||
if (in_flight)
|
||||
__set_bit(SCMD_STATE_INFLIGHT, &cmd->state);
|
||||
|
||||
/*
|
||||
* Only clear the driver-private command data if the LLD does not supply
|
||||
* a function to initialize that data.
|
||||
*/
|
||||
if (!shost->hostt->init_cmd_priv)
|
||||
memset(cmd + 1, 0, shost->hostt->cmd_size);
|
||||
|
||||
cmd->prot_op = SCSI_PROT_NORMAL;
|
||||
if (blk_rq_bytes(req))
|
||||
cmd->sc_data_direction = rq_dma_dir(req);
|
||||
|
@ -1842,6 +1835,13 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
|
|||
if (!scsi_host_queue_ready(q, shost, sdev, cmd))
|
||||
goto out_dec_target_busy;
|
||||
|
||||
/*
|
||||
* Only clear the driver-private command data if the LLD does not supply
|
||||
* a function to initialize that data.
|
||||
*/
|
||||
if (shost->hostt->cmd_size && !shost->hostt->init_cmd_priv)
|
||||
memset(cmd + 1, 0, shost->hostt->cmd_size);
|
||||
|
||||
if (!(req->rq_flags & RQF_DONTPREP)) {
|
||||
ret = scsi_prepare_cmd(req);
|
||||
if (ret != BLK_STS_OK)
|
||||
|
|
Loading…
Add table
Reference in a new issue