scsi: scsi_transport_fc: set scsi_target_id upon rescan
authorHannes Reinecke <hare@suse.com>
Wed, 20 Sep 2017 06:58:53 +0000 (08:58 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 25 Sep 2017 23:00:00 +0000 (19:00 -0400)
When an rport is found in the bindings array there is no guarantee that
it had been a target port, so we need to call fc_remote_port_rolechg()
here to ensure the scsi_target_id is set correctly.  Otherwise the port
will never be scanned.

Signed-off-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Tested-by: Chad Dupuis <chad.dupuis@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_transport_fc.c

index ba9d70f8a6a17f9b25008b3f86b03932c9218eb2..e74fffc32c75c5ea7078a43014fd6941ad4b3128 100644 (file)
@@ -2876,7 +2876,6 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
                        memcpy(&rport->port_name, &ids->port_name,
                                sizeof(rport->port_name));
                        rport->port_id = ids->port_id;
-                       rport->roles = ids->roles;
                        rport->port_state = FC_PORTSTATE_ONLINE;
                        rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT;
 
@@ -2885,15 +2884,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
                                                fci->f->dd_fcrport_size);
                        spin_unlock_irqrestore(shost->host_lock, flags);
 
-                       if (ids->roles & FC_PORT_ROLE_FCP_TARGET) {
-                               scsi_target_unblock(&rport->dev, SDEV_RUNNING);
-
-                               /* initiate a scan of the target */
-                               spin_lock_irqsave(shost->host_lock, flags);
-                               rport->flags |= FC_RPORT_SCAN_PENDING;
-                               scsi_queue_work(shost, &rport->scan_work);
-                               spin_unlock_irqrestore(shost->host_lock, flags);
-                       }
+                       fc_remote_port_rolechg(rport, ids->roles);
                        return rport;
                }
        }