drbd: temporarily suspend io in drbd_adm_disk_opts
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>
This commit is contained in:
parent
4eb9b3cba0
commit
0ee98e2eb0
|
@ -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));
|
wait_event(mdev->al_wait, lc_try_lock(mdev->act_log));
|
||||||
drbd_al_shrink(mdev);
|
drbd_al_shrink(mdev);
|
||||||
err = drbd_check_al_size(mdev, new_disk_conf);
|
err = drbd_check_al_size(mdev, new_disk_conf);
|
||||||
lc_unlock(mdev->act_log);
|
lc_unlock(mdev->act_log);
|
||||||
wake_up(&mdev->al_wait);
|
wake_up(&mdev->al_wait);
|
||||||
|
drbd_resume_io(mdev);
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
retcode = ERR_NOMEM;
|
retcode = ERR_NOMEM;
|
||||||
|
|
Loading…
Reference in New Issue