Thread (4 messages) 4 messages, 2 authors, 2011-01-17

RE: [PATCH 2/2] Assemble: allow to assemble spares on their own

flat view

From: Czarnowska, Anna <hidden>
Date: 2011-01-17 10:42:43

quoted
As mentioned earlier, I added a test for 'auto_assem'.
Adding such test means that we can only assemble spares on their own
when there is no config file.
When there is a config file with at least one ARRAY line we do not try
auto assembly.
This also means that adding special ARRAY line for spares will not work
- in this case
we have no auto_assem (because uuid is set) so we try the second loop
where all spares get rejected because domains is null.
...and st->sb is not loaded. 
Should `mdadm -As` only assemble what it finds in config?
Maybe we should always try auto assembly?
What is the original reasoning behind not trying auto assembly when
there is at least one array in config?
Regards
Anna
Spares not matching any array will not be picked up by auto assembly
when there is config file.
Should we just remove the check
cnt == 0
in mdadm.c line 1290?
Regards 
Anna
quoted
Thanks,
NeilBrown

commit ed7fc6b4d91a5342886ba6fe6d175f69f0875d3b
Author: Anna Czarnowska [off-list ref]
Date:   Wed Jan 5 13:54:18 2011 +1100

    Assemble: allow to assemble spares on their own

    If we find spares but no members of given array
    we create container with just spares.

    This allows auto assemble to pick up all lose imsm spares when
there
    is no config file.
    When there is a valid config file and any array is assembled from
it
    we don't try auto assembly so we will not assemble spares that
don't
    match any array.
    To remedy this we must add
    ARRAY metadata=imsm UUID=00000000:00000000:00000000:00000000
    to config file.
    This container will include all remaining spares.

    Signed-off-by: Anna Czarnowska [off-list ref]
    Signed-off-by: NeilBrown [off-list ref]
diff --git a/Assemble.c b/Assemble.c
index 7ef9dc3..532335e 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -489,17 +489,23 @@ int Assemble(struct supertype *st, char *mddev,
 					   homehost, update,
 					   report_missmatch ? devname : NULL))
 				goto loop;
-
-			if (!memcmp(content->uuid, uuid_zero,
sizeof(int[4]))) {
-				/* this is imsm_spare - do not set st */
-				tmpdev->used = 3;
-				goto loop;
-			}

 			if (st == NULL)
 				st = dup_super(tst);
 			if (st->minor_version == -1)
 				st->minor_version = tst->minor_version;
+
+			if (memcmp(content->uuid, uuid_zero,
+				   sizeof(int[4])) == 0) {
+				/* this is a floating spare.  It cannot define
+				 * an array unless there are no more arrays of
+				 * this type to be found.  It can be included
+				 * in an array of this type though.
+				 */
+				tmpdev->used = 3;
+				goto loop;
+			}
+
 			if (st->ss != tst->ss ||
 			    st->minor_version != tst->minor_version ||
 			    st->ss->compare_super(st, tst) != 0) {
@@ -557,6 +563,25 @@ int Assemble(struct supertype *st, char *mddev,
 			tst->ss->free_super(tst);
 	}

+	/* Check if we found some imsm spares but no members */
+	if (auto_assem && (!st || !st->sb))
+		for (tmpdev = devlist; tmpdev; tmpdev = tmpdev->next) {
+			if (tmpdev->used != 3)
+				continue;
+			tmpdev->used = 1;
+			content = &info;
+
+			if (!st->sb) {
+				/* we need sb from one of the spares */
+				int dfd = dev_open(tmpdev->devname, O_RDONLY);
+				if (dfd < 0 ||
+				    st->ss->load_super(st, dfd, NULL))
+					tmpdev->used = 2;
+				if (dfd > 0)
+					close(dfd);
+			}
+		}
+
 	/* Now reject spares that don't match domains of identified
members */
 	for (tmpdev = devlist; tmpdev; tmpdev = tmpdev->next) {
 		struct stat stb;
@@ -892,8 +917,10 @@ int Assemble(struct supertype *st, char *mddev,
 		if (content->array.level != LEVEL_MULTIPATH)
 			if (!(devices[j].i.disk.state & (1<<MD_DISK_ACTIVE)))
{
 				if (!(devices[j].i.disk.state
-				      & (1<<MD_DISK_FAULTY)))
+				      & (1<<MD_DISK_FAULTY))) {
+					devices[j].uptodate = 1;
 					sparecnt++;
+				}
 				continue;
 			}
 		/* If this devices thinks that 'most_recent' has failed,
then
--
To unsubscribe from this list: send the line "unsubscribe linux-raid"
in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-raid"
in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help