Merge tag 'isci-for-3.5' into misc
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / scsi_transport_fc.c
index 80fbe2ac0b47b29b3dce589343ca58c8d8ab392b..579760420d538d28f28d2f1e7246fc3d990e7fbf 100644 (file)
@@ -2808,17 +2808,20 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
                                                  FC_RPORT_DEVLOSS_PENDING |
                                                  FC_RPORT_DEVLOSS_CALLBK_DONE);
 
+                               spin_unlock_irqrestore(shost->host_lock, flags);
+
                                /* if target, initiate a scan */
                                if (rport->scsi_target_id != -1) {
+                                       scsi_target_unblock(&rport->dev);
+
+                                       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);
-                                       scsi_target_unblock(&rport->dev);
-                               } else
-                                       spin_unlock_irqrestore(shost->host_lock,
-                                                       flags);
+                               }
 
                                fc_bsg_goose_queue(rport);
 
@@ -2876,16 +2879,17 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
                        if (fci->f->dd_fcrport_size)
                                memset(rport->dd_data, 0,
                                                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);
 
-                       if (rport->roles & FC_PORT_ROLE_FCP_TARGET) {
                                /* 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);
-                               scsi_target_unblock(&rport->dev);
-                       } else
-                               spin_unlock_irqrestore(shost->host_lock, flags);
-
+                       }
                        return rport;
                }
        }
@@ -3083,12 +3087,12 @@ fc_remote_port_rolechg(struct fc_rport  *rport, u32 roles)
                /* ensure any stgt delete functions are done */
                fc_flush_work(shost);
 
+               scsi_target_unblock(&rport->dev);
                /* 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);
-               scsi_target_unblock(&rport->dev);
        }
 }
 EXPORT_SYMBOL(fc_remote_port_rolechg);