]> git.ipfire.org Git - people/arne_f/kernel.git/blobdiff - drivers/scsi/pm8001/pm8001_sas.c
scsi: pm8001: Fix memleak in pm8001_exec_internal_task_abort
[people/arne_f/kernel.git] / drivers / scsi / pm8001 / pm8001_sas.c
index ce584c31d36e505a005b2e09aab8ccbaa6e4025c..61a2da30f94b723391e3f910cf5222337231f66a 100644 (file)
@@ -374,6 +374,13 @@ static int pm8001_task_exec(struct sas_task *task,
                return 0;
        }
        pm8001_ha = pm8001_find_ha_by_dev(task->dev);
+       if (pm8001_ha->controller_fatal_error) {
+               struct task_status_struct *ts = &t->task_status;
+
+               ts->resp = SAS_TASK_UNDELIVERED;
+               t->task_done(t);
+               return 0;
+       }
        PM8001_IO_DBG(pm8001_ha, pm8001_printk("pm8001_task_exec device \n "));
        spin_lock_irqsave(&pm8001_ha->lock, flags);
        do {
@@ -466,7 +473,7 @@ err_out:
        dev_printk(KERN_ERR, pm8001_ha->dev, "pm8001 exec failed[%d]!\n", rc);
        if (!sas_protocol_ata(t->task_proto))
                if (n_elem)
-                       dma_unmap_sg(pm8001_ha->dev, t->scatter, n_elem,
+                       dma_unmap_sg(pm8001_ha->dev, t->scatter, t->num_scatter,
                                t->data_dir);
 out_done:
        spin_unlock_irqrestore(&pm8001_ha->lock, flags);
@@ -788,7 +795,7 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
 
                res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
                if (res)
-                       return res;
+                       goto ex_err;
                ccb = &pm8001_ha->ccb_info[ccb_tag];
                ccb->device = pm8001_dev;
                ccb->ccb_tag = ccb_tag;