scsi: target/core: Simplify the code for aborting SCSI commands
authorBart Van Assche <bvanassche@acm.org>
Tue, 27 Nov 2018 23:52:01 +0000 (15:52 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 8 Dec 2018 02:20:07 +0000 (21:20 -0500)
Instead of allowing the code that aborts a SCSI command to finish before
all iSCSI data frames have been received, make that code wait until all
iSCSI data frames have been received. Introduce a new member variable in
the target driver template to communicate that information from the iSCSI
target driver to the target core. This change allows to leave out the check
whether or not it is already safe to send the TASK_ABORTED reply from
transport_send_task_abort().

Cc: Nicholas Bellinger <nab@linux-iscsi.org>
Cc: Mike Christie <mchristi@redhat.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: David Disseldorp <ddiss@suse.de>
Cc: Hannes Reinecke <hare@suse.de>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/iscsi/iscsi_target_configfs.c
drivers/target/target_core_transport.c
include/target/target_core_fabric.h

index 39a700a41f6e343b6535c479c2774a142b4c7b6b..a5481dfeae8db2e431ef826d0160e741c71d0aae 100644 (file)
@@ -1591,4 +1591,6 @@ const struct target_core_fabric_ops iscsi_ops = {
        .tfc_tpg_nacl_attrib_attrs      = lio_target_nacl_attrib_attrs,
        .tfc_tpg_nacl_auth_attrs        = lio_target_nacl_auth_attrs,
        .tfc_tpg_nacl_param_attrs       = lio_target_nacl_param_attrs,
+
+       .write_pending_must_be_called   = true,
 };
index caeedb112a855b761d9203507754ec9b5dd51115..868ee9c28c9a211f8304c0bcebc5e77a66b6b129 100644 (file)
@@ -2584,7 +2584,8 @@ transport_generic_new_cmd(struct se_cmd *cmd)
         * Determine if frontend context caller is requesting the stopping of
         * this command for frontend exceptions.
         */
-       if (cmd->transport_state & CMD_T_STOP) {
+       if (cmd->transport_state & CMD_T_STOP &&
+           !cmd->se_tfo->write_pending_must_be_called) {
                pr_debug("%s:%d CMD_T_STOP for ITT: 0x%08llx\n",
                         __func__, __LINE__, cmd->tag);
 
@@ -3297,25 +3298,6 @@ void transport_send_task_abort(struct se_cmd *cmd)
        }
        spin_unlock_irqrestore(&cmd->t_state_lock, flags);
 
-       /*
-        * If there are still expected incoming fabric WRITEs, we wait
-        * until until they have completed before sending a TASK_ABORTED
-        * response.  This response with TASK_ABORTED status will be
-        * queued back to fabric module by transport_check_aborted_status().
-        */
-       if (cmd->data_direction == DMA_TO_DEVICE) {
-               if (cmd->se_tfo->write_pending_status(cmd) != 0) {
-                       spin_lock_irqsave(&cmd->t_state_lock, flags);
-                       if (cmd->se_cmd_flags & SCF_SEND_DELAYED_TAS) {
-                               spin_unlock_irqrestore(&cmd->t_state_lock, flags);
-                               goto send_abort;
-                       }
-                       cmd->se_cmd_flags |= SCF_SEND_DELAYED_TAS;
-                       spin_unlock_irqrestore(&cmd->t_state_lock, flags);
-                       return;
-               }
-       }
-send_abort:
        cmd->scsi_status = SAM_STAT_TASK_ABORTED;
 
        transport_lun_remove_cmd(cmd);
index 3b81a5b014977265653a54d0baa8bd65669563b5..7c62923b16b6790851d87badc2f4a6870e7178e3 100644 (file)
@@ -111,6 +111,13 @@ struct target_core_fabric_ops {
        struct configfs_attribute **tfc_tpg_nacl_attrib_attrs;
        struct configfs_attribute **tfc_tpg_nacl_auth_attrs;
        struct configfs_attribute **tfc_tpg_nacl_param_attrs;
+
+       /*
+        * Set this member variable to true if the SCSI transport protocol
+        * (e.g. iSCSI) requires that the Data-Out buffer is transferred in
+        * its entirety before a command is aborted.
+        */
+       bool write_pending_must_be_called;
 };
 
 int target_register_template(const struct target_core_fabric_ops *fo);