diff options
Diffstat (limited to 'drivers/scsi/scsi_transport_fc.c')
-rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 1e71abf0607a..062304de4854 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
@@ -3012,6 +3012,16 @@ fc_timeout_deleted_rport(struct work_struct *work) | |||
3012 | rport->port_state = FC_PORTSTATE_NOTPRESENT; | 3012 | rport->port_state = FC_PORTSTATE_NOTPRESENT; |
3013 | rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT; | 3013 | rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT; |
3014 | 3014 | ||
3015 | /* | ||
3016 | * Pre-emptively kill I/O rather than waiting for the work queue | ||
3017 | * item to teardown the starget. (FCOE libFC folks prefer this | ||
3018 | * and to have the rport_port_id still set when it's done). | ||
3019 | */ | ||
3020 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
3021 | fc_terminate_rport_io(rport); | ||
3022 | |||
3023 | BUG_ON(rport->port_state != FC_PORTSTATE_NOTPRESENT); | ||
3024 | |||
3015 | /* remove the identifiers that aren't used in the consisting binding */ | 3025 | /* remove the identifiers that aren't used in the consisting binding */ |
3016 | switch (fc_host->tgtid_bind_type) { | 3026 | switch (fc_host->tgtid_bind_type) { |
3017 | case FC_TGTID_BIND_BY_WWPN: | 3027 | case FC_TGTID_BIND_BY_WWPN: |
@@ -3035,9 +3045,6 @@ fc_timeout_deleted_rport(struct work_struct *work) | |||
3035 | * went away and didn't come back - we'll remove | 3045 | * went away and didn't come back - we'll remove |
3036 | * all attached scsi devices. | 3046 | * all attached scsi devices. |
3037 | */ | 3047 | */ |
3038 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
3039 | |||
3040 | scsi_target_unblock(&rport->dev); | ||
3041 | fc_queue_work(shost, &rport->stgt_delete_work); | 3048 | fc_queue_work(shost, &rport->stgt_delete_work); |
3042 | } | 3049 | } |
3043 | 3050 | ||