• Tejun Heo's avatar
    block: blk-flush shouldn't call directly into q->request_fn() __blk_run_queue() · 255bb490
    Tejun Heo authored
    blk-flush decomposes a flush into sequence of multiple requests.  On
    completion of a request, the next one is queued; however, block layer
    must not implicitly call into q->request_fn() directly from completion
    path.  This makes the queue behave unexpectedly when seen from the
    drivers and violates the assumption that q->request_fn() is called
    with process context + queue_lock.
    
    This patch makes blk-flush the following two changes to make sure
    q->request_fn() is not called directly from request completion path.
    
    - blk_flush_complete_seq_end_io() now asks __blk_run_queue() to always
      use kblockd instead of calling directly into q->request_fn().
    
    - queue_next_fseq() uses ELEVATOR_INSERT_REQUEUE instead of
      ELEVATOR_INSERT_FRONT so that elv_insert() doesn't try to unplug the
      request queue directly.
    
    Reported by Jan in the following threads.
    
     http://thread.gmane.org/gmane.linux.ide/48778
     http://thread.gmane.org/gmane.linux.ide/48786
    
    stable: applicable to v2.6.37.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarJan Beulich <JBeulich@novell.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: stable@kernel.org
    Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
    255bb490
blk-flush.c 6.84 KB