OSDN Git Service

drbd: temporarily suspend io in drbd_adm_disk_opts
authorLars Ellenberg <lars.ellenberg@linbit.com>
Mon, 20 Aug 2012 12:54:48 +0000 (14:54 +0200)
committerPhilipp Reisner <philipp.reisner@linbit.com>
Fri, 9 Nov 2012 13:08:20 +0000 (14:08 +0100)
drbd_adm_disk_opts() does
wait_event(mdev->al_wait, lc_try_lock(mdev->act_log));
drbd_al_shrink(mdev);

If the device is very busy, this can take a very long time to succeed.
Fix this by temporarily suspending IO,
then quickly change the settings, and resume.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
drivers/block/drbd/drbd_nl.c

index d31a026..363034a 100644 (file)
@@ -1210,11 +1210,13 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info)
                }
        }
 
+       drbd_suspend_io(mdev);
        wait_event(mdev->al_wait, lc_try_lock(mdev->act_log));
        drbd_al_shrink(mdev);
        err = drbd_check_al_size(mdev, new_disk_conf);
        lc_unlock(mdev->act_log);
        wake_up(&mdev->al_wait);
+       drbd_resume_io(mdev);
 
        if (err) {
                retcode = ERR_NOMEM;