summaryrefslogtreecommitdiffstats
path: root/sys/dev/iscsi/iscsi.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-07-15 18:21:26 +0000
committermav <mav@FreeBSD.org>2014-07-15 18:21:26 +0000
commite6aad795782ef4a872f748ad09e30f70235ba942 (patch)
tree830ad6baa2fa0f487d2cd79d0febaf011a9d1187 /sys/dev/iscsi/iscsi.c
parent2c6230a1adb4e420bb9bd3ba65643b39d8f987d1 (diff)
downloadFreeBSD-src-e6aad795782ef4a872f748ad09e30f70235ba942.zip
FreeBSD-src-e6aad795782ef4a872f748ad09e30f70235ba942.tar.gz
MFC r268326:
Make iSCSI initiator keep Initiator Session ID (ISID) across reconnects. Previously ISID was changed every time, that made impossible correct persistent reservation, because reconnected session was identified as completely new one.
Diffstat (limited to 'sys/dev/iscsi/iscsi.c')
-rw-r--r--sys/dev/iscsi/iscsi.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/dev/iscsi/iscsi.c b/sys/dev/iscsi/iscsi.c
index e7691fc..0a75838 100644
--- a/sys/dev/iscsi/iscsi.c
+++ b/sys/dev/iscsi/iscsi.c
@@ -1226,6 +1226,9 @@ iscsi_ioctl_daemon_wait(struct iscsi_softc *sc,
ISCSI_SESSION_UNLOCK(is);
request->idr_session_id = is->is_id;
+ memcpy(&request->idr_isid, &is->is_isid,
+ sizeof(request->idr_isid));
+ request->idr_tsih = 0; /* New or reinstated session. */
memcpy(&request->idr_conf, &is->is_conf,
sizeof(request->idr_conf));
@@ -1275,7 +1278,7 @@ iscsi_ioctl_daemon_handoff(struct iscsi_softc *sc,
strlcpy(is->is_target_alias, handoff->idh_target_alias,
sizeof(is->is_target_alias));
- memcpy(is->is_isid, handoff->idh_isid, sizeof(is->is_isid));
+ is->is_tsih = handoff->idh_tsih;
is->is_statsn = handoff->idh_statsn;
is->is_initial_r2t = handoff->idh_initial_r2t;
is->is_immediate_data = handoff->idh_immediate_data;
@@ -1651,6 +1654,9 @@ iscsi_ioctl_session_add(struct iscsi_softc *sc, struct iscsi_session_add *isa)
is->is_softc = sc;
sc->sc_last_session_id++;
is->is_id = sc->sc_last_session_id;
+ is->is_isid[0] = 0x80; /* RFC 3720, 10.12.5: 10b, "Random" ISID. */
+ arc4rand(&is->is_isid[1], 5, 0);
+ is->is_tsih = 0;
callout_init(&is->is_callout, 1);
callout_reset(&is->is_callout, 1 * hz, iscsi_callout, is);
TAILQ_INSERT_TAIL(&sc->sc_sessions, is, is_next);
OpenPOWER on IntegriCloud