[SCSI] mvsas: bug fix of dead lock
authorAndy Yan <ayan@marvell.com>
Mon, 11 May 2009 12:05:26 +0000 (20:05 +0800)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Sat, 23 May 2009 20:44:07 +0000 (15:44 -0500)
TMF task should be issued with Interrupt Disabled, or Deadlock may take place.
Clean-up unused parameters and conditonal lock.

Signed-off-by: Ying Chu <jasonchu@marvell.com>
Signed-off-by: Andy Yan <ayan@marvell.com>
Signed-off-by: Ke Wei <kewei@marvell.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/mvsas/mv_sas.c

index f709319c2b6dcd65fd3ba61fc71affef5995551b..4279b5e8808a834fc72639f985c709bf9d4d4713 100644 (file)
@@ -868,8 +868,8 @@ static int mvs_task_prep_ssp(struct mvs_info *mvi,
 
 #define        DEV_IS_GONE(mvi_dev)    ((!mvi_dev || (mvi_dev->dev_type == NO_DEVICE)))
 static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags,
-                               struct completion *completion, int lock,
-                               int is_tmf, struct mvs_tmf_task *tmf)
+                               struct completion *completion,int is_tmf,
+                               struct mvs_tmf_task *tmf)
 {
        struct domain_device *dev = task->dev;
        struct mvs_info *mvi;
@@ -892,8 +892,7 @@ static int mvs_task_exec(struct sas_task *task, const int num, gfp_t gfp_flags,
 
        mvi = mvs_find_dev_mvi(task->dev);
 
-       if (lock)
-               spin_lock_irqsave(&mvi->lock, flags);
+       spin_lock_irqsave(&mvi->lock, flags);
        do {
                dev = t->dev;
                mvi_dev = (struct mvs_device *)dev->lldd_dev;
@@ -1020,15 +1019,14 @@ out_done:
                MVS_CHIP_DISP->start_delivery(mvi,
                        (mvi->tx_prod - 1) & (MVS_CHIP_SLOT_SZ - 1));
        }
-       if (lock)
-               spin_unlock_irqrestore(&mvi->lock, flags);
+       spin_unlock_irqrestore(&mvi->lock, flags);
        return rc;
 }
 
 int mvs_queue_command(struct sas_task *task, const int num,
                        gfp_t gfp_flags)
 {
-       return mvs_task_exec(task, num, gfp_flags, NULL, 1, 0, NULL);
+       return mvs_task_exec(task, num, gfp_flags, NULL, 0, NULL);
 }
 
 static void mvs_slot_free(struct mvs_info *mvi, u32 rx_desc)
@@ -1448,7 +1446,7 @@ static int mvs_exec_internal_tmf_task(struct domain_device *dev,
                task->timer.expires = jiffies + MVS_TASK_TIMEOUT*HZ;
                add_timer(&task->timer);
 
-               res = mvs_task_exec(task, 1, GFP_KERNEL, NULL, 0, 1, tmf);
+               res = mvs_task_exec(task, 1, GFP_KERNEL, NULL, 1, tmf);
 
                if (res) {
                        del_timer(&task->timer);