Commit c0065f98 authored by Lars Ellenberg's avatar Lars Ellenberg Committed by Jens Axboe

drbd: bitmap bulk IO: do not always suspend IO

The intention was to only suspend IO if some normal bitmap operation is
supposed to be locked out, not always. If the bulk operation is flaged
as BM_LOCKED_CHANGE_ALLOWED, we do not need to suspend IO.
Signed-off-by: default avatarPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: default avatarLars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent f5fa90dc
...@@ -3587,18 +3587,20 @@ void drbd_queue_bitmap_io(struct drbd_device *device, ...@@ -3587,18 +3587,20 @@ void drbd_queue_bitmap_io(struct drbd_device *device,
int drbd_bitmap_io(struct drbd_device *device, int (*io_fn)(struct drbd_device *), int drbd_bitmap_io(struct drbd_device *device, int (*io_fn)(struct drbd_device *),
char *why, enum bm_flag flags) char *why, enum bm_flag flags)
{ {
/* Only suspend io, if some operation is supposed to be locked out */
const bool do_suspend_io = flags & (BM_DONT_CLEAR|BM_DONT_SET|BM_DONT_TEST);
int rv; int rv;
D_ASSERT(device, current != first_peer_device(device)->connection->worker.task); D_ASSERT(device, current != first_peer_device(device)->connection->worker.task);
if ((flags & BM_LOCKED_SET_ALLOWED) == 0) if (do_suspend_io)
drbd_suspend_io(device); drbd_suspend_io(device);
drbd_bm_lock(device, why, flags); drbd_bm_lock(device, why, flags);
rv = io_fn(device); rv = io_fn(device);
drbd_bm_unlock(device); drbd_bm_unlock(device);
if ((flags & BM_LOCKED_SET_ALLOWED) == 0) if (do_suspend_io)
drbd_resume_io(device); drbd_resume_io(device);
return rv; return rv;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment