[SCSI] libsas: defer SAS_TASK_NEED_DEV_RESET commands to libata
authorDan Williams <dan.j.williams@intel.com>
Tue, 29 Nov 2011 22:54:28 +0000 (14:54 -0800)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 19 Feb 2012 20:09:02 +0000 (14:09 -0600)
lldds use the SAS_TASK_NEED_DEV_RESET interface to request that eh
perform a reset.  In the sata device case defer the commands that
triggered the reset to libata-eh context so it can perform its pre and
post reset management.

In the sas_ata_post_internal() case the reset request is falling on deaf
ears as the sas_task is immediately destroyed without any reset action.
Since it is currently a nop, and likely superfluous given the conversion
to new-style libata-eh, just drop the request.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/libsas/sas_ata.c
drivers/scsi/libsas/sas_scsi_host.c

index 4c2a140..a8ace8d 100644 (file)
@@ -411,18 +411,12 @@ static void sas_ata_post_internal(struct ata_queued_cmd *qc)
                 *  ourselves.
                 */
                struct sas_task *task = qc->lldd_task;
-               unsigned long flags;
 
                qc->lldd_task = NULL;
-               if (task) {
-                       /* Should this be a AT(API) device reset? */
-                       spin_lock_irqsave(&task->task_state_lock, flags);
-                       task->task_state_flags |= SAS_TASK_NEED_DEV_RESET;
-                       spin_unlock_irqrestore(&task->task_state_lock, flags);
-
-                       task->uldd_task = NULL;
-                       sas_ata_internal_abort(task);
-               }
+               if (!task)
+                       return;
+               task->uldd_task = NULL;
+               sas_ata_internal_abort(task);
        }
 }
 
index e02ca3d..af71a6d 100644 (file)
@@ -288,7 +288,7 @@ static void sas_scsi_clear_queue_lu(struct list_head *error_q, struct scsi_cmnd
        list_for_each_entry_safe(cmd, n, error_q, eh_entry) {
                if (cmd->device->sdev_target == my_cmd->device->sdev_target &&
                    cmd->device->lun == my_cmd->device->lun)
-                       sas_eh_finish_cmd(cmd);
+                       sas_eh_defer_cmd(cmd);
        }
 }
 
@@ -594,7 +594,7 @@ Again:
                                            "recovered\n",
                                            SAS_ADDR(task->dev),
                                            cmd->device->lun);
-                               sas_eh_finish_cmd(cmd);
+                               sas_eh_defer_cmd(cmd);
                                sas_scsi_clear_queue_lu(work_q, cmd);
                                goto Again;
                        }