Extend target deletion paths to process NVMe targets as well as SCSI
targets.

Update link-down, and host reinitialization flows to walk both the SCSI
and NVMe target lists when marking targets for deletion. This ensures
that protocol-specific target state stays consistent across adapter
resets and fabric events.

Rename ibmvfc_relogin to ibmvfc_scsi_relogin as it acts on a scsi
command.

Signed-off-by: Tyrel Datwyler <[email protected]>
---
 drivers/scsi/ibmvscsi/ibmvfc-core.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvfc-core.c 
b/drivers/scsi/ibmvscsi/ibmvfc-core.c
index 4b95e4344947..13e513bfd0a8 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc-core.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc-core.c
@@ -714,6 +714,8 @@ static void ibmvfc_link_down(struct ibmvfc_host *vhost,
        scsi_block_requests(vhost->host);
        list_for_each_entry(tgt, &vhost->scsi_scrqs.targets, queue)
                ibmvfc_del_tgt(tgt);
+       list_for_each_entry(tgt, &vhost->nvme_scrqs.targets, queue)
+               ibmvfc_del_tgt(tgt);
        ibmvfc_set_host_state(vhost, state);
        ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL);
        vhost->events_to_log |= IBMVFC_AE_LINKDOWN;
@@ -751,6 +753,12 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost)
                        else
                                ibmvfc_del_tgt(tgt);
                }
+               list_for_each_entry(tgt, &vhost->nvme_scrqs.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);
@@ -1868,7 +1876,7 @@ static void ibmvfc_log_error(struct ibmvfc_event *evt)
  * @sdev:      scsi device struct
  *
  **/
-static void ibmvfc_relogin(struct scsi_device *sdev)
+static void ibmvfc_scsi_relogin(struct scsi_device *sdev)
 {
        struct ibmvfc_host *vhost = shost_priv(sdev->host);
        struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
@@ -1920,7 +1928,7 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt)
                                memcpy(cmnd->sense_buffer, rsp->data.sense + 
rsp_len, sense_len);
                        if ((be16_to_cpu(vfc_cmd->status) & 
IBMVFC_VIOS_FAILURE) &&
                            (be16_to_cpu(vfc_cmd->error) == 
IBMVFC_PLOGI_REQUIRED))
-                               ibmvfc_relogin(cmnd->device);
+                               ibmvfc_scsi_relogin(cmnd->device);
 
                        if (!cmnd->result && (!scsi_get_resid(cmnd) || 
(rsp->flags & FCP_RESID_OVER)))
                                cmnd->result = (DID_ERROR << 16);
-- 
2.54.0


Reply via email to