From: Brian King <brk...@linux.vnet.ibm.com>

[ Upstream commit 62fa3ce05d5d73c5eccc40b2db493f55fecfc446 ]

Fix an issue reported when performing a live migration when multipath is
configured with a short fast fail timeout of 5 seconds and also to have
no_path_retry set to fail. In this scenario, all paths would go into the
devloss state while the ibmvfc driver went through discovery to log back
in. On a loaded system, the discovery might take longer than 5 seconds,
which was resulting in all paths being marked failed, which then resulted
in a read only filesystem.

This patch changes the migration code in ibmvfc to avoid deleting rports at
all in this scenario, so we avoid losing all paths.

Signed-off-by: Brian King <brk...@linux.vnet.ibm.com>
Link: 
https://lore.kernel.org/r/20221026181356.148517-1-brk...@linux.vnet.ibm.com
Signed-off-by: Martin K. Petersen <martin.peter...@oracle.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/scsi/ibmvscsi/ibmvfc.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index 00684e11976b..1a0c0b7289d2 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -708,8 +708,13 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost)
                memset(vhost->async_crq.msgs.async, 0, PAGE_SIZE);
                vhost->async_crq.cur = 0;
 
-               list_for_each_entry(tgt, &vhost->targets, queue)
-                       ibmvfc_del_tgt(tgt);
+               list_for_each_entry(tgt, &vhost->targets, queue) {
+                       if (vhost->client_migrated)
+                               tgt->need_login = 1;
+                       else
+                               ibmvfc_del_tgt(tgt);
+               }
+
                scsi_block_requests(vhost->host);
                ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
                vhost->job_step = ibmvfc_npiv_login;
@@ -3235,9 +3240,12 @@ static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, 
struct ibmvfc_host *vhost,
                        /* We need to re-setup the interpartition connection */
                        dev_info(vhost->dev, "Partition migrated, Re-enabling 
adapter\n");
                        vhost->client_migrated = 1;
+
+                       scsi_block_requests(vhost->host);
                        ibmvfc_purge_requests(vhost, DID_REQUEUE);
-                       ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
+                       ibmvfc_set_host_state(vhost, IBMVFC_LINK_DOWN);
                        ibmvfc_set_host_action(vhost, 
IBMVFC_HOST_ACTION_REENABLE);
+                       wake_up(&vhost->work_wait_q);
                } else if (crq->format == IBMVFC_PARTNER_FAILED || crq->format 
== IBMVFC_PARTNER_DEREGISTER) {
                        dev_err(vhost->dev, "Host partner adapter deregistered 
or failed (rc=%d)\n", crq->format);
                        ibmvfc_purge_requests(vhost, DID_ERROR);
-- 
2.35.1

Reply via email to