Skip to content

Commit

Permalink
dm raid: fix raid_resume() to keep raid set frozen as needed
Browse files Browse the repository at this point in the history
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: Heinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
  • Loading branch information
Heinz Mauelshagen authored and Mike Snitzer committed Dec 8, 2017
1 parent 188a212 commit d39f001
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions drivers/md/dm-raid.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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))
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);
Expand Down

0 comments on commit d39f001

Please sign in to comment.