From: Nicholas Bellinger <n...@daterainc.com>

This patch changes target_complete_ok_work() to fall through
after calling the se_cmd->transport_complete_callback() ->
compare_and_write_post() callback, by keying off the existance
of SCF_COMPARE_AND_WRITE_POST.

This is necessary because once SCF_COMPARE_AND_WRITE_POST has
been set by compare_and_write_post(), the SCSI response needs
to be sent via TFO->queue_status().

Cc: Christoph Hellwig <h...@lst.de>
Cc: Hannes Reinecke <h...@suse.de>
Cc: Martin Petersen <martin.peter...@oracle.com>
Cc: Chris Mason <chris.ma...@fusionio.com>
Cc: James Bottomley <jbottom...@parallels.com>
Cc: Nicholas Bellinger <n...@linux-iscsi.org>
Signed-off-by: Nicholas Bellinger <n...@daterainc.com>
---
 drivers/target/target_core_sbc.c       |    3 ++-
 drivers/target/target_core_transport.c |   21 +++++++++++----------
 2 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c
index 4076828..bb1b42b 100644
--- a/drivers/target/target_core_sbc.c
+++ b/drivers/target/target_core_sbc.c
@@ -375,7 +375,8 @@ static sense_reason_t compare_and_write_callback(struct 
se_cmd *cmd)
        buf = kzalloc(cmd->data_length, GFP_KERNEL);
        if (!buf) {
                pr_err("Unable to allocate compare_and_write buf\n");
-               return TCM_OUT_OF_RESOURCES;
+               ret = TCM_OUT_OF_RESOURCES;
+               goto out;
        }
 
        write_sg = kzalloc(sizeof(struct scatterlist) * cmd->t_data_nents,
diff --git a/drivers/target/target_core_transport.c 
b/drivers/target/target_core_transport.c
index dc39f1f..a95e799 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1910,17 +1910,18 @@ static void target_complete_ok_work(struct work_struct 
*work)
                sense_reason_t rc;
 
                rc = cmd->transport_complete_callback(cmd);
-               if (!rc)
+               if (!rc && !(cmd->se_cmd_flags & SCF_COMPARE_AND_WRITE_POST)) {
                        return;
+               } else if (rc) {
+                       ret = transport_send_check_condition_and_sense(cmd,
+                                               rc, 0);
+                       if (ret == -EAGAIN || ret == -ENOMEM)
+                               goto queue_full;
 
-               ret = transport_send_check_condition_and_sense(cmd,
-                                       rc, 0);
-               if (ret == -EAGAIN || ret == -ENOMEM)
-                       goto queue_full;
-
-               transport_lun_remove_cmd(cmd);
-               transport_cmd_check_stop_to_fabric(cmd);
-               return;
+                       transport_lun_remove_cmd(cmd);
+                       transport_cmd_check_stop_to_fabric(cmd);
+                       return;
+               }
        }
 
        switch (cmd->data_direction) {
-- 
1.7.2.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to