• Jiri Kosina's avatar
    block/floppy: fix contended case in floppy_queue_rq() · 263c6158
    Jiri Kosina authored
    Since the switch of floppy driver to blk-mq, the contended (fdc_busy) case
    in floppy_queue_rq() is not handled correctly.
    
    In case we reach floppy_queue_rq() with fdc_busy set (i.e. with the floppy
    locked due to another request still being in-flight), we put the request
    on the list of requests and return BLK_STS_OK to the block core, without
    actually scheduling delayed work / doing further processing of the
    request. This means that processing of this request is postponed until
    another request comes and passess uncontended.
    
    Which in some cases might actually never happen and we keep waiting
    indefinitely. The simple testcase is
    
    	for i in `seq 1 2000`; do echo -en $i '\r'; blkid --info /dev/fd0 2> /dev/null; done
    
    run in quemu. That reliably causes blkid eventually indefinitely hanging
    in __floppy_read_block_0() waiting for completion, as the BIO callback
    never happens, and no further IO is ever submitted on the (non-existent)
    floppy device. This was observed reliably on qemu-emulated device.
    
    Fix that by not queuing the request in the contended case, and return
    BLK_STS_RESOURCE instead, so that blk core handles the request
    rescheduling and let it pass properly non-contended later.
    
    Fixes: a9f38e1d ("floppy: convert to blk-mq")
    Cc: stable@vger.kernel.org
    Tested-by: default avatarLibor Pechacek <lpechacek@suse.cz>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    263c6158
floppy.c 136 KB