summaryrefslogtreecommitdiffstats
path: root/super-ddf.c
diff options
context:
space:
mode:
authormwilck@arcor.de <mwilck@arcor.de>2013-07-03 22:27:43 +0200
committerNeilBrown <neilb@suse.de>2013-07-08 07:28:31 +0200
commitdbeb699a77e898bb82b90342348dc59743b0c16f (patch)
tree03270fddd224129219baa20368df303ad26c9a32 /super-ddf.c
parentDDF: check_secondary: fix treatment of missing BVDs (diff)
downloadmdadm-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.c13
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;
}