DDF: container_content_ddf: handle RAID layout for RAID10
This patch adds basic handling for the special case of RAID10. Signed-off-by: Martin Wilck <mwilck@arcor.de> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
a5c7adb310
commit
4e5870181a
79
super-ddf.c
79
super-ddf.c
|
@ -3120,12 +3120,45 @@ static int check_secondary(const struct vcl *vc)
|
||||||
|
|
||||||
#define NO_SUCH_REFNUM (0xFFFFFFFF)
|
#define NO_SUCH_REFNUM (0xFFFFFFFF)
|
||||||
static unsigned int get_pd_index_from_refnum(const struct vcl *vc,
|
static unsigned int get_pd_index_from_refnum(const struct vcl *vc,
|
||||||
__u32 refnum, unsigned int nmax)
|
__u32 refnum, unsigned int nmax,
|
||||||
|
const struct vd_config **bvd,
|
||||||
|
unsigned int *idx)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i, j, n, sec, cnt;
|
||||||
for (i = 0 ; i < nmax ; i++)
|
|
||||||
if (vc->conf.phys_refnum[i] == refnum)
|
cnt = __be16_to_cpu(vc->conf.prim_elmnt_count);
|
||||||
return i;
|
sec = (vc->conf.sec_elmnt_count == 1 ? 0 : vc->conf.sec_elmnt_seq);
|
||||||
|
|
||||||
|
for (i = 0, j = 0 ; i < nmax ; i++) {
|
||||||
|
/* j counts valid entries for this BVD */
|
||||||
|
if (vc->conf.phys_refnum[i] != 0xffffffff)
|
||||||
|
j++;
|
||||||
|
if (vc->conf.phys_refnum[i] == refnum) {
|
||||||
|
*bvd = &vc->conf;
|
||||||
|
*idx = i;
|
||||||
|
return sec * cnt + j - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vc->other_bvds == NULL)
|
||||||
|
goto bad;
|
||||||
|
|
||||||
|
for (n = 1; n < vc->conf.sec_elmnt_count; n++) {
|
||||||
|
struct vd_config *vd = vc->other_bvds[n-1];
|
||||||
|
if (vd == NULL)
|
||||||
|
continue;
|
||||||
|
sec = vd->sec_elmnt_seq;
|
||||||
|
for (i = 0, j = 0 ; i < nmax ; i++) {
|
||||||
|
if (vd->phys_refnum[i] != 0xffffffff)
|
||||||
|
j++;
|
||||||
|
if (vd->phys_refnum[i] == refnum) {
|
||||||
|
*bvd = vd;
|
||||||
|
*idx = i;
|
||||||
|
return sec * cnt + j - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bad:
|
||||||
|
*bvd = NULL;
|
||||||
return NO_SUCH_REFNUM;
|
return NO_SUCH_REFNUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3166,11 +3199,26 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
|
||||||
this->next = rest;
|
this->next = rest;
|
||||||
rest = this;
|
rest = this;
|
||||||
|
|
||||||
this->array.level = map_num1(ddf_level_num, vc->conf.prl);
|
if (vc->conf.sec_elmnt_count == 1) {
|
||||||
this->array.raid_disks =
|
this->array.level = map_num1(ddf_level_num,
|
||||||
__be16_to_cpu(vc->conf.prim_elmnt_count);
|
vc->conf.prl);
|
||||||
this->array.layout = rlq_to_layout(vc->conf.rlq, vc->conf.prl,
|
this->array.raid_disks =
|
||||||
this->array.raid_disks);
|
__be16_to_cpu(vc->conf.prim_elmnt_count);
|
||||||
|
this->array.layout =
|
||||||
|
rlq_to_layout(vc->conf.rlq, vc->conf.prl,
|
||||||
|
this->array.raid_disks);
|
||||||
|
} else {
|
||||||
|
/* The only supported layout is RAID 10.
|
||||||
|
* Compatibility has been checked in check_secondary()
|
||||||
|
* above.
|
||||||
|
*/
|
||||||
|
this->array.level = 10;
|
||||||
|
this->array.raid_disks =
|
||||||
|
__be16_to_cpu(vc->conf.prim_elmnt_count)
|
||||||
|
* vc->conf.sec_elmnt_count;
|
||||||
|
this->array.layout = 0x100 |
|
||||||
|
__be16_to_cpu(vc->conf.prim_elmnt_count);
|
||||||
|
}
|
||||||
this->array.md_minor = -1;
|
this->array.md_minor = -1;
|
||||||
this->array.major_version = -1;
|
this->array.major_version = -1;
|
||||||
this->array.minor_version = -2;
|
this->array.minor_version = -2;
|
||||||
|
@ -3211,6 +3259,9 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
|
||||||
for (pd = 0; pd < __be16_to_cpu(ddf->phys->used_pdes); pd++) {
|
for (pd = 0; pd < __be16_to_cpu(ddf->phys->used_pdes); pd++) {
|
||||||
struct mdinfo *dev;
|
struct mdinfo *dev;
|
||||||
struct dl *d;
|
struct dl *d;
|
||||||
|
const struct vd_config *bvd;
|
||||||
|
unsigned int iphys;
|
||||||
|
__u64 *lba_offset;
|
||||||
int stt;
|
int stt;
|
||||||
|
|
||||||
if (ddf->phys->entries[pd].refnum == 0xFFFFFFFF)
|
if (ddf->phys->entries[pd].refnum == 0xFFFFFFFF)
|
||||||
|
@ -3222,7 +3273,8 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
i = get_pd_index_from_refnum(
|
i = get_pd_index_from_refnum(
|
||||||
vc, ddf->phys->entries[pd].refnum, ddf->mppe);
|
vc, ddf->phys->entries[pd].refnum,
|
||||||
|
ddf->mppe, &bvd, &iphys);
|
||||||
if (i == NO_SUCH_REFNUM)
|
if (i == NO_SUCH_REFNUM)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -3248,8 +3300,9 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
|
||||||
dev->recovery_start = MaxSector;
|
dev->recovery_start = MaxSector;
|
||||||
|
|
||||||
dev->events = __be32_to_cpu(ddf->primary.seq);
|
dev->events = __be32_to_cpu(ddf->primary.seq);
|
||||||
dev->data_offset = __be64_to_cpu(vc->lba_offset[i]);
|
lba_offset = (__u64 *)&bvd->phys_refnum[ddf->mppe];
|
||||||
dev->component_size = __be64_to_cpu(vc->conf.blocks);
|
dev->data_offset = __be64_to_cpu(lba_offset[iphys]);
|
||||||
|
dev->component_size = __be64_to_cpu(bvd->blocks);
|
||||||
if (d->devname)
|
if (d->devname)
|
||||||
strcpy(dev->name, d->devname);
|
strcpy(dev->name, d->devname);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue