• Bart Van Assche's avatar
    block: Avoid scheduling delayed work on a dead queue · 70460571
    Bart Van Assche authored
    Running a queue must continue after it has been marked dying until
    it has been marked dead. So the function blk_run_queue_async() must
    not schedule delayed work after blk_cleanup_queue() has marked a queue
    dead. Hence add a test for that queue state in blk_run_queue_async()
    and make sure that queue_unplugged() invokes that function with the
    queue lock held. This avoids that the queue state can change after
    it has been tested and before mod_delayed_work() is invoked. Drop
    the queue dying test in queue_unplugged() since it is now
    superfluous: __blk_run_queue() already tests whether or not the
    queue is dead.
    Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
    Cc: Mike Christie <michaelc@cs.wisc.edu>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    70460571
blk-core.c 81.7 KB