[SCSI] libfc: fix fc_tm_done not freeing the allocated fsp pkt
authorYi Zou <yi.zou@intel.com>
Wed, 1 Dec 2010 00:19:35 +0000 (16:19 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Tue, 21 Dec 2010 18:24:27 +0000 (12:24 -0600)
Frame should be freed in fc_tm_done, this is an updated patch on the one
initially submitted by Hillf Danton.

Signed-off-by: Hillf Danton <dhillf@gmail.com>
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_fcp.c

index 338620b33fa13bab629608c3c6aa0fd895e044a5..a8e0c0acc736f40f8f2b5bf456ec9a2fe1d51d85 100644 (file)
@@ -1321,27 +1321,27 @@ static void fc_tm_done(struct fc_seq *seq, struct fc_frame *fp, void *arg)
                 *
                 * scsi-eh will escalate for when either happens.
                 */
-               return;
+               goto out;
        }
 
        if (fc_fcp_lock_pkt(fsp))
-               return;
+               goto out;
 
        /*
         * raced with eh timeout handler.
         */
-       if (!fsp->seq_ptr || !fsp->wait_for_comp) {
-               spin_unlock_bh(&fsp->scsi_pkt_lock);
-               return;
-       }
+       if (!fsp->seq_ptr || !fsp->wait_for_comp)
+               goto out_unlock;
 
        fh = fc_frame_header_get(fp);
        if (fh->fh_type != FC_TYPE_BLS)
                fc_fcp_resp(fsp, fp);
        fsp->seq_ptr = NULL;
        fsp->lp->tt.exch_done(seq);
-       fc_frame_free(fp);
+out_unlock:
        fc_fcp_unlock_pkt(fsp);
+out:
+       fc_frame_free(fp);
 }
 
 /**