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: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
26a2ac009c
commit
3ac6c9f8a6
@ -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)
|
|||||||
|
|
||||||
__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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user