• Tejun Heo's avatar
    block: internal dequeue shouldn't start timer · 53a08807
    Tejun Heo authored
    blkdev_dequeue_request() and elv_dequeue_request() are equivalent and
    both start the timeout timer.  Barrier code dequeues the original
    barrier request but doesn't passes the request itself to lower level
    driver, only broken down proxy requests; however, as the original
    barrier code goes through the same dequeue path and timeout timer is
    started on it.  If barrier sequence takes long enough, this timer
    expires but the low level driver has no idea about this request and
    oops follows.
    
    Timeout timer shouldn't have been started on the original barrier
    request as it never goes through actual IO.  This patch unexports
    elv_dequeue_request(), which has no external user anyway, and makes it
    operate on elevator proper w/o adding the timer and make
    blkdev_dequeue_request() call elv_dequeue_request() and add timer.
    Internal users which don't pass the request to driver - barrier code
    and end_that_request_last() - are converted to use
    elv_dequeue_request().
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Mike Anderson <andmike@linux.vnet.ibm.com>
    Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
    53a08807
blk-core.c 57.8 KB