|
|
@@ -364,8 +364,12 @@ void mddev_suspend(struct mddev *mddev)
|
|
|
return;
|
|
|
synchronize_rcu();
|
|
|
wake_up(&mddev->sb_wait);
|
|
|
+ set_bit(MD_ALLOW_SB_UPDATE, &mddev->flags);
|
|
|
+ smp_mb__after_atomic();
|
|
|
wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0);
|
|
|
mddev->pers->quiesce(mddev, 1);
|
|
|
+ clear_bit_unlock(MD_ALLOW_SB_UPDATE, &mddev->flags);
|
|
|
+ wait_event(mddev->sb_wait, !test_bit(MD_UPDATING_SB, &mddev->flags));
|
|
|
|
|
|
del_timer_sync(&mddev->safemode_timer);
|
|
|
}
|
|
|
@@ -8838,6 +8842,16 @@ void md_check_recovery(struct mddev *mddev)
|
|
|
unlock:
|
|
|
wake_up(&mddev->sb_wait);
|
|
|
mddev_unlock(mddev);
|
|
|
+ } else if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags) && mddev->sb_flags) {
|
|
|
+ /* Write superblock - thread that called mddev_suspend()
|
|
|
+ * holds reconfig_mutex for us.
|
|
|
+ */
|
|
|
+ set_bit(MD_UPDATING_SB, &mddev->flags);
|
|
|
+ smp_mb__after_atomic();
|
|
|
+ if (test_bit(MD_ALLOW_SB_UPDATE, &mddev->flags))
|
|
|
+ md_update_sb(mddev, 0);
|
|
|
+ clear_bit_unlock(MD_UPDATING_SB, &mddev->flags);
|
|
|
+ wake_up(&mddev->sb_wait);
|
|
|
}
|
|
|
}
|
|
|
EXPORT_SYMBOL(md_check_recovery);
|