diff options
Diffstat (limited to 'drivers/md/dm-raid.c')
-rw-r--r-- | drivers/md/dm-raid.c | 12 |
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 | |||
3624 | static void raid_resume(struct dm_target *ti) | 3626 | static 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); |