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:
parent
4e5870181a
commit
e3c2a365e9
31
super-ddf.c
31
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) {
|
||||
|
|
Loading…
Reference in New Issue