Mike Christie wrote:
>
> Qla4xxx can just call the iscsi recovery functions directly.
> There is no need for userspace to do this for qla4xxx, because
> we do not use the mutex to iterate over devices anymore and
> iscsi_block
> /unblock_session can be called from interrupt context or the
> dpc thread.
> And having userspace do this just creates uneeded headaches
> for qla4xxx root
> situations where the session may experience problems. For example
> during the kernel shutdown the scsi layer wants to send sync
> caches, but at
> this time userspace is not up (iscsid is not running), so we cannot
> recover from the problem.
>
> Signed-off-by: Mike Christie <[EMAIL PROTECTED]>
> ---
> drivers/scsi/qla4xxx/ql4_init.c | 1 +
> drivers/scsi/qla4xxx/ql4_os.c | 40
> +++-----------------------------------
> 2 files changed, 5 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/scsi/qla4xxx/ql4_init.c
> b/drivers/scsi/qla4xxx/ql4_init.c
> index cbe0a17..03e66cb 100644
> --- a/drivers/scsi/qla4xxx/ql4_init.c
> +++ b/drivers/scsi/qla4xxx/ql4_init.c
> @@ -1306,6 +1306,7 @@ int qla4xxx_process_ddb_changed(struct
> scsi_qla_host *ha,
> atomic_set(&ddb_entry->relogin_timer, 0);
> clear_bit(DF_RELOGIN, &ddb_entry->flags);
> clear_bit(DF_NO_RELOGIN, &ddb_entry->flags);
> + iscsi_unblock_session(ddb_entry->sess);
> iscsi_session_event(ddb_entry->sess,
> ISCSI_KEVENT_CREATE_SESSION);
> /*
> diff --git a/drivers/scsi/qla4xxx/ql4_os.c
> b/drivers/scsi/qla4xxx/ql4_os.c
> index 2e2b9fe..a87fb9f 100644
> --- a/drivers/scsi/qla4xxx/ql4_os.c
> +++ b/drivers/scsi/qla4xxx/ql4_os.c
> @@ -63,8 +63,6 @@ static int qla4xxx_sess_get_param(struct
> iscsi_cls_session *sess,
> enum iscsi_param param, char *buf);
> static int qla4xxx_host_get_param(struct Scsi_Host *shost,
> enum iscsi_host_param param,
> char *buf);
> -static void qla4xxx_conn_stop(struct iscsi_cls_conn *conn, int flag);
> -static int qla4xxx_conn_start(struct iscsi_cls_conn *conn);
> static void qla4xxx_recovery_timedout(struct
> iscsi_cls_session *session);
>
> /*
> @@ -116,8 +114,6 @@ static struct iscsi_transport
> qla4xxx_iscsi_transport = {
> .get_conn_param = qla4xxx_conn_get_param,
> .get_session_param = qla4xxx_sess_get_param,
> .get_host_param = qla4xxx_host_get_param,
> - .start_conn = qla4xxx_conn_start,
> - .stop_conn = qla4xxx_conn_stop,
> .session_recovery_timedout = qla4xxx_recovery_timedout,
> };
>
> @@ -140,38 +136,6 @@ static void
> qla4xxx_recovery_timedout(struct iscsi_cls_session *session)
> queue_work(ha->dpc_thread, &ha->dpc_work);
> }
>
> -static int qla4xxx_conn_start(struct iscsi_cls_conn *conn)
> -{
> - struct iscsi_cls_session *session;
> - struct ddb_entry *ddb_entry;
> -
> - session = iscsi_dev_to_session(conn->dev.parent);
> - ddb_entry = session->dd_data;
> -
> - DEBUG2(printk("scsi%ld: %s: index [%d] starting conn\n",
> - ddb_entry->ha->host_no, __func__,
> - ddb_entry->fw_ddb_index));
> - iscsi_unblock_session(session);
> - return 0;
> -}
> -
> -static void qla4xxx_conn_stop(struct iscsi_cls_conn *conn, int flag)
> -{
> - struct iscsi_cls_session *session;
> - struct ddb_entry *ddb_entry;
> -
> - session = iscsi_dev_to_session(conn->dev.parent);
> - ddb_entry = session->dd_data;
> -
> - DEBUG2(printk("scsi%ld: %s: index [%d] stopping conn\n",
> - ddb_entry->ha->host_no, __func__,
> - ddb_entry->fw_ddb_index));
> - if (flag == STOP_CONN_RECOVER)
> - iscsi_block_session(session);
> - else
> - printk(KERN_ERR "iscsi: invalid stop flag %d\n", flag);
> -}
> -
> static int qla4xxx_host_get_param(struct Scsi_Host *shost,
> enum iscsi_host_param param,
> char *buf)
> {
> @@ -308,6 +272,9 @@ int qla4xxx_add_sess(struct ddb_entry *ddb_entry)
> DEBUG2(printk(KERN_ERR "Could not add connection.\n"));
> return -ENOMEM;
> }
> +
> + /* finally ready to go */
> + iscsi_unblock_session(ddb_entry->sess);
> return 0;
> }
>
> @@ -364,6 +331,7 @@ void qla4xxx_mark_device_missing(struct
> scsi_qla_host *ha,
> DEBUG3(printk("scsi%d:%d:%d: index [%d] marked MISSING\n",
> ha->host_no, ddb_entry->bus, ddb_entry->target,
> ddb_entry->fw_ddb_index));
> + iscsi_block_session(ddb_entry->sess);
> iscsi_conn_error(ddb_entry->conn, ISCSI_ERR_CONN_FAILED);
> }
Acked by David Somayajulu <[EMAIL PROTECTED]>
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html