From: Mariusz Tkaczyk Date: Fri, 5 Feb 2021 13:29:58 +0000 (+0100) Subject: imsm: add verbose flag to compare_super X-Git-Tag: mdadm-4.2-rc1~16 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=c7b8547c70035395a02ae4f7a5ec76a46dedb3cb 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 Signed-off-by: Jes Sorensen --- diff --git a/Assemble.c b/Assemble.c index ed0ddfb1..48556d8c 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 7013480d..4381cd56 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 e849bdda..cd9cc0fc 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 1ee6c92e..60575af0 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 7cd5702d..23147620 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 c3466d0c..98af3b5e 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 6af140bb..b79b97a9 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 7b03329d..c05e6237 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: