[SCSI] qla4xxx: Fixed session destroy issue on link up-down.
authorManish Rangankar <manish.rangankar@qlogic.com>
Fri, 7 Oct 2011 23:55:47 +0000 (16:55 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 16 Oct 2011 16:10:27 +0000 (11:10 -0500)
During link down, iscsid tries to do re-login to failed session. In case of
link down-up-down, LLD was sending connection login failed event to iscsid,
which is destroying the session, instead we have to continue re-login by
sending connection err event.

JIRA Key: UPSISCSI-134

Signed-off-by: Manish Rangankar <manish.rangankar@qlogic.com>
Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla4xxx/ql4_init.c
drivers/scsi/qla4xxx/ql4_os.c

index ca155bb9fd0ab463220150e70cbb0b22afb2d201..cc10bacd1e1873cd7fecedbc924ce2dcb1f90e28 100644 (file)
@@ -931,6 +931,22 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index,
                        break;
                }
                break;
+       case DDB_DS_SESSION_FAILED:
+               switch (state) {
+               case DDB_DS_SESSION_ACTIVE:
+               case DDB_DS_DISCOVERY:
+                       iscsi_conn_login_event(ddb_entry->conn,
+                                              ISCSI_CONN_STATE_LOGGED_IN);
+                       qla4xxx_update_session_conn_param(ha, ddb_entry);
+                       status = QLA_SUCCESS;
+                       break;
+               case DDB_DS_SESSION_FAILED:
+                       iscsi_session_failure(ddb_entry->sess->dd_data,
+                                             ISCSI_ERR_CONN_FAILED);
+                       status = QLA_SUCCESS;
+                       break;
+               }
+               break;
        default:
                DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Unknown Event\n",
                                __func__));
index bea78a7f6bc161a5898e51dfa37296dccb904f2a..af83e6f3fe6fcd2fa3849e79cc1a905372548673 100644 (file)
@@ -1158,7 +1158,11 @@ static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn)
                goto exit_conn_start;
        }
 
-       ddb_entry->fw_ddb_device_state = DDB_DS_LOGIN_IN_PROCESS;
+       if (ddb_entry->fw_ddb_device_state == DDB_DS_NO_CONNECTION_ACTIVE)
+               ddb_entry->fw_ddb_device_state = DDB_DS_LOGIN_IN_PROCESS;
+
+       DEBUG2(printk(KERN_INFO "%s: DDB state [%d]\n", __func__,
+                     ddb_entry->fw_ddb_device_state));
 
 exit_set_param:
        iscsi_conn_start(cls_conn);