Page MenuHomeFreeBSD

D31594.id94141.diff
No OneTemporary

D31594.id94141.diff

Index: sys/dev/iscsi/iscsi.h
===================================================================
--- sys/dev/iscsi/iscsi.h
+++ sys/dev/iscsi/iscsi.h
@@ -44,6 +44,7 @@
TAILQ_ENTRY(iscsi_outstanding) io_next;
union ccb *io_ccb;
size_t io_received;
+ uint32_t io_datasn;
uint32_t io_initiator_task_tag;
uint32_t io_referenced_task_tag;
void *io_icl_prv;
Index: sys/dev/iscsi/iscsi.c
===================================================================
--- sys/dev/iscsi/iscsi.c
+++ sys/dev/iscsi/iscsi.c
@@ -877,7 +877,7 @@
struct ccb_scsiio *csio;
size_t data_segment_len, received;
uint16_t sense_len;
- uint32_t resid;
+ uint32_t datasn, resid;
is = PDU_SESSION(response);
@@ -892,6 +892,16 @@
}
ccb = io->io_ccb;
+ datasn = io->io_datasn;
+ if (ntohl(bhssr->bhssr_expdatasn) != datasn) {
+ ISCSI_SESSION_WARN(is,
+ "ExpDataSN mismatch in service response (%u vs %u)",
+ ntohl(bhssr->bhssr_expdatasn), datasn);
+ icl_pdu_free(response);
+ iscsi_session_reconnect(is);
+ ISCSI_SESSION_UNLOCK(is);
+ return;
+ }
/*
* With iSER, after getting good response we can be sure
@@ -1047,6 +1057,17 @@
return;
}
+ if (io->io_datasn != ntohl(bhsdi->bhsdi_datasn)) {
+ ISCSI_SESSION_WARN(is, "received Data-In PDU with "
+ "DataSN %u, while expected %u; dropping connection",
+ ntohl(bhsdi->bhsdi_datasn), io->io_datasn);
+ icl_pdu_free(response);
+ iscsi_session_reconnect(is);
+ ISCSI_SESSION_UNLOCK(is);
+ return;
+ }
+ io->io_datasn += response->ip_additional_pdus + 1;
+
data_segment_len = icl_pdu_data_segment_length(response);
if (data_segment_len == 0) {
/*
@@ -1096,7 +1117,6 @@
icl_pdu_get_data(response, 0, csio->data_ptr + oreceived, data_segment_len);
/*
- * XXX: Check DataSN.
* XXX: Check F.
*/
if ((bhsdi->bhsdi_flags & BHSDI_FLAGS_S) == 0) {

File Metadata

Mime Type
text/plain
Expires
Mon, Apr 13, 6:33 PM (1 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31421146
Default Alt Text
D31594.id94141.diff (1 KB)

Event Timeline