From: Tejun Heo Date: Sun, 24 Apr 2005 07:04:21 +0000 (-0500) Subject: [SCSI] make blk layer set REQ_SOFTBARRIER on defer and requeue X-Git-Tag: v2.6.13-rc1~90^2~583^2~62^2^2~27^2~40 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e759cd4fa60c6df4cb117848274f444c2c0a12d;p=linux-2.6 [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 Signed-off-by: James Bottomley --- diff --git a/drivers/block/elevator.c b/drivers/block/elevator.c index 6b79b43146..8c51d1cceb 100644 --- a/drivers/block/elevator.c +++ b/drivers/block/elevator.c @@ -290,6 +290,13 @@ void elv_requeue_request(request_queue_t *q, struct request *rq) rq = rq->end_io_data; } + /* + * the request is prepped and may have some resources allocated. + * allowing unprepped requests to pass this one may cause resource + * deadlock. turn on softbarrier. + */ + rq->flags |= REQ_SOFTBARRIER; + /* * if iosched has an explicit requeue hook, then use that. otherwise * just put the request at the front of the queue @@ -386,6 +393,12 @@ struct request *elv_next_request(request_queue_t *q) if (ret == BLKPREP_OK) { break; } else if (ret == BLKPREP_DEFER) { + /* + * the request may have been (partially) prepped. + * we need to keep this request in the front to + * avoid resource deadlock. turn on softbarrier. + */ + rq->flags |= REQ_SOFTBARRIER; rq = NULL; break; } else if (ret == BLKPREP_KILL) {