• Tasos Sahanidis's avatar
    floppy: Fix hang in watchdog when disk is ejected · fb48febc
    Tasos Sahanidis authored
    When the watchdog detects a disk change, it calls cancel_activity(),
    which in turn tries to cancel the fd_timer delayed work.
    
    In the above scenario, fd_timer_fn is set to fd_watchdog(), meaning
    it is trying to cancel its own work.
    This results in a hang as cancel_delayed_work_sync() is waiting for the
    watchdog (itself) to return, which never happens.
    
    This can be reproduced relatively consistently by attempting to read a
    broken floppy, and ejecting it while IO is being attempted and retried.
    
    To resolve this, this patch calls cancel_delayed_work() instead, which
    cancels the work without waiting for the watchdog to return and finish.
    
    Before this regression was introduced, the code in this section used
    del_timer(), and not del_timer_sync() to delete the watchdog timer.
    
    Link: https://lore.kernel.org/r/399e486c-6540-db27-76aa-7a271b061f76@tasossah.com
    Fixes: 070ad7e7 ("floppy: convert to delayed work and single-thread wq")
    Signed-off-by: default avatarTasos Sahanidis <tasos@tasossah.com>
    Signed-off-by: default avatarDenis Efremov <efremov@linux.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    fb48febc
floppy.c 134 KB