]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ibmvfc: Delay NPIV login retry and add retries
authorBrian King <brking@linux.vnet.ibm.com>
Wed, 3 Dec 2008 17:02:54 +0000 (11:02 -0600)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sun, 18 Jan 2009 18:44:05 +0000 (10:44 -0800)
commit 1c41fa8288277e76785acb50f52bb2f39509f903 upstream.

Adds a delay prior to retrying a failed NPIV login. This fixes
a scenario if the backing fibre channel adapter is getting reset
due to an EEH event, NPIV login will fail. Currently, ibmvfc
retries three times very quickly, resets the CRQ and tries one
more time. If the adapter is getting reset due to EEH, this isn't
enough time. This adds a delay prior to retrying a failed NPIV
login and also increments the number of retries.

Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/scsi/ibmvscsi/ibmvfc.c
drivers/scsi/ibmvscsi/ibmvfc.h

index 7650707a40defc4f7a032a4972cad4afabd99af9..4dbb9cd6dac32b03a090eb03233b9bd281b85a74 100644 (file)
@@ -566,7 +566,7 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin)
        struct ibmvfc_target *tgt;
 
        if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
-               if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) {
+               if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
                        dev_err(vhost->dev,
                                "Host initialization retries exceeded. Taking adapter offline\n");
                        ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
@@ -847,11 +847,12 @@ static void ibmvfc_reset_host(struct ibmvfc_host *vhost)
 static void ibmvfc_retry_host_init(struct ibmvfc_host *vhost)
 {
        if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
-               if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) {
+               vhost->delay_init = 1;
+               if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
                        dev_err(vhost->dev,
                                "Host initialization retries exceeded. Taking adapter offline\n");
                        ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
-               } else if (vhost->init_retries == IBMVFC_MAX_INIT_RETRIES)
+               } else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES)
                        __ibmvfc_reset_host(vhost);
                else
                        ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
@@ -2669,7 +2670,7 @@ static void ibmvfc_init_tgt(struct ibmvfc_target *tgt,
 static void ibmvfc_retry_tgt_init(struct ibmvfc_target *tgt,
                                  void (*job_step) (struct ibmvfc_target *))
 {
-       if (++tgt->init_retries > IBMVFC_MAX_INIT_RETRIES) {
+       if (++tgt->init_retries > IBMVFC_MAX_TGT_INIT_RETRIES) {
                ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
                wake_up(&tgt->vhost->work_wait_q);
        } else
@@ -3519,7 +3520,13 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
                break;
        case IBMVFC_HOST_ACTION_INIT:
                BUG_ON(vhost->state != IBMVFC_INITIALIZING);
-               vhost->job_step(vhost);
+               if (vhost->delay_init) {
+                       vhost->delay_init = 0;
+                       spin_unlock_irqrestore(vhost->host->host_lock, flags);
+                       ssleep(5);
+                       return;
+               } else
+                       vhost->job_step(vhost);
                break;
        case IBMVFC_HOST_ACTION_QUERY:
                list_for_each_entry(tgt, &vhost->targets, queue)
index fb3177ab66918382c878fc0289c8bbf4cce9ff95..089598e2dddb53182f36521ca6f824776b092149 100644 (file)
@@ -43,7 +43,8 @@
 #define IBMVFC_MAX_DISC_THREADS        4
 #define IBMVFC_TGT_MEMPOOL_SZ          64
 #define IBMVFC_MAX_CMDS_PER_LUN        64
-#define IBMVFC_MAX_INIT_RETRIES        3
+#define IBMVFC_MAX_HOST_INIT_RETRIES   6
+#define IBMVFC_MAX_TGT_INIT_RETRIES            3
 #define IBMVFC_DEV_LOSS_TMO            (5 * 60)
 #define IBMVFC_DEFAULT_LOG_LEVEL       2
 #define IBMVFC_MAX_CDB_LEN             16
@@ -671,6 +672,7 @@ struct ibmvfc_host {
        int discovery_threads;
        int client_migrated;
        int reinit;
+       int delay_init;
        int events_to_log;
 #define IBMVFC_AE_LINKUP       0x0001
 #define IBMVFC_AE_LINKDOWN     0x0002