summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>2021-02-05 14:29:58 +0100
committerJes Sorensen <jsorensen@fb.com>2021-03-08 10:43:29 -0500
commitc7b8547c70035395a02ae4f7a5ec76a46dedb3cb (patch)
tree3bc4491b5fd499ac1f8b66d2b85f3e32b12af3ff
parent49b69533e8a62573de987c45cb4469fc8e754723 (diff)
downloadmdadm-c7b8547c70035395a02ae4f7a5ec76a46dedb3cb.tar.gz
imsm: add verbose flag to compare_super
IMSM does more than comparing metadata and errors reported directly from compare_super_imsm can be useful. Add verbose flag to compare_super method and make all not critical error printing configurable. Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com>
-rw-r--r--Assemble.c2
-rw-r--r--Examine.c2
-rw-r--r--Incremental.c2
-rw-r--r--mdadm.h3
-rw-r--r--super-ddf.c3
-rw-r--r--super-intel.c21
-rw-r--r--super0.c3
-rw-r--r--super1.c3
8 files changed, 23 insertions, 16 deletions
diff --git a/Assemble.c b/Assemble.c
index ed0ddfb..48556d8 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -435,7 +435,7 @@ static int select_devices(struct mddev_dev *devlist,
if (st->ss != tst->ss ||
st->minor_version != tst->minor_version ||
- st->ss->compare_super(st, tst) != 0) {
+ st->ss->compare_super(st, tst, 1) != 0) {
/* Some mismatch. If exactly one array matches this host,
* we can resolve on that one.
* Or, if we are auto assembling, we just ignore the second
diff --git a/Examine.c b/Examine.c
index 7013480..4381cd5 100644
--- a/Examine.c
+++ b/Examine.c
@@ -130,7 +130,7 @@ int Examine(struct mddev_dev *devlist,
char *d;
for (ap = arrays; ap; ap = ap->next) {
if (st->ss == ap->st->ss &&
- st->ss->compare_super(ap->st, st) == 0)
+ st->ss->compare_super(ap->st, st, 0) == 0)
break;
}
if (!ap) {
diff --git a/Incremental.c b/Incremental.c
index e849bdd..cd9cc0f 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -400,7 +400,7 @@ int Incremental(struct mddev_dev *devlist, struct context *c,
}
st2 = dup_super(st);
if (st2->ss->load_super(st2, dfd2, NULL) ||
- st->ss->compare_super(st, st2) != 0) {
+ st->ss->compare_super(st, st2, 1) != 0) {
pr_err("metadata mismatch between %s and chosen array %s\n",
devname, chosen_name);
close(dfd2);
diff --git a/mdadm.h b/mdadm.h
index 1ee6c92..60575af 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -966,7 +966,8 @@ extern struct superswitch {
* moved in, otherwise the superblock in 'st' is compared with
* 'tst'.
*/
- int (*compare_super)(struct supertype *st, struct supertype *tst);
+ int (*compare_super)(struct supertype *st, struct supertype *tst,
+ int verbose);
/* Load metadata from a single device. If 'devname' is not NULL
* print error messages as appropriate */
int (*load_super)(struct supertype *st, int fd, char *devname);
diff --git a/super-ddf.c b/super-ddf.c
index 7cd5702..2314762 100644
--- a/super-ddf.c
+++ b/super-ddf.c
@@ -3914,7 +3914,8 @@ static int store_super_ddf(struct supertype *st, int fd)
return 0;
}
-static int compare_super_ddf(struct supertype *st, struct supertype *tst)
+static int compare_super_ddf(struct supertype *st, struct supertype *tst,
+ int verbose)
{
/*
* return:
diff --git a/super-intel.c b/super-intel.c
index c3466d0..98af3b5 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -3815,7 +3815,8 @@ static void imsm_copy_dev(struct imsm_dev *dest, struct imsm_dev *src)
memcpy(dest, src, sizeof_imsm_dev(src, 0));
}
-static int compare_super_imsm(struct supertype *st, struct supertype *tst)
+static int compare_super_imsm(struct supertype *st, struct supertype *tst,
+ int verbose)
{
/*
* return:
@@ -3838,18 +3839,20 @@ static int compare_super_imsm(struct supertype *st, struct supertype *tst)
*/
if (!check_env("IMSM_NO_PLATFORM") && first->hba && sec->hba) {
if (first->hba->type != sec->hba->type) {
- fprintf(stderr,
- "HBAs of devices do not match %s != %s\n",
- get_sys_dev_type(first->hba->type),
- get_sys_dev_type(sec->hba->type));
+ if (verbose)
+ pr_err("HBAs of devices do not match %s != %s\n",
+ get_sys_dev_type(first->hba->type),
+ get_sys_dev_type(sec->hba->type));
return 3;
}
+
if (first->orom != sec->orom) {
- fprintf(stderr,
- "HBAs of devices do not match %s != %s\n",
- first->hba->pci_id, sec->hba->pci_id);
+ if (verbose)
+ pr_err("HBAs of devices do not match %s != %s\n",
+ first->hba->pci_id, sec->hba->pci_id);
return 3;
}
+
}
/* if an anchor does not have num_raid_devs set then it is a free
@@ -6948,7 +6951,7 @@ count_volumes_list(struct md_list *devlist, char *homehost,
if (st->ss != tst->ss ||
st->minor_version != tst->minor_version ||
- st->ss->compare_super(st, tst) != 0) {
+ st->ss->compare_super(st, tst, 1) != 0) {
/* Some mismatch. If exactly one array matches this host,
* we can resolve on that one.
* Or, if we are auto assembling, we just ignore the second
diff --git a/super0.c b/super0.c
index 6af140b..b79b97a 100644
--- a/super0.c
+++ b/super0.c
@@ -926,7 +926,8 @@ static int write_init_super0(struct supertype *st)
return rv;
}
-static int compare_super0(struct supertype *st, struct supertype *tst)
+static int compare_super0(struct supertype *st, struct supertype *tst,
+ int verbose)
{
/*
* return:
diff --git a/super1.c b/super1.c
index 7b03329..c05e623 100644
--- a/super1.c
+++ b/super1.c
@@ -2144,7 +2144,8 @@ out:
return rv;
}
-static int compare_super1(struct supertype *st, struct supertype *tst)
+static int compare_super1(struct supertype *st, struct supertype *tst,
+ int verbose)
{
/*
* return: