Page MenuHomeFreeBSD

D31594.id.diff
No OneTemporary

D31594.id.diff

diff --git a/sys/dev/iscsi/iscsi.h b/sys/dev/iscsi/iscsi.h
--- a/sys/dev/iscsi/iscsi.h
+++ b/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;
diff --git a/sys/dev/iscsi/iscsi.c b/sys/dev/iscsi/iscsi.c
--- a/sys/dev/iscsi/iscsi.c
+++ b/sys/dev/iscsi/iscsi.c
@@ -892,6 +892,15 @@
}
ccb = io->io_ccb;
+ if (ntohl(bhssr->bhssr_expdatasn) != io->io_datasn) {
+ ISCSI_SESSION_WARN(is,
+ "ExpDataSN mismatch in SCSI Response (%u vs %u)",
+ ntohl(bhssr->bhssr_expdatasn), io->io_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 +1056,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 +1116,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
Sat, Apr 11, 1:45 AM (16 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31261002
Default Alt Text
D31594.id.diff (1 KB)

Event Timeline