• NeilBrown's avatar
    block: splice plug list to local context · 109b8129
    NeilBrown authored
    If the request_fn ends up blocking, we could be re-entering
    the plug flush. Since the list is protected by explicitly
    not allowing schedule events, this isn't a terribly good idea.
    
    Additionally, it can cause us to recurse. As request_fn called by
    __blk_run_queue is allowed to 'schedule()' (after dropping the queue
    lock of course), it is possible to get a recursive call:
    
     schedule -> blk_flush_plug -> __blk_finish_plug -> flush_plug_list
          -> __blk_run_queue -> request_fn -> schedule
    
    We must make sure that the second schedule does not call into
    blk_flush_plug again.  So instead of leaving the list of requests on
    blk_plug->list, move them to a separate list leaving blk_plug->list
    empty.
    Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
    109b8129
blk-core.c 72.6 KB