Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d39f0010 authored by Heinz Mauelshagen's avatar Heinz Mauelshagen Committed by Mike Snitzer
Browse files

dm raid: fix raid_resume() to keep raid set frozen as needed



During a reshape request: if userspace reloads a "raid" table multiple
times, resulting in multiple superblock reads, the raid set needs to
stay frozen until all config changes (chunk size, layout data_offset,
delta_disks) have been stored in the superblocks and respective flags
cleared.

Signed-off-by: default avatarHeinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 188a212d
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -3899,7 +3899,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);
@@ -3941,8 +3941,14 @@ 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))
	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);