diff options
Diffstat (limited to 'drivers/scsi/scsi_transport_fc.c')
-rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 80fbe2ac0b47..579760420d53 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
@@ -2808,17 +2808,20 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
2808 | FC_RPORT_DEVLOSS_PENDING | | 2808 | FC_RPORT_DEVLOSS_PENDING | |
2809 | FC_RPORT_DEVLOSS_CALLBK_DONE); | 2809 | FC_RPORT_DEVLOSS_CALLBK_DONE); |
2810 | 2810 | ||
2811 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
2812 | |||
2811 | /* if target, initiate a scan */ | 2813 | /* if target, initiate a scan */ |
2812 | if (rport->scsi_target_id != -1) { | 2814 | if (rport->scsi_target_id != -1) { |
2815 | scsi_target_unblock(&rport->dev); | ||
2816 | |||
2817 | spin_lock_irqsave(shost->host_lock, | ||
2818 | flags); | ||
2813 | rport->flags |= FC_RPORT_SCAN_PENDING; | 2819 | rport->flags |= FC_RPORT_SCAN_PENDING; |
2814 | scsi_queue_work(shost, | 2820 | scsi_queue_work(shost, |
2815 | &rport->scan_work); | 2821 | &rport->scan_work); |
2816 | spin_unlock_irqrestore(shost->host_lock, | 2822 | spin_unlock_irqrestore(shost->host_lock, |
2817 | flags); | 2823 | flags); |
2818 | scsi_target_unblock(&rport->dev); | 2824 | } |
2819 | } else | ||
2820 | spin_unlock_irqrestore(shost->host_lock, | ||
2821 | flags); | ||
2822 | 2825 | ||
2823 | fc_bsg_goose_queue(rport); | 2826 | fc_bsg_goose_queue(rport); |
2824 | 2827 | ||
@@ -2876,16 +2879,17 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
2876 | if (fci->f->dd_fcrport_size) | 2879 | if (fci->f->dd_fcrport_size) |
2877 | memset(rport->dd_data, 0, | 2880 | memset(rport->dd_data, 0, |
2878 | fci->f->dd_fcrport_size); | 2881 | fci->f->dd_fcrport_size); |
2882 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
2883 | |||
2884 | if (ids->roles & FC_PORT_ROLE_FCP_TARGET) { | ||
2885 | scsi_target_unblock(&rport->dev); | ||
2879 | 2886 | ||
2880 | if (rport->roles & FC_PORT_ROLE_FCP_TARGET) { | ||
2881 | /* initiate a scan of the target */ | 2887 | /* initiate a scan of the target */ |
2888 | spin_lock_irqsave(shost->host_lock, flags); | ||
2882 | rport->flags |= FC_RPORT_SCAN_PENDING; | 2889 | rport->flags |= FC_RPORT_SCAN_PENDING; |
2883 | scsi_queue_work(shost, &rport->scan_work); | 2890 | scsi_queue_work(shost, &rport->scan_work); |
2884 | spin_unlock_irqrestore(shost->host_lock, flags); | 2891 | spin_unlock_irqrestore(shost->host_lock, flags); |
2885 | scsi_target_unblock(&rport->dev); | 2892 | } |
2886 | } else | ||
2887 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
2888 | |||
2889 | return rport; | 2893 | return rport; |
2890 | } | 2894 | } |
2891 | } | 2895 | } |
@@ -3083,12 +3087,12 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) | |||
3083 | /* ensure any stgt delete functions are done */ | 3087 | /* ensure any stgt delete functions are done */ |
3084 | fc_flush_work(shost); | 3088 | fc_flush_work(shost); |
3085 | 3089 | ||
3090 | scsi_target_unblock(&rport->dev); | ||
3086 | /* initiate a scan of the target */ | 3091 | /* initiate a scan of the target */ |
3087 | spin_lock_irqsave(shost->host_lock, flags); | 3092 | spin_lock_irqsave(shost->host_lock, flags); |
3088 | rport->flags |= FC_RPORT_SCAN_PENDING; | 3093 | rport->flags |= FC_RPORT_SCAN_PENDING; |
3089 | scsi_queue_work(shost, &rport->scan_work); | 3094 | scsi_queue_work(shost, &rport->scan_work); |
3090 | spin_unlock_irqrestore(shost->host_lock, flags); | 3095 | spin_unlock_irqrestore(shost->host_lock, flags); |
3091 | scsi_target_unblock(&rport->dev); | ||
3092 | } | 3096 | } |
3093 | } | 3097 | } |
3094 | EXPORT_SYMBOL(fc_remote_port_rolechg); | 3098 | EXPORT_SYMBOL(fc_remote_port_rolechg); |