• Mikulas Patocka's avatar
    dm-delay: fix bugs introduced by kthread mode · 38cfff56
    Mikulas Patocka authored
    This commit fixes the following bugs introduced by commit 70bbeb29
    ("dm delay: for short delays, use kthread instead of timers and wq"):
    
    * the function flush_worker_fn has no exit path - on unload, this
      function will just loop and consume 100% CPU without any progress
    
    * the wake-up mechanism in flush_worker_fn is racy - a wake up will be
      missed if the process adds entries to the delayed_bios list just
      before set_current_state(TASK_INTERRUPTIBLE)
    
    * flush_delayed_bios_fast submits a bio while holding a global mutex;
      this may deadlock if we have multiple stacked dm-delay devices and
      the underlying device attempts to acquire the mutex too
    
    * if the target constructor fails, it will call delay_dtr. delay_dtr
      would attempt to free dc->timer_lock without it being initialized by
      the constructor.
    
    * if the target constructor's kthread allocation fails, delay_dtr
      would crash trying to dereference dc->worker because it is non-NULL
      due to ERR_PTR.
    
    Fixes: 70bbeb29 ("dm delay: for short delays, use kthread instead of timers and wq")
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
    38cfff56
dm-delay.c 10.2 KB