• Lars Ellenberg's avatar
    drbd: fix potential deadlock during "restart" of conflicting writes · 2312f0b3
    Lars Ellenberg authored
    w_restart_write(), run from worker context, calls __drbd_make_request()
    and further drbd_al_begin_io(, delegate=true), which then
    potentially deadlocks.  The previous patch moved a BUG_ON to expose
    such call paths, which would now be triggered.
    
    Also, if we call __drbd_make_request() from resource worker context,
    like w_restart_write() did, and that should block for whatever reason
    (!drbd_state_is_stable(), resource suspended, ...),
    we potentially deadlock the whole resource, as the worker
    is needed for state changes and other things.
    
    Create a dedicated retry workqueue for this instead.
    
    Also make sure that inc_ap_bio()/dec_ap_bio() are properly paired,
    even if do_retry() needs to retry itself,
    in case __drbd_make_request() returns != 0.
    Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
    Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
    2312f0b3
drbd_main.c 98.2 KB