• L
    drbd: add drbd_queue_work_if_unqueued helper · 15e26f6a
    Lars Ellenberg 提交于
    We sometimes do
        if (list_empty(&w.list))
    	drbd_queue_work(&q, &w.list);
    
    Removal (list_del_init) may happen outside all locks, after all
    pending work entries have been moved to an on-stack local work list.
    
    For not dynamically allocated, but embeded, work structs,
    we must avoid to re-add until it really was removed.
    
    Move that list_empty check inside the spin_lock(&q->q_lock)
    within the helper function, and change to list_empty_careful().
    
    This may have been the reason for a list_add corruption
    inside drbd_queue_work().
    Signed-off-by: NPhilipp Reisner <philipp.reisner@linbit.com>
    Signed-off-by: NLars Ellenberg <lars.ellenberg@linbit.com>
    15e26f6a
drbd_int.h 75.4 KB