From e3c2a365e9489ad0fa32393e534368486f335b60 Mon Sep 17 00:00:00 2001 From: "mwilck@arcor.de" Date: Fri, 1 Mar 2013 23:28:30 +0100 Subject: [PATCH] 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 Signed-off-by: NeilBrown --- super-ddf.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) 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) {