提交 53bf5384 编写于 作者: H Heinz Mauelshagen 提交者: Mike Snitzer

dm raid: validate current raid sets redundancy

Verifying the current raid sets redundancy based on retrieved
superblock content has to use the superblock's raid level (e.g. raid0),
not the constructor requested one (e.g. raid10).

Using the requested raid level of raid10 lead to a "divide error"
on raid0 which defines data copies divided by to be zero.

Also check for bogus data copies.
Signed-off-by: NHeinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: NMike Snitzer <snitzer@redhat.com>
上级 b84cf269
...@@ -1007,7 +1007,7 @@ static int validate_raid_redundancy(struct raid_set *rs) ...@@ -1007,7 +1007,7 @@ static int validate_raid_redundancy(struct raid_set *rs)
!rs->dev[i].rdev.sb_page) !rs->dev[i].rdev.sb_page)
rebuild_cnt++; rebuild_cnt++;
switch (rs->raid_type->level) { switch (rs->md.level) {
case 0: case 0:
break; break;
case 1: case 1:
...@@ -1022,6 +1022,11 @@ static int validate_raid_redundancy(struct raid_set *rs) ...@@ -1022,6 +1022,11 @@ static int validate_raid_redundancy(struct raid_set *rs)
break; break;
case 10: case 10:
copies = raid10_md_layout_to_copies(rs->md.new_layout); copies = raid10_md_layout_to_copies(rs->md.new_layout);
if (copies < 2) {
DMERR("Bogus raid10 data copies < 2!");
return -EINVAL;
}
if (rebuild_cnt < copies) if (rebuild_cnt < copies)
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册