qla4xxx: wait for device to come online in reset_lun
Subsystems (2)
PATCH 1/12 qla4xxx: wait for device to come online in reset_lun
From: Vikas Chaudhary <[email protected]>
wait upto 10s for device to come online otherwise indicating an error condition.
Signed-off-by Vikas Chaudhary <[email protected]>
Signed-off-by Ravi Anand <[email protected]>
--- drivers/scsi/qla4xxx/ql4_def.h | 1 + drivers/scsi/qla4xxx/ql4_mbx.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 0 deletions(-)
drivers/scsi/qla4xxx/ql4_def.h +1 -0
@@ -146,6 +146,7 @@#define ISNS_DEREG_TOV 5#define MAX_RESET_HA_RETRIES 2 +#define DEVICE_ONLINE_TOV 10/* * SCSI Request Block structure (srb) that is placed
drivers/scsi/qla4xxx/ql4_mbx.c +22 -0
@@ -679,11 +679,33 @@ int qla4xxx_reset_lun(struct scsi_qla_host * ha, struct ddb_entry * ddb_entry,uint32_t mbox_cmd[MBOX_REG_COUNT ];uint32_t mbox_sts[MBOX_REG_COUNT ];int status =QLA_SUCCESS ; +unsigned long wait_online;DEBUG2 (printk ("scsi%ld:%d:%d: lun reset issued\n" , ha->host_no, ddb_entry->os_target_id, lun));/* +* If device is not online wait for 10 sec for device to come online. +* else return error +*/ +if (atomic_read (&ddb_entry->state) !=DDB_STATE_ONLINE ) { + wait_online = jiffies + (DEVICE_ONLINE_TOV *HZ ); +while (time_before (jiffies, wait_online)) { +set_current_state (TASK_INTERRUPTIBLE ); +schedule_timeout (HZ ); +if (atomic_read (&ddb_entry->state) ==DDB_STATE_ONLINE ) +break ; + } + +if (atomic_read (&ddb_entry->state) !=DDB_STATE_ONLINE ) { +DEBUG2 (printk (KERN_WARNING "scsi%ld: %s: Unable to " +"reset lun. Device is not online.\n" , + ha->host_no, __func__)); +return QLA_ERROR ; + } + } + +/* * Send lun reset command to ISP, so that the ISP will return all * outstanding requests with RESET status */
Signature · 3 lines
1.6.0.2 ----- End forwarded message -----
Quoted 49 lines · Ravi Anand
From: Vikas Chaudhary<[email protected]>
wait upto 10s for device to come online otherwise indicating an error condition.
Signed-off-by Vikas Chaudhary<[email protected]>Signed-off-by Ravi Anand<[email protected]>--- drivers/scsi/qla4xxx/ql4_def.h | 1 + drivers/scsi/qla4xxx/ql4_mbx.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 0 deletions(-)drivers/scsi/qla4xxx/ql4_def.h +1
-0@@ -146,6 +146,7 @@#define ISNS_DEREG_TOV 5#define MAX_RESET_HA_RETRIES 2 +#define DEVICE_ONLINE_TOV 10/* * SCSI Request Block structure (srb) that is placed drivers/scsi/qla4xxx/ql4_mbx.c +11
-0@@ -679,11 +679,33 @@ int qla4xxx_reset_lun(struct scsi_qla_host * ha, struct ddb_entry * ddb_entry,uint32_t mbox_cmd[MBOX_REG_COUNT ];uint32_t mbox_sts[MBOX_REG_COUNT ];int status =QLA_SUCCESS ; +unsigned long wait_online;DEBUG2 (printk ("scsi%ld:%d:%d: lun reset issued\n" , ha->host_no, ddb_entry->os_target_id, lun));/* +* If device is not online wait for 10 sec for device to come online. +* else return error +*/ +if (atomic_read (&ddb_entry->state) !=DDB_STATE_ONLINE ) { + wait_online = jiffies + (DEVICE_ONLINE_TOV *HZ ); +while (time_before (jiffies, wait_online)) { +set_current_state (TASK_INTERRUPTIBLE ); +schedule_timeout (HZ ); +if (atomic_read (&ddb_entry->state) ==DDB_STATE_ONLINE ) +break ;
drivers/scsi/qla4xxx/ql4_mbx.c int qla4xxx_reset_lun(struct scsi_qla_host * ha, struct ddb_entry * ddb_entry, · line 707
Quoted 10 lines
drivers/scsi/qla4xxx/ql4_mbx.c +10
-0+ } + +if (atomic_read (&ddb_entry->state) !=DDB_STATE_ONLINE ) { +DEBUG2 (printk (KERN_WARNING "scsi%ld: %s: Unable to " +"reset lun. Device is not online.\n" , + ha->host_no, __func__)); +return QLA_ERROR ; + } + } +
This looks similar to what you sent back in Feb. I said to wait in the target reset handler for the session to come back or for qla4xxx_recovery_timedout to be called