cfq-iosched: fix alias + front merge bug
authorJens Axboe <jens.axboe@oracle.com>
Wed, 25 Apr 2007 09:53:48 +0000 (11:53 +0200)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Wed, 25 Apr 2007 15:41:48 +0000 (08:41 -0700)
commit5044eed48886b105a123333fe7ca97c6bd496120
tree76233c2b177d9be75d3e1278b89ea5d3f7d87fcf
parenta23cf14b161b8deeb0f701d577a0e8be6365e247
cfq-iosched: fix alias + front merge bug

There's a really rare and obscure bug in CFQ, that causes a crash in
cfq_dispatch_insert() due to rq == NULL.  One example of the resulting
oops is seen here:

http://lkml.org/lkml/2007/4/15/41

Neil correctly diagnosed the situation for how this can happen: if two
concurrent requests with the exact same sector number (due to direct IO
or aliasing between MD and the raw device access), the alias handling
will add the request to the sortlist, but next_rq remains NULL.

Read the more complete analysis at:

http://lkml.org/lkml/2007/4/25/57

This looks like it requires md to trigger, even though it should
potentially be possible to due with O_DIRECT (at least if you edit the
kernel and doctor some of the unplug calls).

The fix is to move the ->next_rq update to when we add a request to the
rbtree. Then we remove the possibility for a request to exist in the
rbtree code, but not have ->next_rq correctly updated.

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
block/cfq-iosched.c