scsi: core: Clear flags for scsi_cmnd that did not complete
authorAnastasia Kovaleva <a.kovaleva@yadro.com>
Mon, 24 Mar 2025 08:49:33 +0000 (11:49 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 22 Apr 2025 00:45:04 +0000 (20:45 -0400)
Commands that have not been completed with scsi_done() do not clear the
SCMD_INITIALIZED flag and therefore will not be properly reinitialized.
Thus, the next time the scsi_cmnd structure is used, the command may
fail in scsi_cmd_runtime_exceeded() due to the old jiffies_at_alloc
value:

  kernel: sd 16:0:1:84: [sdts] tag#405 timing out command, waited 720s
  kernel: sd 16:0:1:84: [sdts] tag#405 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_OK cmd_age=66636s

Clear flags for commands that have not been completed by SCSI.

Fixes: 4abafdc4360d ("block: remove the initialize_rq_fn blk_mq_ops method")
Signed-off-by: Anastasia Kovaleva <a.kovaleva@yadro.com>
Link: https://lore.kernel.org/r/20250324084933.15932-2-a.kovaleva@yadro.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_lib.c

index 0d29470e86b0b8ee96dffd541f3090d41d457e48..1b43013d72c03b18842d9d0f76a534490e3862df 100644 (file)
@@ -1253,8 +1253,12 @@ EXPORT_SYMBOL_GPL(scsi_alloc_request);
  */
 static void scsi_cleanup_rq(struct request *rq)
 {
+       struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(rq);
+
+       cmd->flags = 0;
+
        if (rq->rq_flags & RQF_DONTPREP) {
-               scsi_mq_uninit_cmd(blk_mq_rq_to_pdu(rq));
+               scsi_mq_uninit_cmd(cmd);
                rq->rq_flags &= ~RQF_DONTPREP;
        }
 }