dm raid: fix activation of existing raid4/10 devices
dm-raid 1.9.0 fails to activate existing RAID4/10 devices that have the old superblock format (which does not have takeover/reshaping support that was added via commit 33e53f06850f). Fix validation path for old superblocks by reverting to the old raid4 layout and basing checks on mddev->new_{level,layout,...} members in super_init_validation(). Cc: stable@vger.kernel.org # 4.8 Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
12a7cf5ba6
commit
b052b07c39
@ -309,3 +309,4 @@ Version History
|
||||
with a reshape in progress.
|
||||
1.9.0 Add support for RAID level takeover/reshape/region size
|
||||
and set size reduction.
|
||||
1.9.1 Fix activation of existing RAID 4/10 mapped devices
|
||||
|
@ -266,7 +266,7 @@ static struct raid_type {
|
||||
{"raid10_offset", "raid10 offset (striped mirrors)", 0, 2, 10, ALGORITHM_RAID10_OFFSET},
|
||||
{"raid10_near", "raid10 near (striped mirrors)", 0, 2, 10, ALGORITHM_RAID10_NEAR},
|
||||
{"raid10", "raid10 (striped mirrors)", 0, 2, 10, ALGORITHM_RAID10_DEFAULT},
|
||||
{"raid4", "raid4 (dedicated last parity disk)", 1, 2, 4, ALGORITHM_PARITY_N}, /* raid4 layout = raid5_n */
|
||||
{"raid4", "raid4 (dedicated first parity disk)", 1, 2, 5, ALGORITHM_PARITY_0}, /* raid4 layout = raid5_0 */
|
||||
{"raid5_n", "raid5 (dedicated last parity disk)", 1, 2, 5, ALGORITHM_PARITY_N},
|
||||
{"raid5_ls", "raid5 (left symmetric)", 1, 2, 5, ALGORITHM_LEFT_SYMMETRIC},
|
||||
{"raid5_rs", "raid5 (right symmetric)", 1, 2, 5, ALGORITHM_RIGHT_SYMMETRIC},
|
||||
@ -2087,11 +2087,11 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev)
|
||||
/*
|
||||
* No takeover/reshaping, because we don't have the extended v1.9.0 metadata
|
||||
*/
|
||||
if (le32_to_cpu(sb->level) != mddev->level) {
|
||||
if (le32_to_cpu(sb->level) != mddev->new_level) {
|
||||
DMERR("Reshaping/takeover raid sets not yet supported. (raid level/stripes/size change)");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (le32_to_cpu(sb->layout) != mddev->layout) {
|
||||
if (le32_to_cpu(sb->layout) != mddev->new_layout) {
|
||||
DMERR("Reshaping raid sets not yet supported. (raid layout change)");
|
||||
DMERR(" 0x%X vs 0x%X", le32_to_cpu(sb->layout), mddev->layout);
|
||||
DMERR(" Old layout: %s w/ %d copies",
|
||||
@ -2102,7 +2102,7 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev)
|
||||
raid10_md_layout_to_copies(mddev->layout));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (le32_to_cpu(sb->stripe_sectors) != mddev->chunk_sectors) {
|
||||
if (le32_to_cpu(sb->stripe_sectors) != mddev->new_chunk_sectors) {
|
||||
DMERR("Reshaping raid sets not yet supported. (stripe sectors change)");
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -2115,6 +2115,8 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
DMINFO("Discovered old metadata format; upgrading to extended metadata format");
|
||||
|
||||
/* Table line is checked vs. authoritative superblock */
|
||||
rs_set_new(rs);
|
||||
}
|
||||
@ -3647,7 +3649,7 @@ static void raid_resume(struct dm_target *ti)
|
||||
|
||||
static struct target_type raid_target = {
|
||||
.name = "raid",
|
||||
.version = {1, 9, 0},
|
||||
.version = {1, 9, 1},
|
||||
.module = THIS_MODULE,
|
||||
.ctr = raid_ctr,
|
||||
.dtr = raid_dtr,
|
||||
|
Loading…
x
Reference in New Issue
Block a user