[SCSI] libfc: fix exchange being deleted when the abort itself is timed out
authorYi Zou <yi.zou@intel.com>
Wed, 1 Dec 2010 00:19:25 +0000 (16:19 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Tue, 21 Dec 2010 18:24:26 +0000 (12:24 -0600)
Should not continue when the abort itself is being timeout since in that case
the exchange will be deleted and relesased. We still want to call the
associated response handler to let the layer, e.g., fcp, know the exchange
itself is being timed out.

Signed-off-by: Yi Zou <yi.zou@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/libfc/fc_exch.c

index 8bfb421fcdd66e18f1b7ada4064ecdd486790e62..d21367d3305fd6de6bd68f0505618ff97b6b927b 100644 (file)
@@ -650,10 +650,13 @@ static void fc_exch_timeout(struct work_struct *work)
                if (e_stat & ESB_ST_ABNORMAL)
                        rc = fc_exch_done_locked(ep);
                spin_unlock_bh(&ep->ex_lock);
-               if (!rc)
-                       fc_exch_delete(ep);
                if (resp)
                        resp(sp, ERR_PTR(-FC_EX_TIMEOUT), arg);
+               if (!rc) {
+                       /* delete the exchange if it's already being aborted */
+                       fc_exch_delete(ep);
+                       return;
+               }
                fc_seq_exch_abort(sp, 2 * ep->r_a_tov);
                goto done;
        }