• Asias He's avatar
    virtio-blk: Fix hot-unplug race in remove method · b79d866c
    Asias He authored
    If we reset the virtio-blk device before the requests already dispatched
    to the virtio-blk driver from the block layer are finised, we will stuck
    in blk_cleanup_queue() and the remove will fail.
    
    blk_cleanup_queue() calls blk_drain_queue() to drain all requests queued
    before DEAD marking. However it will never success if the device is
    already stopped. We'll have q->in_flight[] > 0, so the drain will not
    finish.
    
    How to reproduce the race:
    1. hot-plug a virtio-blk device
    2. keep reading/writing the device in guest
    3. hot-unplug while the device is busy serving I/O
    
    Test:
    ~1000 rounds of hot-plug/hot-unplug test passed with this patch.
    
    Changes in v3:
    - Drop blk_abort_queue and blk_abort_request
    - Use __blk_end_request_all to complete request dispatched to driver
    
    Changes in v2:
    - Drop req_in_flight
    - Use virtqueue_detach_unused_buf to get request dispatched to driver
    Signed-off-by: default avatarAsias He <asias@redhat.com>
    Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
    b79d866c
virtio_blk.c 17.7 KB