On 10/03/2011 04:01 PM, Mike Christie wrote: > On 10/03/2011 12:29 PM, vikas.chaudhary@xxxxxxxxxx wrote: >> From: Manish Rangankar <manish.rangankar@xxxxxxxxxx> >> >> Devices are getting blocked during continuous link up and down. Solution is, >> during relogin unblock the session before sending connection logged in event. >> >> JIRA Key: UPSISCSI-138 >> >> Signed-off-by: Manish Rangankar <manish.rangankar@xxxxxxxxxx> >> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@xxxxxxxxxx> >> --- >> drivers/scsi/qla4xxx/ql4_init.c | 1 + >> 1 files changed, 1 insertions(+), 0 deletions(-) >> >> diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c >> index cc10bac..e07d99b 100644 >> --- a/drivers/scsi/qla4xxx/ql4_init.c >> +++ b/drivers/scsi/qla4xxx/ql4_init.c >> @@ -900,6 +900,7 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, >> switch (state) { >> case DDB_DS_SESSION_ACTIVE: >> case DDB_DS_DISCOVERY: >> + iscsi_unblock_session(ddb_entry->sess); > > Shouldn't this alreadu get done when start_conn callback is called? > > Is the problem that start_conn is getting called when login is started > and not when we are actually logged in (when we get the logged in event > below)? > > The start_conn callback use looks wrong right now for qla4xxx. > user/initiator.c:setup_offload_login_phase() will call it when we are > only in_login. It should only be called when we are logged_in, because > it will unlbock the devices, update the iscsi session state and could > start IO before the driver is ready. > One clarification. Qla4xxx needs to do its setup in there but it should not call iscsi_conn_start until it is actually logged in. I think we want to do like the attached (patch not even compile tested). It is built over this patch and 10/13.
diff --git a/drivers/scsi/qla4xxx/ql4_init.c b/drivers/scsi/qla4xxx/ql4_init.c index e07d99b..3075fba 100644 --- a/drivers/scsi/qla4xxx/ql4_init.c +++ b/drivers/scsi/qla4xxx/ql4_init.c @@ -900,7 +900,7 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, switch (state) { case DDB_DS_SESSION_ACTIVE: case DDB_DS_DISCOVERY: - iscsi_unblock_session(ddb_entry->sess); + iscsi_conn_start(ddb_entry->conn); iscsi_conn_login_event(ddb_entry->conn, ISCSI_CONN_STATE_LOGGED_IN); qla4xxx_update_session_conn_param(ha, ddb_entry); @@ -936,6 +936,7 @@ int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index, switch (state) { case DDB_DS_SESSION_ACTIVE: case DDB_DS_DISCOVERY: + iscsi_conn_start(ddb_entry->conn); iscsi_conn_login_event(ddb_entry->conn, ISCSI_CONN_STATE_LOGGED_IN); qla4xxx_update_session_conn_param(ha, ddb_entry); diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index f84ddd2..676aedc 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c @@ -1136,7 +1136,7 @@ static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn) if (mbx_sts) if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) { - iscsi_unblock_session(ddb_entry->sess); + iscsi_conn_start(ddb_entry->conn); iscsi_conn_login_event(ddb_entry->conn, ISCSI_CONN_STATE_LOGGED_IN); goto exit_set_param; @@ -1162,7 +1162,6 @@ static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn) ddb_entry->fw_ddb_device_state)); exit_set_param: - iscsi_conn_start(cls_conn); ret = 0; exit_conn_start: