|
@@ -3464,20 +3464,43 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
|
|
|
if ((fcport->flags & FCF_FABRIC_DEVICE) == 0)
|
|
|
continue;
|
|
|
|
|
|
- if (fcport->scan_state == QLA_FCPORT_SCAN &&
|
|
|
- atomic_read(&fcport->state) == FCS_ONLINE) {
|
|
|
- qla2x00_mark_device_lost(vha, fcport,
|
|
|
- ql2xplogiabsentdevice, 0);
|
|
|
- if (fcport->loop_id != FC_NO_LOOP_ID &&
|
|
|
- (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
|
|
|
- fcport->port_type != FCT_INITIATOR &&
|
|
|
- fcport->port_type != FCT_BROADCAST) {
|
|
|
- ha->isp_ops->fabric_logout(vha,
|
|
|
- fcport->loop_id,
|
|
|
- fcport->d_id.b.domain,
|
|
|
- fcport->d_id.b.area,
|
|
|
- fcport->d_id.b.al_pa);
|
|
|
- qla2x00_clear_loop_id(fcport);
|
|
|
+ if (fcport->scan_state == QLA_FCPORT_SCAN) {
|
|
|
+ if (qla_ini_mode_enabled(base_vha) &&
|
|
|
+ atomic_read(&fcport->state) == FCS_ONLINE) {
|
|
|
+ qla2x00_mark_device_lost(vha, fcport,
|
|
|
+ ql2xplogiabsentdevice, 0);
|
|
|
+ if (fcport->loop_id != FC_NO_LOOP_ID &&
|
|
|
+ (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
|
|
|
+ fcport->port_type != FCT_INITIATOR &&
|
|
|
+ fcport->port_type != FCT_BROADCAST) {
|
|
|
+ ha->isp_ops->fabric_logout(vha,
|
|
|
+ fcport->loop_id,
|
|
|
+ fcport->d_id.b.domain,
|
|
|
+ fcport->d_id.b.area,
|
|
|
+ fcport->d_id.b.al_pa);
|
|
|
+ qla2x00_clear_loop_id(fcport);
|
|
|
+ }
|
|
|
+ } else if (!qla_ini_mode_enabled(base_vha)) {
|
|
|
+ /*
|
|
|
+ * In target mode, explicitly kill
|
|
|
+ * sessions and log out of devices
|
|
|
+ * that are gone, so that we don't
|
|
|
+ * end up with an initiator using the
|
|
|
+ * wrong ACL (if the fabric recycles
|
|
|
+ * an FC address and we have a stale
|
|
|
+ * session around) and so that we don't
|
|
|
+ * report initiators that are no longer
|
|
|
+ * on the fabric.
|
|
|
+ */
|
|
|
+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf077,
|
|
|
+ "port gone, logging out/killing session: "
|
|
|
+ "%8phC state 0x%x flags 0x%x fc4_type 0x%x "
|
|
|
+ "scan_state %d\n",
|
|
|
+ fcport->port_name,
|
|
|
+ atomic_read(&fcport->state),
|
|
|
+ fcport->flags, fcport->fc4_type,
|
|
|
+ fcport->scan_state);
|
|
|
+ qlt_fc_port_deleted(vha, fcport);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -3498,6 +3521,28 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
|
|
|
(fcport->flags & FCF_LOGIN_NEEDED) == 0)
|
|
|
continue;
|
|
|
|
|
|
+ /*
|
|
|
+ * If we're not an initiator, skip looking for devices
|
|
|
+ * and logging in. There's no reason for us to do it,
|
|
|
+ * and it seems to actively cause problems in target
|
|
|
+ * mode if we race with the initiator logging into us
|
|
|
+ * (we might get the "port ID used" status back from
|
|
|
+ * our login command and log out the initiator, which
|
|
|
+ * seems to cause havoc).
|
|
|
+ */
|
|
|
+ if (!qla_ini_mode_enabled(base_vha)) {
|
|
|
+ if (fcport->scan_state == QLA_FCPORT_FOUND) {
|
|
|
+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf078,
|
|
|
+ "port %8phC state 0x%x flags 0x%x fc4_type 0x%x "
|
|
|
+ "scan_state %d (initiator mode disabled; skipping "
|
|
|
+ "login)\n", fcport->port_name,
|
|
|
+ atomic_read(&fcport->state),
|
|
|
+ fcport->flags, fcport->fc4_type,
|
|
|
+ fcport->scan_state);
|
|
|
+ }
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
if (fcport->loop_id == FC_NO_LOOP_ID) {
|
|
|
fcport->loop_id = next_loopid;
|
|
|
rval = qla2x00_find_new_loop_id(
|
|
@@ -3524,16 +3569,38 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
|
|
|
test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
|
|
|
break;
|
|
|
|
|
|
- /* Find a new loop ID to use. */
|
|
|
- fcport->loop_id = next_loopid;
|
|
|
- rval = qla2x00_find_new_loop_id(base_vha, fcport);
|
|
|
- if (rval != QLA_SUCCESS) {
|
|
|
- /* Ran out of IDs to use */
|
|
|
- break;
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * If we're not an initiator, skip looking for devices
|
|
|
+ * and logging in. There's no reason for us to do it,
|
|
|
+ * and it seems to actively cause problems in target
|
|
|
+ * mode if we race with the initiator logging into us
|
|
|
+ * (we might get the "port ID used" status back from
|
|
|
+ * our login command and log out the initiator, which
|
|
|
+ * seems to cause havoc).
|
|
|
+ */
|
|
|
+ if (qla_ini_mode_enabled(base_vha)) {
|
|
|
+ /* Find a new loop ID to use. */
|
|
|
+ fcport->loop_id = next_loopid;
|
|
|
+ rval = qla2x00_find_new_loop_id(base_vha,
|
|
|
+ fcport);
|
|
|
+ if (rval != QLA_SUCCESS) {
|
|
|
+ /* Ran out of IDs to use */
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- /* Login and update database */
|
|
|
- qla2x00_fabric_dev_login(vha, fcport, &next_loopid);
|
|
|
+ /* Login and update database */
|
|
|
+ qla2x00_fabric_dev_login(vha, fcport,
|
|
|
+ &next_loopid);
|
|
|
+ } else {
|
|
|
+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf079,
|
|
|
+ "new port %8phC state 0x%x flags 0x%x fc4_type "
|
|
|
+ "0x%x scan_state %d (initiator mode disabled; "
|
|
|
+ "skipping login)\n",
|
|
|
+ fcport->port_name,
|
|
|
+ atomic_read(&fcport->state),
|
|
|
+ fcport->flags, fcport->fc4_type,
|
|
|
+ fcport->scan_state);
|
|
|
+ }
|
|
|
|
|
|
list_move_tail(&fcport->list, &vha->vp_fcports);
|
|
|
}
|
|
@@ -3729,11 +3796,12 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
|
|
|
fcport->fp_speed = new_fcport->fp_speed;
|
|
|
|
|
|
/*
|
|
|
- * If address the same and state FCS_ONLINE, nothing
|
|
|
- * changed.
|
|
|
+ * If address the same and state FCS_ONLINE
|
|
|
+ * (or in target mode), nothing changed.
|
|
|
*/
|
|
|
if (fcport->d_id.b24 == new_fcport->d_id.b24 &&
|
|
|
- atomic_read(&fcport->state) == FCS_ONLINE) {
|
|
|
+ (atomic_read(&fcport->state) == FCS_ONLINE ||
|
|
|
+ !qla_ini_mode_enabled(base_vha))) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3753,6 +3821,22 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
|
|
|
* Log it out if still logged in and mark it for
|
|
|
* relogin later.
|
|
|
*/
|
|
|
+ if (!qla_ini_mode_enabled(base_vha)) {
|
|
|
+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf080,
|
|
|
+ "port changed FC ID, %8phC"
|
|
|
+ " old %x:%x:%x (loop_id 0x%04x)-> new %x:%x:%x\n",
|
|
|
+ fcport->port_name,
|
|
|
+ fcport->d_id.b.domain,
|
|
|
+ fcport->d_id.b.area,
|
|
|
+ fcport->d_id.b.al_pa,
|
|
|
+ fcport->loop_id,
|
|
|
+ new_fcport->d_id.b.domain,
|
|
|
+ new_fcport->d_id.b.area,
|
|
|
+ new_fcport->d_id.b.al_pa);
|
|
|
+ fcport->d_id.b24 = new_fcport->d_id.b24;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
fcport->d_id.b24 = new_fcport->d_id.b24;
|
|
|
fcport->flags |= FCF_LOGIN_NEEDED;
|
|
|
if (fcport->loop_id != FC_NO_LOOP_ID &&
|
|
@@ -3772,6 +3856,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
|
|
|
if (found)
|
|
|
continue;
|
|
|
/* If device was not in our fcports list, then add it. */
|
|
|
+ new_fcport->scan_state = QLA_FCPORT_FOUND;
|
|
|
list_add_tail(&new_fcport->list, new_fcports);
|
|
|
|
|
|
/* Allocate a new replacement fcport. */
|