From d1d3482b562369b0d32e4267c2e245a3371d1f10 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Wed, 3 Mar 2010 14:33:55 +1100 Subject: [PATCH] config: add 'homehost' option to 'AUTO' line. This allows basing auto-assembly decisions on whether the array is recorded as belonging to this host or not. Signed-off-by: NeilBrown --- Assemble.c | 3 ++- Incremental.c | 30 +++++++++++++++++------------- config.c | 18 ++++++++++++++++-- mdadm.conf-example | 8 ++++++++ mdadm.conf.5 | 26 ++++++++++++++++++++------ mdadm.h | 3 ++- super-ddf.c | 6 +++++- 7 files changed, 70 insertions(+), 24 deletions(-) diff --git a/Assemble.c b/Assemble.c index 1f73a5be..b3052ac3 100644 --- a/Assemble.c +++ b/Assemble.c @@ -261,7 +261,8 @@ int Assemble(struct supertype *st, char *mddev, devname); tmpdev->used = 2; } else if (auto_assem && st == NULL && - !conf_test_metadata(tst->ss->name)) { + !conf_test_metadata(tst->ss->name, + tst->ss->match_home(tst, homehost) == 1)) { if (report_missmatch) fprintf(stderr, Name ": %s has metadata type %s for which " "auto-assembly is disabled\n", diff --git a/Incremental.c b/Incremental.c index 8c686f7e..7ad648a3 100644 --- a/Incremental.c +++ b/Incremental.c @@ -221,26 +221,30 @@ int Incremental(char *devname, int verbose, int runstop, return 1; } - if (!match && !conf_test_metadata(st->ss->name)) { - if (verbose >= 1) - fprintf(stderr, Name - ": %s has metadata type %s for which " - "auto-assembly is disabled\n", - devname, st->ss->name); - return 1; - } - /* 3a/ if not, check for homehost match. If no match, continue * but don't trust the 'name' in the array. Thus a 'random' minor * number will be assigned, and the device name will be based * on that. */ if (match) trustworthy = LOCAL; - else if ((homehost == NULL || - st->ss->match_home(st, homehost) != 1) && - st->ss->match_home(st, "any") != 1) - trustworthy = FOREIGN; + else if (st->ss->match_home(st, homehost) == 1) + trustworthy = LOCAL; + else if (st->ss->match_home(st, "any") == 1) + trustworthy = LOCAL_ANY; else + trustworthy = FOREIGN; + + + if (!match && !conf_test_metadata(st->ss->name, + (trustworthy == LOCAL))) { + if (verbose >= 1) + fprintf(stderr, Name + ": %s has metadata type %s for which " + "auto-assembly is disabled\n", + devname, st->ss->name); + return 1; + } + if (trustworthy == LOCAL_ANY) trustworthy = LOCAL; /* There are three possible sources for 'autof': command line, diff --git a/config.c b/config.c index 07a12dcb..20c46e9e 100644 --- a/config.c +++ b/config.c @@ -891,18 +891,26 @@ int conf_test_dev(char *devname) return 0; } -int conf_test_metadata(const char *version) +int conf_test_metadata(const char *version, int is_homehost) { /* Check if the given metadata version is allowed * to be auto-assembled. * The default is 'yes' but the 'auto' line might over-ride that. - * Word in auto_options are processed in order with the first + * Words in auto_options are processed in order with the first * match winning. * word can be: * +version - that version can be assembled * -version - that version cannot be auto-assembled * yes or +all - any other version can be assembled * no or -all - no other version can be assembled. + * homehost - any array associated by 'homehost' to this + * host can be assembled. + * + * Thus: + * +ddf -0.90 homehost -all + * will auto-assemble any ddf array, no 0.90 array, and + * any other array (imsm, 1.x) if and only if it is identified + * as belonging to this host. */ char *w; load_conffile(); @@ -914,6 +922,12 @@ int conf_test_metadata(const char *version) return 1; if (strcasecmp(w, "no") == 0) return 0; + if (strcasecmp(w, "homehost") == 0) { + if (is_homehost) + return 1; + else + continue; + } if (w[0] == '+') rv = 1; else if (w[0] == '-') diff --git a/mdadm.conf-example b/mdadm.conf-example index 2d83fc0b..9250f233 100644 --- a/mdadm.conf-example +++ b/mdadm.conf-example @@ -27,6 +27,14 @@ #DEVICE /dev/discs/*/* # # +# The AUTO line can control which arrays get assembled by auto-assembly, +# meaing either "mdadm -As" when there are no 'ARRAY' lines in this file, +# or "mdadm --incremental" when the array found is not listed in this file. +# By default, all arrays that are found are assembled. +# If you want to ignore all DDF arrays (maybe they are managed by dmraid), +# and only assemble 1.x arrays if which are marked for 'this' homehost, +# but assemble all others, then use +#AUTH -ddf hosthost -1.x +all # # ARRAY lines specify an array to assemble and a method of identification. # Arrays can currently be identified by using a UUID, superblock minor number, diff --git a/mdadm.conf.5 b/mdadm.conf.5 index 1c2ae58f..e677ba9e 100644 --- a/mdadm.conf.5 +++ b/mdadm.conf.5 @@ -336,7 +336,7 @@ to suppress this symlink creation. The .B homehost line gives a default value for the -.B --homehost= +.B \-\-homehost= option to mdadm. There should normally be only one other word on the line. It should either be a host name, or one of the special words .B @@ -375,15 +375,19 @@ or .B AUTO A list of names of metadata format can be given, each preceded by a plus or minus sign. Also the word +.I homehost +is allowed as is +.I all +preceded by plus or minus sign. .I all -preceded by plus or minus is allowed and is usually last. +is usually last. When .I mdadm is auto-assembling an array, either via -.I --assemble +.I \-\-assemble or -.I --incremental +.I \-\-incremental and it finds metadata of a given type, it checks that metadata type against those listed in this line. The first match wins, where .I all @@ -393,10 +397,20 @@ assembly is allowed. If the match was preceded by a minus sign, the auto assembly is disallowed. If no match is found, the auto assembly is allowed. +If the metadata indicates that the array was created for +.I this +host, and the word +.I homehost +appears before any other match, then the array is treated as a valid +candidate for auto-assembly. + This can be used to disable all auto-assembly (so that only arrays explicitly listed in mdadm.conf or on the command line are assembled), or to disable assembly of certain metadata types which might be -handled by other software. +handled by other software. It can also be used to disable assembly of +all foreign arrays - normally such arrays are assembled but given a +non-deterministic name in +.BR /dev/md/ . The known metadata types are .BR 0.90 , @@ -451,7 +465,7 @@ CREATE group=system mode=0640 auto=part\-8 .br HOMEHOST .br -AUTO +1.x -all +AUTO +1.x homehost -all .SH SEE ALSO .BR mdadm (8), diff --git a/mdadm.h b/mdadm.h index 3628ea02..362b66b1 100644 --- a/mdadm.h +++ b/mdadm.h @@ -844,7 +844,7 @@ extern int parse_auto(char *str, char *msg, int config); extern mddev_ident_t conf_get_ident(char *dev); extern mddev_dev_t conf_get_devs(void); extern int conf_test_dev(char *devname); -extern int conf_test_metadata(const char *version); +extern int conf_test_metadata(const char *version, int is_homehost); extern struct createinfo *conf_get_create_info(void); extern void set_conffile(char *file); extern char *conf_get_mailaddr(void); @@ -901,6 +901,7 @@ extern int create_mddev(char *dev, char *name, int autof, int trustworthy, char *chosen); /* values for 'trustworthy' */ #define LOCAL 1 +#define LOCAL_ANY 10 #define FOREIGN 2 #define METADATA 3 extern int open_mddev(char *dev, int report_errors); diff --git a/super-ddf.c b/super-ddf.c index 870efd82..c2c562f1 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -1260,7 +1260,11 @@ static int match_home_ddf(struct supertype *st, char *homehost) * the hostname */ struct ddf_super *ddf = st->sb; - int len = strlen(homehost); + int len; + + if (!homehost) + return 0; + len = strlen(homehost); return (memcmp(ddf->controller.guid, T10, 8) == 0 && len < sizeof(ddf->controller.vendor_data) && -- 2.39.2