diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2014-04-28 13:43:21 +0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2014-07-10 20:35:07 +0400 |
commit | 15e26f6a3c6de2c665b4a30b9a70a902111f281f (patch) | |
tree | d8050e5998e46e3f6f541b3941dd727714ae07ba /drivers/block/drbd/drbd_bitmap.c | |
parent | 7f34f61490ee87a470cf229069d59b0987f42a59 (diff) | |
download | linux-15e26f6a3c6de2c665b4a30b9a70a902111f281f.tar.xz |
drbd: add drbd_queue_work_if_unqueued helper
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: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_bitmap.c')
0 files changed, 0 insertions, 0 deletions