提交 1abec4fd 编写于 作者: M Mike Snitzer 提交者: Jens Axboe

block: make blk_init_free_list and elevator_init idempotent

blk_init_allocated_queue_node may fail and the caller _could_ retry.
Accommodate the unlikely event that blk_init_allocated_queue_node is
called on an already initialized (possibly partially) request_queue.
Signed-off-by: NMike Snitzer <snitzer@redhat.com>
Signed-off-by: NJens Axboe <jaxboe@fusionio.com>
上级 c86d1b8a
...@@ -467,6 +467,9 @@ static int blk_init_free_list(struct request_queue *q) ...@@ -467,6 +467,9 @@ static int blk_init_free_list(struct request_queue *q)
{ {
struct request_list *rl = &q->rq; struct request_list *rl = &q->rq;
if (unlikely(rl->rq_pool))
return 0;
rl->count[BLK_RW_SYNC] = rl->count[BLK_RW_ASYNC] = 0; rl->count[BLK_RW_SYNC] = rl->count[BLK_RW_ASYNC] = 0;
rl->starved[BLK_RW_SYNC] = rl->starved[BLK_RW_ASYNC] = 0; rl->starved[BLK_RW_SYNC] = rl->starved[BLK_RW_ASYNC] = 0;
rl->elvpriv = 0; rl->elvpriv = 0;
......
...@@ -242,9 +242,11 @@ int elevator_init(struct request_queue *q, char *name) ...@@ -242,9 +242,11 @@ int elevator_init(struct request_queue *q, char *name)
{ {
struct elevator_type *e = NULL; struct elevator_type *e = NULL;
struct elevator_queue *eq; struct elevator_queue *eq;
int ret = 0;
void *data; void *data;
if (unlikely(q->elevator))
return 0;
INIT_LIST_HEAD(&q->queue_head); INIT_LIST_HEAD(&q->queue_head);
q->last_merge = NULL; q->last_merge = NULL;
q->end_sector = 0; q->end_sector = 0;
...@@ -284,7 +286,7 @@ int elevator_init(struct request_queue *q, char *name) ...@@ -284,7 +286,7 @@ int elevator_init(struct request_queue *q, char *name)
} }
elevator_attach(q, eq, data); elevator_attach(q, eq, data);
return ret; return 0;
} }
EXPORT_SYMBOL(elevator_init); EXPORT_SYMBOL(elevator_init);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册