aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2005-04-24 03:04:21 -0400
committerJames Bottomley <jejb@mulgrave.(none)>2005-05-20 13:53:26 -0400
commit2e759cd4fa60c6df4cb117848274f444c2c0a12d (patch)
tree973c2fd1725208de2d0a0ccd99b9fadd93a845fc
parent354d6b2196c8e53e55e8f169804256ab9c72731d (diff)
[SCSI] make blk layer set REQ_SOFTBARRIER on defer and requeue
This is the reworked version of the patch. It sets REQ_SOFTBARRIER in two places - in elv_next_request() on BLKPREP_DEFER and in blk_requeue_request(). Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r--drivers/block/elevator.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/block/elevator.c b/drivers/block/elevator.c
index 6b79b4314622..8c51d1ccebbd 100644
--- a/drivers/block/elevator.c
+++ b/drivers/block/elevator.c
@@ -291,6 +291,13 @@ void elv_requeue_request(request_queue_t *q, struct request *rq)
291 } 291 }
292 292
293 /* 293 /*
294 * the request is prepped and may have some resources allocated.
295 * allowing unprepped requests to pass this one may cause resource
296 * deadlock. turn on softbarrier.
297 */
298 rq->flags |= REQ_SOFTBARRIER;
299
300 /*
294 * if iosched has an explicit requeue hook, then use that. otherwise 301 * if iosched has an explicit requeue hook, then use that. otherwise
295 * just put the request at the front of the queue 302 * just put the request at the front of the queue
296 */ 303 */
@@ -386,6 +393,12 @@ struct request *elv_next_request(request_queue_t *q)
386 if (ret == BLKPREP_OK) { 393 if (ret == BLKPREP_OK) {
387 break; 394 break;
388 } else if (ret == BLKPREP_DEFER) { 395 } else if (ret == BLKPREP_DEFER) {
396 /*
397 * the request may have been (partially) prepped.
398 * we need to keep this request in the front to
399 * avoid resource deadlock. turn on softbarrier.
400 */
401 rq->flags |= REQ_SOFTBARRIER;
389 rq = NULL; 402 rq = NULL;
390 break; 403 break;
391 } else if (ret == BLKPREP_KILL) { 404 } else if (ret == BLKPREP_KILL) {