Skip to content

Commit

Permalink
cfq-iosched: fix bug with aliased request and cooperation detection
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jens Axboe committed Apr 24, 2009
1 parent 26a2ac0 commit 3ac6c9f
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions block/cfq-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -584,12 +584,13 @@ cfq_prio_tree_lookup(struct cfq_data *cfqd, int ioprio, sector_t sector,
else
break;
p = n;
cfqq = NULL;
}

*ret_parent = parent;
if (rb_link)
*rb_link = p;
return NULL;
return cfqq;
}

static void cfq_prio_tree_add(struct cfq_data *cfqd, struct cfq_queue *cfqq)
Expand All @@ -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,
&parent, &p);
BUG_ON(__cfqq);

rb_link_node(&cfqq->p_node, parent, p);
rb_insert_color(&cfqq->p_node, root);
if (!__cfqq) {
rb_link_node(&cfqq->p_node, parent, p);
rb_insert_color(&cfqq->p_node, root);
}
}

/*
Expand Down

0 comments on commit 3ac6c9f

Please sign in to comment.