diff options
author | Lars Ellenberg <lars.ellenberg@linbit.com> | 2012-08-20 14:54:48 +0200 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-09 14:08:20 +0100 |
commit | 0ee98e2eb0c85f27b6f24a15d59fb54f99a93840 (patch) | |
tree | bc3a3a0f737c6c7fa246047d35e9b1c2337bb418 /drivers/block | |
parent | 4eb9b3cba00471a01699cceb0f4b1f0cb8111ee2 (diff) |
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>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index d31a0261e83e..363034a77e88 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -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; |