]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
DDF: __write_init_super_ddf: use correct VD conf
authormwilck@arcor.de <mwilck@arcor.de>
Fri, 1 Mar 2013 22:28:30 +0000 (23:28 +0100)
committerNeilBrown <neilb@suse.de>
Mon, 4 Mar 2013 05:13:21 +0000 (16:13 +1100)
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>
super-ddf.c

index 79c65e1c279488cadb44e0ce920d02b2f0f8f450..81649d4577b882c7454fec0c4a39cae4e6af9d42 100644 (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) {