NeilBrown: Assemble: Handle assembling from config file which is out of order.

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


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

Author: NeilBrown <neilb at suse.de>
Date:   Wed Feb 24 11:16:41 2010 +1100

Assemble: Handle assembling from config file which is out of order.

Currently "mdadm -As" will process the entries in the config
file in order.  If any array is a component or member of a preceding
array, that array will not be assembled.

So if there are any failures during assembly, retry those arrays,
and look until everything is assembled, or nothing more can
be assembled.

Signed-off-by: NeilBrown <neilb at suse.de>

---

 mdadm.c |   48 +++++++++++++++++++++++++++++++++---------------
 mdadm.h |    4 ++++
 2 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/mdadm.c b/mdadm.c
index eb124d5..d5e34c0 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -1120,9 +1120,10 @@ int main(int argc, char *argv[])
 					       verbose-quiet, force);
 			}
 		} else {
-			mddev_ident_t array_list =  conf_get_ident(NULL);
+			mddev_ident_t a, array_list =  conf_get_ident(NULL);
 			mddev_dev_t devlist = conf_get_devs();
 			int cnt = 0;
+			int failures, successes;
 			if (devlist == NULL) {
 				fprintf(stderr, Name ": No devices listed in conf file were found.\n");
 				exit(1);
@@ -1135,21 +1136,38 @@ int main(int argc, char *argv[])
 				fprintf(stderr, Name ": --backup_file not meaningful with a --scan assembly.\n");
 				exit(1);
 			}
-			for (; array_list; array_list = array_list->next) {
-				if (array_list->devname &&
-				    strcasecmp(array_list->devname, "<ignore>") == 0)
-					continue;
-				if (array_list->autof == 0)
-					array_list->autof = autof;
+			for (a = array_list; a ; a = a->next) {
+				a->assembled = 0;
+				if (a->autof == 0)
+					a->autof = autof;
+			}
+			do {
+				failures = 0;
+				successes = 0;
+				rv = 0;
+				for (a = array_list; a ; a = a->next) {
+					int r;
+					if (a->assembled)
+						continue;
+					if (a->devname &&
+					    strcasecmp(a->devname, "<ignore>") == 0)
+						continue;
 				
-				rv |= Assemble(ss, array_list->devname,
-					       array_list,
-					       NULL, NULL,
-					       readonly, runstop, NULL,
-					       homehost, require_homehost,
-					       verbose-quiet, force);
-				cnt++;
-			}
+					r = Assemble(ss, a->devname,
+						     a,
+						     NULL, NULL,
+						     readonly, runstop, NULL,
+						     homehost, require_homehost,
+						     verbose-quiet, force);
+					if (r == 0) {
+						a->assembled = 1;
+						successes++;
+					} else
+						failures++;
+					rv |= r;
+					cnt++;
+				}
+			} while (failures && successes);
 			if (homehost && cnt == 0) {
 				/* Maybe we can auto-assemble something.
 				 * Repeatedly call Assemble in auto-assemble mode
diff --git a/mdadm.h b/mdadm.h
index a7d8b79..df3a056 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -301,6 +301,10 @@ typedef struct mddev_ident_s {
 	char	*member;	/* subarray within a container */
 
 	struct mddev_ident_s *next;
+	union {
+		/* fields needed by different users of this structure */
+		int assembled;	/* set when assembly succeeds */
+	};
 } *mddev_ident_t;
 
 /* List of device names - wildcards expanded */




More information about the pkg-mdadm-commits mailing list