aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2010-07-08 20:38:26 -0400
committerJens Axboe <jaxboe@fusionio.com>2010-08-07 12:52:41 -0400
commite96f6abe02fc3320d669985443e8c68ff8e83294 (patch)
tree52129ba43d1e57fb4446facde52071efb3a65ff0 /drivers
parent16f2319fd67b169c0b34391d3fa0870fff129891 (diff)
scsi: use REQ_TYPE_FS for flush request
scsi-ml uses REQ_TYPE_BLOCK_PC for flush requests from file systems. The definition of REQ_TYPE_BLOCK_PC is that we don't retry requests even when we can (e.g. UNIT ATTENTION) and we send the response to the callers (then the callers can decide what they want). We need a workaround such as the commit 77a4229719e511a0d38d9c355317ae1469adeb54 to retry BLOCK_PC flush requests. We will need the similar workaround for discard requests too since SCSI-ml handle them as BLOCK_PC internally. This uses REQ_TYPE_FS for flush requests from file systems instead of REQ_TYPE_BLOCK_PC. scsi-ml retries only REQ_TYPE_FS requests that have data to transfer when we can retry them (e.g. UNIT_ATTENTION). However, we also need to retry REQ_TYPE_FS requests without data because the callers don't. This also changes scsi_check_sense() to retry all the REQ_TYPE_FS requests when appropriate. Thanks to scsi_noretry_cmd(), REQ_TYPE_BLOCK_PC requests don't be retried as before. Note that basically, this reverts the commit 77a4229719e511a0d38d9c355317ae1469adeb54 since now we use REQ_TYPE_FS for flush requests. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/scsi_error.c19
-rw-r--r--drivers/scsi/sd.c2
2 files changed, 4 insertions, 17 deletions
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 1b88af89d0c7..2768bf6ffe59 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -307,20 +307,7 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
307 (sshdr.asc == 0x04) && (sshdr.ascq == 0x02)) 307 (sshdr.asc == 0x04) && (sshdr.ascq == 0x02))
308 return FAILED; 308 return FAILED;
309 309
310 if (scmd->request->cmd_flags & REQ_HARDBARRIER) 310 return NEEDS_RETRY;
311 /*
312 * barrier requests should always retry on UA
313 * otherwise block will get a spurious error
314 */
315 return NEEDS_RETRY;
316 else
317 /*
318 * for normal (non barrier) commands, pass the
319 * UA upwards for a determination in the
320 * completion functions
321 */
322 return SUCCESS;
323
324 /* these three are not supported */ 311 /* these three are not supported */
325 case COPY_ABORTED: 312 case COPY_ABORTED:
326 case VOLUME_OVERFLOW: 313 case VOLUME_OVERFLOW:
@@ -1336,7 +1323,9 @@ int scsi_noretry_cmd(struct scsi_cmnd *scmd)
1336 * assume caller has checked sense and determinted 1323 * assume caller has checked sense and determinted
1337 * the check condition was retryable. 1324 * the check condition was retryable.
1338 */ 1325 */
1339 return (scmd->request->cmd_flags & REQ_FAILFAST_DEV); 1326 if (scmd->request->cmd_flags & REQ_FAILFAST_DEV ||
1327 scmd->request->cmd_type == REQ_TYPE_BLOCK_PC)
1328 return 1;
1340 } 1329 }
1341 1330
1342 return 0; 1331 return 0;
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index e63b85ac8cd1..108daead7ae8 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -477,8 +477,6 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq)
477 477
478static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) 478static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq)
479{ 479{
480 /* for now, we use REQ_TYPE_BLOCK_PC. */
481 rq->cmd_type = REQ_TYPE_BLOCK_PC;
482 rq->timeout = SD_TIMEOUT; 480 rq->timeout = SD_TIMEOUT;
483 rq->retries = SD_MAX_RETRIES; 481 rq->retries = SD_MAX_RETRIES;
484 rq->cmd[0] = SYNCHRONIZE_CACHE; 482 rq->cmd[0] = SYNCHRONIZE_CACHE;