diff options
| author | Peter Gill <Peter.Gill@Sun.COM> | 2010-06-25 16:17:33 -0400 |
|---|---|---|
| committer | Peter Gill <Peter.Gill@Sun.COM> | 2010-06-25 16:17:33 -0400 |
| commit | 6e7514aea2b79ddf20753fec3d234c35b6495971 (patch) | |
| tree | 87caabcfa91611ed8c80628bcb2932a7c2e50e0c /usr/src/uts/common/io | |
| parent | 9b1bd49f83497d7b339a684a1a76de3aaccf5269 (diff) | |
| download | illumos-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.c | 3 | ||||
| -rw-r--r-- | usr/src/uts/common/io/scsi/adapters/iscsi/iscsi_login.c | 11 |
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)", |
