summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io
diff options
context:
space:
mode:
authorPeter Gill <Peter.Gill@Sun.COM>2010-06-25 16:17:33 -0400
committerPeter Gill <Peter.Gill@Sun.COM>2010-06-25 16:17:33 -0400
commit6e7514aea2b79ddf20753fec3d234c35b6495971 (patch)
tree87caabcfa91611ed8c80628bcb2932a7c2e50e0c /usr/src/uts/common/io
parent9b1bd49f83497d7b339a684a1a76de3aaccf5269 (diff)
downloadillumos-gate-6e7514aea2b79ddf20753fec3d234c35b6495971.tar.gz
6963208 Race condition prevents target redirection from woking.
Diffstat (limited to 'usr/src/uts/common/io')
-rw-r--r--usr/src/uts/common/io/idm/idm_impl.c3
-rw-r--r--usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_login.c11
2 files changed, 9 insertions, 5 deletions
diff --git a/usr/src/uts/common/io/idm/idm_impl.c b/usr/src/uts/common/io/idm/idm_impl.c
index 9e675aadad..0ebf6edda7 100644
--- a/usr/src/uts/common/io/idm/idm_impl.c
+++ b/usr/src/uts/common/io/idm/idm_impl.c
@@ -282,9 +282,6 @@ idm_parse_login_rsp(idm_conn_t *ic, idm_pdu_t *login_rsp_pdu, boolean_t rx)
} else {
new_event = (rx ? CE_MISC_RX : CE_MISC_TX);
}
- } else if (rx && login_rsp->status_class ==
- ISCSI_STATUS_CLASS_REDIRECT) {
- new_event = CE_MISC_RX;
} else {
new_event = (rx ? CE_LOGIN_FAIL_RCV : CE_LOGIN_FAIL_SND);
}
diff --git a/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_login.c b/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_login.c
index 1baca54236..3dc4f62888 100644
--- a/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_login.c
+++ b/usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_login.c
@@ -507,6 +507,7 @@ iscsi_login(iscsi_conn_t *icp, uint8_t *status_class, uint8_t *status_detail)
goto iscsi_login_done;
}
+ icp->conn_login_resp_hdr.opcode = 0;
iscsi_login_update_state_locked(icp, LOGIN_TX);
icp->conn_login_data = data;
icp->conn_login_max_data_length = max_data_length;
@@ -534,7 +535,14 @@ iscsi_login(iscsi_conn_t *icp, uint8_t *status_class, uint8_t *status_detail)
break;
}
- if (icp->conn_login_state != LOGIN_RX) {
+ /*
+ * We have either received a login response or the connection
+ * has gone down or both. If a login response is present,
+ * then process it.
+ */
+ ilrhp = (iscsi_login_rsp_hdr_t *)&icp->conn_login_resp_hdr;
+ if (icp->conn_login_state != LOGIN_RX && ilrhp->opcode == 0) {
+ /* connection down, with no login response */
mutex_exit(&icp->conn_login_mutex);
rval = (ISCSI_STATUS_INTERNAL_ERROR);
goto iscsi_login_done;
@@ -542,7 +550,6 @@ iscsi_login(iscsi_conn_t *icp, uint8_t *status_class, uint8_t *status_detail)
mutex_exit(&icp->conn_login_mutex);
/* check the PDU response type */
- ilrhp = (iscsi_login_rsp_hdr_t *)&icp->conn_login_resp_hdr;
if (ilrhp->opcode != ISCSI_OP_LOGIN_RSP) {
cmn_err(CE_WARN, "iscsi connection(%u) login failed - "
"received invalid login response (0x%02x)",