From: Heinz Mauelshagen <heinzm@xxxxxxxxxx> In case userspace reloads multiple times thus reading the superblocks, the raid set needs to stay frozen in case of a reshape request until all config changes (chunk size, layout data_offset, delta_disks) have been stored in the superblocks and respective flags cleared. --- drivers/md/dm-raid.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 3b0964c7da17..e37ee5f8ed3d 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -3885,7 +3885,7 @@ static int raid_preresume(struct dm_target *ti) } /* Check for any reshape request unless new raid set */ - if (test_and_clear_bit(RT_FLAG_RESHAPE_RS, &rs->runtime_flags)) { + if (test_bit(RT_FLAG_RESHAPE_RS, &rs->runtime_flags)) { /* Initiate a reshape. */ rs_set_rdev_sectors(rs); mddev_lock_nointr(mddev); @@ -3927,8 +3927,15 @@ static void raid_resume(struct dm_target *ti) * 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 (!test_and_clear_bit(RT_FLAG_RESHAPE_RS, &rs->runtime_flags) && + !(rs->ctr_flags & RESUME_STAY_FROZEN_FLAGS)) { + if (rs_is_reshapable(rs)) { + if (!rs_is_reshaping(rs) || + _get_reshape_sectors(rs)) + clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); + } else + clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); + } if (test_and_clear_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) { mddev_lock_nointr(mddev); -- 2.13.6 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel