]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/scsi/libsas/sas_scsi_host.c
Merge branch 'master' into tk71
[mv-sheeva.git] / drivers / scsi / libsas / sas_scsi_host.c
index f0cfba9a1fc83656f9dfa06cc2f0d1dd48115e72..9a7aaf5f1311069893aa59dc384c1a3dfd613f82 100644 (file)
@@ -130,17 +130,6 @@ static void sas_scsi_task_done(struct sas_task *task)
        sc->scsi_done(sc);
 }
 
-static enum task_attribute sas_scsi_get_task_attr(struct scsi_cmnd *cmd)
-{
-       enum task_attribute ta = TASK_ATTR_SIMPLE;
-       if (cmd->request && blk_rq_tagged(cmd->request)) {
-               if (cmd->device->ordered_tags &&
-                   (cmd->request->cmd_flags & REQ_HARDBARRIER))
-                       ta = TASK_ATTR_ORDERED;
-       }
-       return ta;
-}
-
 static struct sas_task *sas_create_task(struct scsi_cmnd *cmd,
                                               struct domain_device *dev,
                                               gfp_t gfp_flags)
@@ -160,7 +149,7 @@ static struct sas_task *sas_create_task(struct scsi_cmnd *cmd,
        task->ssp_task.retry_count = 1;
        int_to_scsilun(cmd->device->lun, &lun);
        memcpy(task->ssp_task.LUN, &lun.scsi_lun, 8);
-       task->ssp_task.task_attr = sas_scsi_get_task_attr(cmd);
+       task->ssp_task.task_attr = TASK_ATTR_SIMPLE;
        memcpy(task->ssp_task.cdb, cmd->cmnd, 16);
 
        task->scatter = scsi_sglist(cmd);
@@ -200,7 +189,7 @@ int sas_queue_up(struct sas_task *task)
  * Note: XXX: Remove the host unlock/lock pair when SCSI Core can
  * call us without holding an IRQ spinlock...
  */
-int sas_queuecommand(struct scsi_cmnd *cmd,
+static int sas_queuecommand_lck(struct scsi_cmnd *cmd,
                     void (*scsi_done)(struct scsi_cmnd *))
        __releases(host->host_lock)
        __acquires(dev->sata_dev.ap->lock)
@@ -222,12 +211,18 @@ int sas_queuecommand(struct scsi_cmnd *cmd,
                        unsigned long flags;
 
                        spin_lock_irqsave(dev->sata_dev.ap->lock, flags);
-                       res = ata_sas_queuecmd(cmd, scsi_done,
-                                              dev->sata_dev.ap);
+                       res = ata_sas_queuecmd(cmd, dev->sata_dev.ap);
                        spin_unlock_irqrestore(dev->sata_dev.ap->lock, flags);
                        goto out;
                }
 
+               /* If the device fell off, no sense in issuing commands */
+               if (dev->gone) {
+                       cmd->result = DID_BAD_TARGET << 16;
+                       scsi_done(cmd);
+                       goto out;
+               }
+
                res = -ENOMEM;
                task = sas_create_task(cmd, dev, GFP_ATOMIC);
                if (!task)
@@ -258,6 +253,8 @@ out:
        return res;
 }
 
+DEF_SCSI_QCMD(sas_queuecommand)
+
 static void sas_eh_finish_cmd(struct scsi_cmnd *cmd)
 {
        struct sas_task *task = TO_SAS_TASK(cmd);
@@ -649,6 +646,7 @@ void sas_scsi_recover_host(struct Scsi_Host *shost)
 
        spin_lock_irqsave(shost->host_lock, flags);
        list_splice_init(&shost->eh_cmd_q, &eh_work_q);
+       shost->host_eh_scheduled = 0;
        spin_unlock_irqrestore(shost->host_lock, flags);
 
        SAS_DPRINTK("Enter %s\n", __func__);