diff options
-rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index f2db7a41cf1d..c76e73a3ffbe 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
@@ -1284,7 +1284,9 @@ EXPORT_SYMBOL(fc_release_transport); | |||
1284 | * @work: Work to queue for execution. | 1284 | * @work: Work to queue for execution. |
1285 | * | 1285 | * |
1286 | * Return value: | 1286 | * Return value: |
1287 | * 0 on success / != 0 for error | 1287 | * 1 - work queued for execution |
1288 | * 0 - work is already queued | ||
1289 | * -EINVAL - work queue doesn't exist | ||
1288 | **/ | 1290 | **/ |
1289 | static int | 1291 | static int |
1290 | fc_queue_work(struct Scsi_Host *shost, struct work_struct *work) | 1292 | fc_queue_work(struct Scsi_Host *shost, struct work_struct *work) |
@@ -1434,8 +1436,6 @@ fc_starget_delete(void *data) | |||
1434 | struct Scsi_Host *shost = rport_to_shost(rport); | 1436 | struct Scsi_Host *shost = rport_to_shost(rport); |
1435 | unsigned long flags; | 1437 | unsigned long flags; |
1436 | 1438 | ||
1437 | scsi_target_unblock(&rport->dev); | ||
1438 | |||
1439 | spin_lock_irqsave(shost->host_lock, flags); | 1439 | spin_lock_irqsave(shost->host_lock, flags); |
1440 | if (rport->flags & FC_RPORT_DEVLOSS_PENDING) { | 1440 | if (rport->flags & FC_RPORT_DEVLOSS_PENDING) { |
1441 | spin_unlock_irqrestore(shost->host_lock, flags); | 1441 | spin_unlock_irqrestore(shost->host_lock, flags); |
@@ -1707,6 +1707,8 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
1707 | 1707 | ||
1708 | spin_unlock_irqrestore(shost->host_lock, flags); | 1708 | spin_unlock_irqrestore(shost->host_lock, flags); |
1709 | 1709 | ||
1710 | scsi_target_unblock(&rport->dev); | ||
1711 | |||
1710 | return rport; | 1712 | return rport; |
1711 | } | 1713 | } |
1712 | } | 1714 | } |
@@ -1762,9 +1764,10 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
1762 | /* initiate a scan of the target */ | 1764 | /* initiate a scan of the target */ |
1763 | rport->flags |= FC_RPORT_SCAN_PENDING; | 1765 | rport->flags |= FC_RPORT_SCAN_PENDING; |
1764 | scsi_queue_work(shost, &rport->scan_work); | 1766 | scsi_queue_work(shost, &rport->scan_work); |
1765 | } | 1767 | spin_unlock_irqrestore(shost->host_lock, flags); |
1766 | 1768 | scsi_target_unblock(&rport->dev); | |
1767 | spin_unlock_irqrestore(shost->host_lock, flags); | 1769 | } else |
1770 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
1768 | 1771 | ||
1769 | return rport; | 1772 | return rport; |
1770 | } | 1773 | } |
@@ -1938,6 +1941,7 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) | |||
1938 | rport->flags |= FC_RPORT_SCAN_PENDING; | 1941 | rport->flags |= FC_RPORT_SCAN_PENDING; |
1939 | scsi_queue_work(shost, &rport->scan_work); | 1942 | scsi_queue_work(shost, &rport->scan_work); |
1940 | spin_unlock_irqrestore(shost->host_lock, flags); | 1943 | spin_unlock_irqrestore(shost->host_lock, flags); |
1944 | scsi_target_unblock(&rport->dev); | ||
1941 | } | 1945 | } |
1942 | } | 1946 | } |
1943 | EXPORT_SYMBOL(fc_remote_port_rolechg); | 1947 | EXPORT_SYMBOL(fc_remote_port_rolechg); |
@@ -1970,8 +1974,9 @@ fc_timeout_deleted_rport(void *data) | |||
1970 | dev_printk(KERN_ERR, &rport->dev, | 1974 | dev_printk(KERN_ERR, &rport->dev, |
1971 | "blocked FC remote port time out: no longer" | 1975 | "blocked FC remote port time out: no longer" |
1972 | " a FCP target, removing starget\n"); | 1976 | " a FCP target, removing starget\n"); |
1973 | fc_queue_work(shost, &rport->stgt_delete_work); | ||
1974 | spin_unlock_irqrestore(shost->host_lock, flags); | 1977 | spin_unlock_irqrestore(shost->host_lock, flags); |
1978 | scsi_target_unblock(&rport->dev); | ||
1979 | fc_queue_work(shost, &rport->stgt_delete_work); | ||
1975 | return; | 1980 | return; |
1976 | } | 1981 | } |
1977 | 1982 | ||
@@ -2035,17 +2040,15 @@ fc_timeout_deleted_rport(void *data) | |||
2035 | * went away and didn't come back - we'll remove | 2040 | * went away and didn't come back - we'll remove |
2036 | * all attached scsi devices. | 2041 | * all attached scsi devices. |
2037 | */ | 2042 | */ |
2038 | fc_queue_work(shost, &rport->stgt_delete_work); | ||
2039 | |||
2040 | spin_unlock_irqrestore(shost->host_lock, flags); | 2043 | spin_unlock_irqrestore(shost->host_lock, flags); |
2044 | |||
2045 | scsi_target_unblock(&rport->dev); | ||
2046 | fc_queue_work(shost, &rport->stgt_delete_work); | ||
2041 | } | 2047 | } |
2042 | 2048 | ||
2043 | /** | 2049 | /** |
2044 | * fc_scsi_scan_rport - called to perform a scsi scan on a remote port. | 2050 | * fc_scsi_scan_rport - called to perform a scsi scan on a remote port. |
2045 | * | 2051 | * |
2046 | * Will unblock the target (in case it went away and has now come back), | ||
2047 | * then invoke a scan. | ||
2048 | * | ||
2049 | * @data: remote port to be scanned. | 2052 | * @data: remote port to be scanned. |
2050 | **/ | 2053 | **/ |
2051 | static void | 2054 | static void |
@@ -2057,7 +2060,6 @@ fc_scsi_scan_rport(void *data) | |||
2057 | 2060 | ||
2058 | if ((rport->port_state == FC_PORTSTATE_ONLINE) && | 2061 | if ((rport->port_state == FC_PORTSTATE_ONLINE) && |
2059 | (rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { | 2062 | (rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { |
2060 | scsi_target_unblock(&rport->dev); | ||
2061 | scsi_scan_target(&rport->dev, rport->channel, | 2063 | scsi_scan_target(&rport->dev, rport->channel, |
2062 | rport->scsi_target_id, SCAN_WILD_CARD, 1); | 2064 | rport->scsi_target_id, SCAN_WILD_CARD, 1); |
2063 | } | 2065 | } |