]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/scsi_transport_fc.c
[SCSI] fc transport: pre-emptively terminate i/o upon dev_loss_tmo timeout
[linux-2.6-omap-h63xx.git] / drivers / scsi / scsi_transport_fc.c
index 1e71abf0607a12381881b453f1ccbd7e78cb8e3a..062304de4854ea89791f9f7b822fc833fa974762 100644 (file)
@@ -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);
 }