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 33e53f0685
).
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:
Родитель
12a7cf5ba6
Коммит
b052b07c39
|
@ -309,3 +309,4 @@ Version History
|
||||||
with a reshape in progress.
|
with a reshape in progress.
|
||||||
1.9.0 Add support for RAID level takeover/reshape/region size
|
1.9.0 Add support for RAID level takeover/reshape/region size
|
||||||
and set size reduction.
|
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_offset", "raid10 offset (striped mirrors)", 0, 2, 10, ALGORITHM_RAID10_OFFSET},
|
||||||
{"raid10_near", "raid10 near (striped mirrors)", 0, 2, 10, ALGORITHM_RAID10_NEAR},
|
{"raid10_near", "raid10 near (striped mirrors)", 0, 2, 10, ALGORITHM_RAID10_NEAR},
|
||||||
{"raid10", "raid10 (striped mirrors)", 0, 2, 10, ALGORITHM_RAID10_DEFAULT},
|
{"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_n", "raid5 (dedicated last parity disk)", 1, 2, 5, ALGORITHM_PARITY_N},
|
||||||
{"raid5_ls", "raid5 (left symmetric)", 1, 2, 5, ALGORITHM_LEFT_SYMMETRIC},
|
{"raid5_ls", "raid5 (left symmetric)", 1, 2, 5, ALGORITHM_LEFT_SYMMETRIC},
|
||||||
{"raid5_rs", "raid5 (right symmetric)", 1, 2, 5, ALGORITHM_RIGHT_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
|
* 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)");
|
DMERR("Reshaping/takeover raid sets not yet supported. (raid level/stripes/size change)");
|
||||||
return -EINVAL;
|
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("Reshaping raid sets not yet supported. (raid layout change)");
|
||||||
DMERR(" 0x%X vs 0x%X", le32_to_cpu(sb->layout), mddev->layout);
|
DMERR(" 0x%X vs 0x%X", le32_to_cpu(sb->layout), mddev->layout);
|
||||||
DMERR(" Old layout: %s w/ %d copies",
|
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));
|
raid10_md_layout_to_copies(mddev->layout));
|
||||||
return -EINVAL;
|
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)");
|
DMERR("Reshaping raid sets not yet supported. (stripe sectors change)");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -2115,6 +2115,8 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DMINFO("Discovered old metadata format; upgrading to extended metadata format");
|
||||||
|
|
||||||
/* Table line is checked vs. authoritative superblock */
|
/* Table line is checked vs. authoritative superblock */
|
||||||
rs_set_new(rs);
|
rs_set_new(rs);
|
||||||
}
|
}
|
||||||
|
@ -3647,7 +3649,7 @@ static void raid_resume(struct dm_target *ti)
|
||||||
|
|
||||||
static struct target_type raid_target = {
|
static struct target_type raid_target = {
|
||||||
.name = "raid",
|
.name = "raid",
|
||||||
.version = {1, 9, 0},
|
.version = {1, 9, 1},
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.ctr = raid_ctr,
|
.ctr = raid_ctr,
|
||||||
.dtr = raid_dtr,
|
.dtr = raid_dtr,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче