diff --git a/[refs] b/[refs] index 70277863f754..155a53d8a984 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 354d6b2196c8e53e55e8f169804256ab9c72731d +refs/heads/master: 2e759cd4fa60c6df4cb117848274f444c2c0a12d diff --git a/trunk/drivers/block/elevator.c b/trunk/drivers/block/elevator.c index 6b79b4314622..8c51d1ccebbd 100644 --- a/trunk/drivers/block/elevator.c +++ b/trunk/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) {