From b0030ecec8e4a6904179b7b5559cd95a08b00243 Mon Sep 17 00:00:00 2001 From: James Smart Date: Fri, 5 Dec 2008 16:29:59 -0600 Subject: [PATCH] --- yaml --- r: 124674 b: refs/heads/master c: f78badb1ae07e7f8b835ab2ea0b456ed3fc4caf4 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/scsi/scsi_transport_fc.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 66059c8b55d9..ea55e6f2b476 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 73208dfd7ab19f379d73e8a0fbf30f92c203e5e8 +refs/heads/master: f78badb1ae07e7f8b835ab2ea0b456ed3fc4caf4 diff --git a/trunk/drivers/scsi/scsi_transport_fc.c b/trunk/drivers/scsi/scsi_transport_fc.c index 1e71abf0607a..062304de4854 100644 --- a/trunk/drivers/scsi/scsi_transport_fc.c +++ b/trunk/drivers/scsi/scsi_transport_fc.c @@ -3012,6 +3012,16 @@ fc_timeout_deleted_rport(struct work_struct *work) rport->port_state = FC_PORTSTATE_NOTPRESENT; rport->flags &= ~FC_RPORT_FAST_FAIL_TIMEDOUT; + /* + * Pre-emptively kill I/O rather than waiting for the work queue + * item to teardown the starget. (FCOE libFC folks prefer this + * and to have the rport_port_id still set when it's done). + */ + spin_unlock_irqrestore(shost->host_lock, flags); + fc_terminate_rport_io(rport); + + BUG_ON(rport->port_state != FC_PORTSTATE_NOTPRESENT); + /* remove the identifiers that aren't used in the consisting binding */ switch (fc_host->tgtid_bind_type) { case FC_TGTID_BIND_BY_WWPN: @@ -3035,9 +3045,6 @@ fc_timeout_deleted_rport(struct work_struct *work) * went away and didn't come back - we'll remove * all attached scsi devices. */ - spin_unlock_irqrestore(shost->host_lock, flags); - - scsi_target_unblock(&rport->dev); fc_queue_work(shost, &rport->stgt_delete_work); }