[PATCH-v2 11/12] target: Add compare_and_write_post() completion callback fall through

2013-08-21 Thread Nicholas A. Bellinger
From: Nicholas Bellinger 

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 
Cc: Hannes Reinecke 
Cc: Martin Petersen 
Cc: Chris Mason 
Cc: James Bottomley 
Cc: Nicholas Bellinger 
Signed-off-by: Nicholas Bellinger 
---
 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/


[PATCH-v2 11/12] target: Add compare_and_write_post() completion callback fall through

2013-08-21 Thread Nicholas A. Bellinger
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/