aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 0460cf84fd0e..350527f60834 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -3756,6 +3756,8 @@ static int raid_preresume(struct dm_target *ti)
3756 return r; 3756 return r;
3757} 3757}
3758 3758
3759#define RESUME_STAY_FROZEN_FLAGS (CTR_FLAG_DELTA_DISKS | CTR_FLAG_DATA_OFFSET)
3760
3759static void raid_resume(struct dm_target *ti) 3761static void raid_resume(struct dm_target *ti)
3760{ 3762{
3761 struct raid_set *rs = ti->private; 3763 struct raid_set *rs = ti->private;
@@ -3773,7 +3775,15 @@ static void raid_resume(struct dm_target *ti)
3773 mddev->ro = 0; 3775 mddev->ro = 0;
3774 mddev->in_sync = 0; 3776 mddev->in_sync = 0;
3775 3777
3776 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 3778 /*
3779 * Keep the RAID set frozen if reshape/rebuild flags are set.
3780 * The RAID set is unfrozen once the next table load/resume,
3781 * which clears the reshape/rebuild flags, occurs.
3782 * This ensures that the constructor for the inactive table
3783 * retrieves an up-to-date reshape_position.
3784 */
3785 if (!(rs->ctr_flags & RESUME_STAY_FROZEN_FLAGS))
3786 clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
3777 3787
3778 if (mddev->suspended) 3788 if (mddev->suspended)
3779 mddev_resume(mddev); 3789 mddev_resume(mddev);