aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm-raid.c')
-rw-r--r--drivers/md/dm-raid.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index af2d79b52484..15daa36fcea6 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -3621,6 +3621,8 @@ static int raid_preresume(struct dm_target *ti)
3621 return r; 3621 return r;
3622} 3622}
3623 3623
3624#define RESUME_STAY_FROZEN_FLAGS (CTR_FLAG_DELTA_DISKS | CTR_FLAG_DATA_OFFSET)
3625
3624static void raid_resume(struct dm_target *ti) 3626static void raid_resume(struct dm_target *ti)
3625{ 3627{
3626 struct raid_set *rs = ti->private; 3628 struct raid_set *rs = ti->private;
@@ -3638,7 +3640,15 @@ static void raid_resume(struct dm_target *ti)
3638 mddev->ro = 0; 3640 mddev->ro = 0;
3639 mddev->in_sync = 0; 3641 mddev->in_sync = 0;
3640 3642
3641 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 3643 /*
3644 * Keep the RAID set frozen if reshape/rebuild flags are set.
3645 * The RAID set is unfrozen once the next table load/resume,
3646 * which clears the reshape/rebuild flags, occurs.
3647 * This ensures that the constructor for the inactive table
3648 * retrieves an up-to-date reshape_position.
3649 */
3650 if (!(rs->ctr_flags & RESUME_STAY_FROZEN_FLAGS))
3651 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
3642 3652
3643 if (mddev->suspended) 3653 if (mddev->suspended)
3644 mddev_resume(mddev); 3654 mddev_resume(mddev);