[PATCH 3/3] Return INFO as the offset of the first miscompare for COMPARE_AND_WRITE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If a CAW command fails due to a data mismatch then we should flag
the VALID bit to 1 in the first byte of sense data :

>From SPC:
    A VALID bit set to one indicates the INFORMATION field contains valid
    information as defined in this standard or a command standard.

And se set the information field to the byte offset of the first byte where
miscompare happened.

>From SBC COMPARE_AND_WRITE:
    The offset from the start of the Data-Out Buffer to the first byte of
    data that did not match shall be returned in the INFORMATION field of
    the sense data, and the VALID bit shall be set to one.

Signed-off-by: Ronnie Sahlberg <ronniesahlberg@xxxxxxxxx>
---
 usr/bs_rdwr.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
index c9ab48d..d55f7f5 100644
--- a/usr/bs_rdwr.c
+++ b/usr/bs_rdwr.c
@@ -125,7 +125,6 @@ static void bs_rdwr_request(struct scsi_cmd *cmd)
 		}
 
 		if (memcmp(scsi_get_out_buffer(cmd), tmpbuf, length)) {
-			uint32_t pos = 0;
 			char *spos = scsi_get_out_buffer(cmd);
 			char *dpos = tmpbuf;
 
@@ -135,10 +134,10 @@ static void bs_rdwr_request(struct scsi_cmd *cmd)
 			 * comparasion to find out at which offset the
 			 * data differs.
 			 */
-			for (pos = 0; pos < length && *spos++ == *dpos++;
-			     pos++)
+			for (info = 0; info < length && *spos++ == *dpos++;
+			     info++)
 				;
-			info = pos;
+
 			result = SAM_STAT_CHECK_CONDITION;
 			key = MISCOMPARE;
 			asc = ASC_MISCOMPARE_DURING_VERIFY_OPERATION;
@@ -356,6 +355,8 @@ verify:
 		eprintf("io error %p %x %d %d %" PRIu64 ", %m\n",
 			cmd, cmd->scb[0], ret, length, offset);
 		sense_data_build(cmd, key, asc);
+		if (info != 0)
+			sense_data_add_info(cmd, info);
 	}
 }
 
-- 
1.7.3.1

--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux