Patch "target: Don't override EXTENDED_COPY xcopy_pt_cmd SCSI status code" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
target: Don't override EXTENDED_COPY xcopy_pt_cmd SCSI status code
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
target-don-t-override-extended_copy-xcopy_pt_cmd-scsi-status-code.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
926317de33998c112c5510301868ea9aa34097e2Mon Sep 17 00:00:00 2001
From: Dinesh Israni <[email protected]>
Date: Mon, 10 Oct 2016 20:22:03 -0700
Subject: target: Don't override EXTENDED_COPY xcopy_pt_cmd SCSI status code
From: Dinesh Israni <[email protected]>
commit 926317de33998c112c5510301868ea9aa34097e2 upstream.
This patch addresses a bug where a local EXTENDED_COPY WRITE or READ backend I/O request would always return SAM_STAT_CHECK_CONDITION, even if underlying xcopy_pt_cmd->se_cmd generated a different SCSI status code.
ESX host environments expect to hit SAM_STAT_RESERVATION_CONFLICT for certain scenarios, and SAM_STAT_CHECK_CONDITION results in non-retriable status for these cases.
Tested on v4.1.y with ESX v5.5u2+ with local IBLOCK backend copy.
--- drivers/target/target_core_xcopy.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/target/target_core_xcopy.c +12 -4
@@ -662,6 +662,7 @@ static int target_xcopy_read_source( rc =target_xcopy_setup_pt_cmd (xpt_cmd, xop, src_dev, &cdb[0 ], remote_port, true);if (rc <0 ) { + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status;transport_generic_free_cmd (se_cmd,0 );return rc; }
@@ -673,6 +674,7 @@ static int target_xcopy_read_source( rc =target_xcopy_issue_pt_cmd (xpt_cmd);if (rc <0 ) { + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status;transport_generic_free_cmd (se_cmd,0 );return rc; }
@@ -723,6 +725,7 @@ static int target_xcopy_write_destinatio remote_port, false);if (rc <0 ) {struct se_cmd *src_cmd = &xop->src_pt_cmd->se_cmd; + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status;/* * If the failure happened before the t_mem_list hand-off in * target_xcopy_setup_pt_cmd(), Reset memory + clear flag so that
@@ -738,6 +741,7 @@ static int target_xcopy_write_destinatio rc =target_xcopy_issue_pt_cmd (xpt_cmd);if (rc <0 ) { + ec_cmd->scsi_status = xpt_cmd->se_cmd.scsi_status; se_cmd->se_cmd_flags &= ~SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC ;transport_generic_free_cmd (se_cmd,0 );return rc;
@@ -824,10 +828,14 @@ static void target_xcopy_do_work(struct out:xcopy_pt_undepend_remotedev (xop);kfree (xop); - -pr_warn_ratelimited ("target_xcopy_do_work: rc: %d, Setting X-COPY CHECK_CONDITION" -" -> sending response\n" , rc); - ec_cmd->scsi_status =SAM_STAT_CHECK_CONDITION ; +/* +* Don't override an error scsi status if it has already been set +*/ +if (ec_cmd->scsi_status ==SAM_STAT_GOOD ) { +pr_warn_ratelimited ("target_xcopy_do_work: rc: %d, Setting X-COPY" +" CHECK_CONDITION -> sending response\n" , rc); + ec_cmd->scsi_status =SAM_STAT_CHECK_CONDITION ; + }target_complete_cmd (ec_cmd,SAM_STAT_CHECK_CONDITION ); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/target-don-t-override-extended_copy-xcopy_pt_cmd-scsi-status-code.patch queue-4.4/target-make-extended_copy-0xe4-failure-return-copy-target-device-not-reachable.patch