diff --git a/super-ddf.c b/super-ddf.c index 79c65e1..81649d4 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -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) {