svn commit: r300737 - head/sys/dev/iscsi

Edward Tomasz Napierala trasz at FreeBSD.org
Thu May 26 12:43:17 UTC 2016


Author: trasz
Date: Thu May 26 12:43:15 2016
New Revision: 300737
URL: https://svnweb.freebsd.org/changeset/base/300737

Log:
  Add a special case for iSER data tranfers.
  
  Obtained from:	Mellanox Technologies
  MFC after:	1 month
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/dev/iscsi/iscsi.c

Modified: head/sys/dev/iscsi/iscsi.c
==============================================================================
--- head/sys/dev/iscsi/iscsi.c	Thu May 26 12:00:14 2016	(r300736)
+++ head/sys/dev/iscsi/iscsi.c	Thu May 26 12:43:15 2016	(r300737)
@@ -866,6 +866,7 @@ iscsi_pdu_handle_scsi_response(struct ic
 	struct ccb_scsiio *csio;
 	size_t data_segment_len, received;
 	uint16_t sense_len;
+	uint32_t resid;
 
 	is = PDU_SESSION(response);
 
@@ -880,6 +881,22 @@ iscsi_pdu_handle_scsi_response(struct ic
 	}
 
 	ccb = io->io_ccb;
+
+	/*
+	 * With iSER, after getting good response we can be sure
+	 * that all the data has been successfully transferred.
+	 */
+	if (is->is_conn->ic_iser) {
+		resid = ntohl(bhssr->bhssr_residual_count);
+		if (bhssr->bhssr_flags & BHSSR_FLAGS_RESIDUAL_UNDERFLOW) {
+			io->io_received = ccb->csio.dxfer_len - resid;
+		} else if (bhssr->bhssr_flags & BHSSR_FLAGS_RESIDUAL_OVERFLOW) {
+			ISCSI_SESSION_WARN(is, "overflow: target indicates %d", resid);
+		} else {
+			io->io_received = ccb->csio.dxfer_len;
+		}
+	}
+
 	received = io->io_received;
 	iscsi_outstanding_remove(is, io);
 	ISCSI_SESSION_UNLOCK(is);


More information about the svn-src-head mailing list