提交 3ac6c9f8 编写于 作者: J Jens Axboe

cfq-iosched: fix bug with aliased request and cooperation detection

cfq_prio_tree_lookup() should return the direct match, yet it always
returns zero. Fix that.

cfq_prio_tree_add() assumes that we don't get a direct match, while
it is very possible that we do. Using O_DIRECT, you can have different
cfqq with matching requests, since you don't have the page cache
to serialize things for you. Fix this bug by only adding the cfqq if
there isn't an existing match.
Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
上级 26a2ac00
...@@ -584,12 +584,13 @@ cfq_prio_tree_lookup(struct cfq_data *cfqd, int ioprio, sector_t sector, ...@@ -584,12 +584,13 @@ cfq_prio_tree_lookup(struct cfq_data *cfqd, int ioprio, sector_t sector,
else else
break; break;
p = n; p = n;
cfqq = NULL;
} }
*ret_parent = parent; *ret_parent = parent;
if (rb_link) if (rb_link)
*rb_link = p; *rb_link = p;
return NULL; return cfqq;
} }
static void cfq_prio_tree_add(struct cfq_data *cfqd, struct cfq_queue *cfqq) static void cfq_prio_tree_add(struct cfq_data *cfqd, struct cfq_queue *cfqq)
...@@ -608,10 +609,10 @@ static void cfq_prio_tree_add(struct cfq_data *cfqd, struct cfq_queue *cfqq) ...@@ -608,10 +609,10 @@ static void cfq_prio_tree_add(struct cfq_data *cfqd, struct cfq_queue *cfqq)
__cfqq = cfq_prio_tree_lookup(cfqd, cfqq->ioprio, cfqq->next_rq->sector, __cfqq = cfq_prio_tree_lookup(cfqd, cfqq->ioprio, cfqq->next_rq->sector,
&parent, &p); &parent, &p);
BUG_ON(__cfqq); if (!__cfqq) {
rb_link_node(&cfqq->p_node, parent, p);
rb_link_node(&cfqq->p_node, parent, p); rb_insert_color(&cfqq->p_node, root);
rb_insert_color(&cfqq->p_node, root); }
} }
/* /*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册