From: NeilBrown Date: Thu, 12 Sep 2013 04:57:28 +0000 (+1000) Subject: DDF: allow for possibility that there is no secondary copy of metadata. X-Git-Tag: mdadm-3.3.1~121 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b95cb4b9d88c8adf2adb7f2efef3ae3f72b27b8e;p=thirdparty%2Fmdadm.git DDF: allow for possibility that there is no secondary copy of metadata. If there isn't, we currently write the second copy at some random location :-) Reported-and-tested-by: Francis Moreau Signed-off-by: NeilBrown --- diff --git a/super-ddf.c b/super-ddf.c index 636d7b49..d2cdda4c 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -880,7 +880,8 @@ static int load_ddf_headers(int fd, struct ddf_super *super, char *devname) super->primary.openflag && !super->secondary.openflag) ) super->active = &super->secondary; - } else if (devname) + } else if (devname && + be64_to_cpu(super->anchor.secondary_lba) != ~(__u64)0) pr_err("Failed to load secondary DDF header on %s\n", devname); if (super->active == NULL) @@ -2810,7 +2811,9 @@ static int add_to_super_ddf(struct supertype *st, } while (0) __calc_lba(dd, ddf->dlist, workspace_lba, 32); __calc_lba(dd, ddf->dlist, primary_lba, 16); - __calc_lba(dd, ddf->dlist, secondary_lba, 32); + if (ddf->dlist == NULL || + be64_to_cpu(ddf->dlist->secondary_lba) != ~(__u64)0) + __calc_lba(dd, ddf->dlist, secondary_lba, 32); pde->config_size = dd->workspace_lba; sprintf(pde->path, "%17.17s","Information: nil") ; @@ -2892,6 +2895,8 @@ static int __write_ddf_structure(struct dl *d, struct ddf_super *ddf, __u8 type) default: return 0; } + if (sector == ~(__u64)0) + return 0; header->type = type; header->openflag = 1;