|
@@ -3756,6 +3756,8 @@ static int raid_preresume(struct dm_target *ti)
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
+#define RESUME_STAY_FROZEN_FLAGS (CTR_FLAG_DELTA_DISKS | CTR_FLAG_DATA_OFFSET)
|
|
|
+
|
|
|
static void raid_resume(struct dm_target *ti)
|
|
|
{
|
|
|
struct raid_set *rs = ti->private;
|
|
@@ -3773,7 +3775,15 @@ static void raid_resume(struct dm_target *ti)
|
|
|
mddev->ro = 0;
|
|
|
mddev->in_sync = 0;
|
|
|
|
|
|
- clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
|
|
+ /*
|
|
|
+ * Keep the RAID set frozen if reshape/rebuild flags are set.
|
|
|
+ * The RAID set is unfrozen once the next table load/resume,
|
|
|
+ * which clears the reshape/rebuild flags, occurs.
|
|
|
+ * This ensures that the constructor for the inactive table
|
|
|
+ * retrieves an up-to-date reshape_position.
|
|
|
+ */
|
|
|
+ if (!(rs->ctr_flags & RESUME_STAY_FROZEN_FLAGS))
|
|
|
+ clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
|
|
|
|
|
if (mddev->suspended)
|
|
|
mddev_resume(mddev);
|