diff options
author | mwilck@arcor.de <mwilck@arcor.de> | 2013-07-03 22:27:43 +0200 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2013-07-08 07:28:31 +0200 |
commit | dbeb699a77e898bb82b90342348dc59743b0c16f (patch) | |
tree | 03270fddd224129219baa20368df303ad26c9a32 /super-ddf.c | |
parent | DDF: check_secondary: fix treatment of missing BVDs (diff) | |
download | mdadm-dbeb699a77e898bb82b90342348dc59743b0c16f.tar.xz mdadm-dbeb699a77e898bb82b90342348dc59743b0c16f.zip |
DDF: load_ddf_headers: use secondary header as fallback
When the primary header can't be read, use the secondary header
as fallback.
Signed-off-by: Martin Wilck <mwilck@arcor.de>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to '')
-rw-r--r-- | super-ddf.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/super-ddf.c b/super-ddf.c index c445df20..45522f2e 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -601,15 +601,15 @@ static int load_ddf_headers(int fd, struct ddf_super *super, char *devname) DDF_REVISION_2, super->anchor.revision,devname); return 2; } + super->active = NULL; if (load_ddf_header(fd, __be64_to_cpu(super->anchor.primary_lba), dsize >> 9, 1, &super->primary, &super->anchor) == 0) { if (devname) pr_err("Failed to load primary DDF header " "on %s\n", devname); - return 2; - } - super->active = &super->primary; + } else + super->active = &super->primary; if (load_ddf_header(fd, __be64_to_cpu(super->anchor.secondary_lba), dsize >> 9, 2, &super->secondary, &super->anchor)) { @@ -619,9 +619,14 @@ static int load_ddf_headers(int fd, struct ddf_super *super, char *devname) || (__be32_to_cpu(super->primary.seq) == __be32_to_cpu(super->secondary.seq) && super->primary.openflag && !super->secondary.openflag) + || super->active == NULL ) super->active = &super->secondary; - } + } else if (devname) + pr_err("Failed to load secondary DDF header on %s\n", + devname); + if (super->active == NULL) + return 2; return 0; } |