aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.c42
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.h1
2 files changed, 23 insertions, 20 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index af69c0738edb..844684581e45 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -496,6 +496,7 @@ static void ibmvfc_set_host_action(struct ibmvfc_host *vhost,
496 case IBMVFC_HOST_ACTION_INIT: 496 case IBMVFC_HOST_ACTION_INIT:
497 case IBMVFC_HOST_ACTION_TGT_DEL: 497 case IBMVFC_HOST_ACTION_TGT_DEL:
498 case IBMVFC_HOST_ACTION_QUERY_TGTS: 498 case IBMVFC_HOST_ACTION_QUERY_TGTS:
499 case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
499 case IBMVFC_HOST_ACTION_TGT_ADD: 500 case IBMVFC_HOST_ACTION_TGT_ADD:
500 case IBMVFC_HOST_ACTION_NONE: 501 case IBMVFC_HOST_ACTION_NONE:
501 default: 502 default:
@@ -2791,6 +2792,8 @@ static void ibmvfc_tgt_prli_done(struct ibmvfc_event *evt)
2791 rsp->status, rsp->error, status); 2792 rsp->status, rsp->error, status);
2792 if (ibmvfc_retry_cmd(rsp->status, rsp->error)) 2793 if (ibmvfc_retry_cmd(rsp->status, rsp->error))
2793 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_prli); 2794 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_prli);
2795 else
2796 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
2794 break; 2797 break;
2795 }; 2798 };
2796 2799
@@ -2885,6 +2888,8 @@ static void ibmvfc_tgt_plogi_done(struct ibmvfc_event *evt)
2885 2888
2886 if (ibmvfc_retry_cmd(rsp->status, rsp->error)) 2889 if (ibmvfc_retry_cmd(rsp->status, rsp->error))
2887 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_plogi); 2890 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_plogi);
2891 else
2892 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
2888 break; 2893 break;
2889 }; 2894 };
2890 2895
@@ -3176,6 +3181,8 @@ static void ibmvfc_tgt_query_target_done(struct ibmvfc_event *evt)
3176 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT); 3181 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
3177 else if (ibmvfc_retry_cmd(rsp->status, rsp->error)) 3182 else if (ibmvfc_retry_cmd(rsp->status, rsp->error))
3178 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_query_target); 3183 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_query_target);
3184 else
3185 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
3179 break; 3186 break;
3180 }; 3187 };
3181 3188
@@ -3506,6 +3513,7 @@ static int __ibmvfc_work_to_do(struct ibmvfc_host *vhost)
3506 case IBMVFC_HOST_ACTION_ALLOC_TGTS: 3513 case IBMVFC_HOST_ACTION_ALLOC_TGTS:
3507 case IBMVFC_HOST_ACTION_TGT_ADD: 3514 case IBMVFC_HOST_ACTION_TGT_ADD:
3508 case IBMVFC_HOST_ACTION_TGT_DEL: 3515 case IBMVFC_HOST_ACTION_TGT_DEL:
3516 case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
3509 case IBMVFC_HOST_ACTION_QUERY: 3517 case IBMVFC_HOST_ACTION_QUERY:
3510 default: 3518 default:
3511 break; 3519 break;
@@ -3621,6 +3629,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
3621 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL); 3629 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL);
3622 break; 3630 break;
3623 case IBMVFC_HOST_ACTION_TGT_DEL: 3631 case IBMVFC_HOST_ACTION_TGT_DEL:
3632 case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
3624 list_for_each_entry(tgt, &vhost->targets, queue) { 3633 list_for_each_entry(tgt, &vhost->targets, queue) {
3625 if (tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) { 3634 if (tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) {
3626 tgt_dbg(tgt, "Deleting rport\n"); 3635 tgt_dbg(tgt, "Deleting rport\n");
@@ -3636,8 +3645,17 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
3636 } 3645 }
3637 3646
3638 if (vhost->state == IBMVFC_INITIALIZING) { 3647 if (vhost->state == IBMVFC_INITIALIZING) {
3639 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT); 3648 if (vhost->action == IBMVFC_HOST_ACTION_TGT_DEL_FAILED) {
3640 vhost->job_step = ibmvfc_discover_targets; 3649 ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE);
3650 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_ADD);
3651 vhost->init_retries = 0;
3652 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3653 scsi_unblock_requests(vhost->host);
3654 return;
3655 } else {
3656 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
3657 vhost->job_step = ibmvfc_discover_targets;
3658 }
3641 } else { 3659 } else {
3642 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); 3660 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
3643 spin_unlock_irqrestore(vhost->host->host_lock, flags); 3661 spin_unlock_irqrestore(vhost->host->host_lock, flags);
@@ -3660,14 +3678,8 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
3660 } 3678 }
3661 } 3679 }
3662 3680
3663 if (!ibmvfc_dev_init_to_do(vhost)) { 3681 if (!ibmvfc_dev_init_to_do(vhost))
3664 ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE); 3682 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL_FAILED);
3665 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_ADD);
3666 vhost->init_retries = 0;
3667 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3668 scsi_unblock_requests(vhost->host);
3669 return;
3670 }
3671 break; 3683 break;
3672 case IBMVFC_HOST_ACTION_TGT_ADD: 3684 case IBMVFC_HOST_ACTION_TGT_ADD:
3673 list_for_each_entry(tgt, &vhost->targets, queue) { 3685 list_for_each_entry(tgt, &vhost->targets, queue) {
@@ -3675,16 +3687,6 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
3675 spin_unlock_irqrestore(vhost->host->host_lock, flags); 3687 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3676 ibmvfc_tgt_add_rport(tgt); 3688 ibmvfc_tgt_add_rport(tgt);
3677 return; 3689 return;
3678 } else if (tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) {
3679 tgt_dbg(tgt, "Deleting rport\n");
3680 rport = tgt->rport;
3681 tgt->rport = NULL;
3682 list_del(&tgt->queue);
3683 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3684 if (rport)
3685 fc_remote_port_delete(rport);
3686 kref_put(&tgt->kref, ibmvfc_release_tgt);
3687 return;
3688 } 3690 }
3689 } 3691 }
3690 3692
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
index c3696ce470bd..2d723df5b18c 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.h
+++ b/drivers/scsi/ibmvscsi/ibmvfc.h
@@ -626,6 +626,7 @@ enum ibmvfc_host_action {
626 IBMVFC_HOST_ACTION_TGT_DEL, 626 IBMVFC_HOST_ACTION_TGT_DEL,
627 IBMVFC_HOST_ACTION_ALLOC_TGTS, 627 IBMVFC_HOST_ACTION_ALLOC_TGTS,
628 IBMVFC_HOST_ACTION_TGT_INIT, 628 IBMVFC_HOST_ACTION_TGT_INIT,
629 IBMVFC_HOST_ACTION_TGT_DEL_FAILED,
629 IBMVFC_HOST_ACTION_TGT_ADD, 630 IBMVFC_HOST_ACTION_TGT_ADD,
630}; 631};
631 632