DDF: __write_init_super_ddf: use correct VD conf

When writing back the DDF structure, make sure that on each disk
we write the configs that include this disk even if a secondary
RAID level is present. Otherwise the secondary RAID will not be
read correctly any more when we open the device next time.

Signed-off-by: Martin Wilck <mwilck@arcor.de>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
mwilck@arcor.de 2013-03-01 23:28:30 +01:00 committed by NeilBrown
parent 4e5870181a
commit e3c2a365e9
1 changed files with 24 additions and 7 deletions

View File

@ -2376,6 +2376,11 @@ static int remove_from_super_ddf(struct supertype *st, mdu_disk_info_t *dk)
*/
#define NULL_CONF_SZ 4096
static unsigned int get_pd_index_from_refnum(const struct vcl *vc,
__u32 refnum, unsigned int nmax,
const struct vd_config **bvd,
unsigned int *idx);
static int __write_ddf_structure(struct dl *d, struct ddf_super *ddf, __u8 type,
char *null_aligned)
{
@ -2421,14 +2426,26 @@ static int __write_ddf_structure(struct dl *d, struct ddf_super *ddf, __u8 type,
n_config = ddf->max_part;
conf_size = ddf->conf_rec_len * 512;
for (i = 0 ; i <= n_config ; i++) {
struct vcl *c = d->vlist[i];
if (i == n_config)
struct vcl *c;
struct vd_config *vdc = NULL;
if (i == n_config) {
c = (struct vcl *)d->spare;
if (c)
vdc = &c->conf;
} else {
unsigned int dummy;
c = d->vlist[i];
if (c)
get_pd_index_from_refnum(
c, d->disk.refnum,
ddf->mppe,
(const struct vd_config **)&vdc,
&dummy);
}
if (c) {
c->conf.seqnum = ddf->primary.seq;
c->conf.crc = calc_crc(&c->conf, conf_size);
if (write(fd, &c->conf, conf_size) < 0)
vdc->seqnum = ddf->primary.seq;
vdc->crc = calc_crc(vdc, conf_size);
if (write(fd, vdc, conf_size) < 0)
break;
} else {
unsigned int togo = conf_size;
@ -3084,7 +3101,7 @@ static int check_secondary(const struct vcl *vc)
for (i = 0; i < conf->sec_elmnt_count-1; i++) {
const struct vd_config *bvd = vc->other_bvds[i];
if (bvd == NULL) {
pr_err("BVD %d is missing", i+1);
pr_err("BVD %d is missing\n", i+1);
return -1;
}
if (bvd->srl != conf->srl) {