scsi: target: tcmu: Do not queue aborted commands
authorBodo Stroesser <bstroesser@ts.fujitsu.com>
Sun, 26 Jul 2020 15:35:06 +0000 (17:35 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 29 Jul 2020 02:25:28 +0000 (22:25 -0400)
If tcmu receives an already aborted command, tcmu_queue_cmd() should reject
it.

Link: https://lore.kernel.org/r/20200726153510.13077-5-bstroesser@ts.fujitsu.com
Reviewed-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Bodo Stroesser <bstroesser@ts.fujitsu.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_user.c

index b06b18d1b135c26e8fe71d5d75a3b23e5a9dfafe..25c480fde9eea28a3a7de3dda3e48f3cdd13dbfd 100644 (file)
@@ -1103,8 +1103,8 @@ tcmu_queue_cmd(struct se_cmd *se_cmd)
        struct se_device *se_dev = se_cmd->se_dev;
        struct tcmu_dev *udev = TCMU_DEV(se_dev);
        struct tcmu_cmd *tcmu_cmd;
-       sense_reason_t scsi_ret;
-       int ret;
+       sense_reason_t scsi_ret = TCM_CHECK_CONDITION_ABORT_CMD;
+       int ret = -1;
 
        tcmu_cmd = tcmu_alloc_cmd(se_cmd);
        if (!tcmu_cmd)
@@ -1112,7 +1112,8 @@ tcmu_queue_cmd(struct se_cmd *se_cmd)
 
        mutex_lock(&udev->cmdr_lock);
        se_cmd->priv = tcmu_cmd;
-       ret = queue_cmd_ring(tcmu_cmd, &scsi_ret);
+       if (!(se_cmd->transport_state & CMD_T_ABORTED))
+               ret = queue_cmd_ring(tcmu_cmd, &scsi_ret);
        if (ret < 0)
                tcmu_free_cmd(tcmu_cmd);
        mutex_unlock(&udev->cmdr_lock);