NeilBrown: config: add 'homehost' option to 'AUTO' line.

Martin F. Krafft madduck at alioth.debian.org
Mon May 24 09:21:11 UTC 2010


Module: mdadm
Branch: upstream
Commit: d1d3482b562369b0d32e4267c2e245a3371d1f10
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=d1d3482b562369b0d32e4267c2e245a3371d1f10

Author: NeilBrown <neilb at suse.de>
Date:   Wed Mar  3 14:33:55 2010 +1100

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 <neilb at suse.de>

---

 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 1f73a5b..b3052ac 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 8c686f7..7ad648a 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 07a12dc..20c46e9 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 2d83fc0..9250f23 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 1c2ae58..e677ba9 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 <system>
@@ -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 <system>
 .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 3628ea0..362b66b 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 870efd8..c2c562f 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) &&




More information about the pkg-mdadm-commits mailing list