• Jens Axboe's avatar
    cfq-iosched: fix alias + front merge bug · 5044eed4
    Jens Axboe authored
    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: default avatarJens Axboe <jens.axboe@oracle.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    5044eed4
cfq-iosched.c 53.1 KB