DDF: support more RAID10 levels.
The DDF "RAID1E" level is similar to md "raid10". So use raid10 to support RAID1E, and create RAID1E for raid10 configs not already supported. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
2770f45a43
commit
f70d549f12
34
super-ddf.c
34
super-ddf.c
|
@ -673,15 +673,23 @@ static int layout_md2ddf(const mdu_array_info_t *array,
|
||||||
rlq = DDF_RAID1_SIMPLE;
|
rlq = DDF_RAID1_SIMPLE;
|
||||||
prim_elmnt_count = cpu_to_be16(2);
|
prim_elmnt_count = cpu_to_be16(2);
|
||||||
sec_elmnt_count = array->raid_disks / 2;
|
sec_elmnt_count = array->raid_disks / 2;
|
||||||
|
srl = DDF_2SPANNED;
|
||||||
|
prl = DDF_RAID1;
|
||||||
} else if (array->raid_disks % 3 == 0
|
} else if (array->raid_disks % 3 == 0
|
||||||
&& array->layout == 0x103) {
|
&& array->layout == 0x103) {
|
||||||
rlq = DDF_RAID1_MULTI;
|
rlq = DDF_RAID1_MULTI;
|
||||||
prim_elmnt_count = cpu_to_be16(3);
|
prim_elmnt_count = cpu_to_be16(3);
|
||||||
sec_elmnt_count = array->raid_disks / 3;
|
sec_elmnt_count = array->raid_disks / 3;
|
||||||
|
srl = DDF_2SPANNED;
|
||||||
|
prl = DDF_RAID1;
|
||||||
|
} else if (array->layout == 0x201) {
|
||||||
|
prl = DDF_RAID1E;
|
||||||
|
rlq = DDF_RAID1E_OFFSET;
|
||||||
|
} else if (array->layout == 0x102) {
|
||||||
|
prl = DDF_RAID1E;
|
||||||
|
rlq = DDF_RAID1E_ADJACENT;
|
||||||
} else
|
} else
|
||||||
return err_bad_md_layout(array);
|
return err_bad_md_layout(array);
|
||||||
srl = DDF_2SPANNED;
|
|
||||||
prl = DDF_RAID1;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return err_bad_md_layout(array);
|
return err_bad_md_layout(array);
|
||||||
|
@ -742,6 +750,15 @@ static int layout_ddf2md(const struct vd_config *conf,
|
||||||
return err_bad_ddf_layout(conf);
|
return err_bad_ddf_layout(conf);
|
||||||
level = 1;
|
level = 1;
|
||||||
break;
|
break;
|
||||||
|
case DDF_RAID1E:
|
||||||
|
if (conf->rlq == DDF_RAID1E_ADJACENT)
|
||||||
|
layout = 0x102;
|
||||||
|
else if (conf->rlq == DDF_RAID1E_OFFSET)
|
||||||
|
layout = 0x201;
|
||||||
|
else
|
||||||
|
return err_bad_ddf_layout(conf);
|
||||||
|
level = 10;
|
||||||
|
break;
|
||||||
case DDF_RAID4:
|
case DDF_RAID4:
|
||||||
if (conf->rlq != DDF_RAID4_N)
|
if (conf->rlq != DDF_RAID4_N)
|
||||||
return err_bad_ddf_layout(conf);
|
return err_bad_ddf_layout(conf);
|
||||||
|
@ -4242,6 +4259,11 @@ static int get_bvd_state(const struct ddf_super *ddf,
|
||||||
unsigned int i, n_bvd, working = 0;
|
unsigned int i, n_bvd, working = 0;
|
||||||
unsigned int n_prim = be16_to_cpu(vc->prim_elmnt_count);
|
unsigned int n_prim = be16_to_cpu(vc->prim_elmnt_count);
|
||||||
int pd, st, state;
|
int pd, st, state;
|
||||||
|
char *avail = xcalloc(1, n_prim);
|
||||||
|
mdu_array_info_t array;
|
||||||
|
|
||||||
|
layout_ddf2md(vc, &array);
|
||||||
|
|
||||||
for (i = 0; i < n_prim; i++) {
|
for (i = 0; i < n_prim; i++) {
|
||||||
if (!find_index_in_bvd(ddf, vc, i, &n_bvd))
|
if (!find_index_in_bvd(ddf, vc, i, &n_bvd))
|
||||||
continue;
|
continue;
|
||||||
|
@ -4250,8 +4272,10 @@ static int get_bvd_state(const struct ddf_super *ddf,
|
||||||
continue;
|
continue;
|
||||||
st = be16_to_cpu(ddf->phys->entries[pd].state);
|
st = be16_to_cpu(ddf->phys->entries[pd].state);
|
||||||
if ((st & (DDF_Online|DDF_Failed|DDF_Rebuilding))
|
if ((st & (DDF_Online|DDF_Failed|DDF_Rebuilding))
|
||||||
== DDF_Online)
|
== DDF_Online) {
|
||||||
working++;
|
working++;
|
||||||
|
avail[i] = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
state = DDF_state_degraded;
|
state = DDF_state_degraded;
|
||||||
|
@ -4270,6 +4294,10 @@ static int get_bvd_state(const struct ddf_super *ddf,
|
||||||
else if (working >= 2)
|
else if (working >= 2)
|
||||||
state = DDF_state_part_optimal;
|
state = DDF_state_part_optimal;
|
||||||
break;
|
break;
|
||||||
|
case DDF_RAID1E:
|
||||||
|
if (!enough(10, n_prim, array.layout, 1, avail))
|
||||||
|
state = DDF_state_failed;
|
||||||
|
break;
|
||||||
case DDF_RAID4:
|
case DDF_RAID4:
|
||||||
case DDF_RAID5:
|
case DDF_RAID5:
|
||||||
if (working < n_prim - 1)
|
if (working < n_prim - 1)
|
||||||
|
|
Loading…
Reference in New Issue