aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libsas
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2011-07-16 15:00:35 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-08-30 15:13:46 -0400
commitac81c6a832a8769d1cc7ffda361aa3dc3d8f06dc (patch)
treebf1c08af7dbfb37c5e3f9752fb2de96decc2d396 /drivers/scsi/libsas
parenta923f756be07aae690ec3dd2e4a25967658cf893 (diff)
[SCSI] libsas: fix sas_queuecommand return values
->queuecommand must return either 0, or one of the SCSI_MLQUEUE_* return values. Non-transient errors are indicated by setting cmd->result before calling ->scsi_done and returning 0. Fix libsas to adhere to this calling convention. Note that the DID_ERROR for returns from the low-level driver might not be correct for all cases, but it's the best we can do with the current layering in libsas. I also suspect that the pre-existing handling of -SAS_QUEUE_FULL should really be SCSI_MLQUEUE_HOST_BUSY, but I'll leave that for a separate change. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/libsas')
-rw-r--r--drivers/scsi/libsas/sas_scsi_host.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index 9dd1e9eda19b..d625577ed152 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -207,7 +207,7 @@ int sas_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
207 207
208 task = sas_create_task(cmd, dev, GFP_ATOMIC); 208 task = sas_create_task(cmd, dev, GFP_ATOMIC);
209 if (!task) 209 if (!task)
210 return -ENOMEM; 210 return SCSI_MLQUEUE_HOST_BUSY;
211 211
212 /* Queue up, Direct Mode or Task Collector Mode. */ 212 /* Queue up, Direct Mode or Task Collector Mode. */
213 if (sas_ha->lldd_max_execute_num < 2) 213 if (sas_ha->lldd_max_execute_num < 2)
@@ -223,9 +223,10 @@ out_free_task:
223 SAS_DPRINTK("lldd_execute_task returned: %d\n", res); 223 SAS_DPRINTK("lldd_execute_task returned: %d\n", res);
224 ASSIGN_SAS_TASK(cmd, NULL); 224 ASSIGN_SAS_TASK(cmd, NULL);
225 sas_free_task(task); 225 sas_free_task(task);
226 if (res != -SAS_QUEUE_FULL) 226 if (res == -SAS_QUEUE_FULL)
227 return res; 227 cmd->result = DID_SOFT_ERROR << 16; /* retry */
228 cmd->result = DID_SOFT_ERROR << 16; /* retry */ 228 else
229 cmd->result = DID_ERROR << 16;
229out_done: 230out_done:
230 cmd->scsi_done(cmd); 231 cmd->scsi_done(cmd);
231 return 0; 232 return 0;