summaryrefslogtreecommitdiff
path: root/Assemble.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2014-01-20 15:23:31 +1100
committerNeilBrown <neilb@suse.de>2014-01-20 15:23:31 +1100
commit284546ef89168c9003da192a177cae774199f889 (patch)
tree046e26ca64436c58ca92f2e74160976998431e1f /Assemble.c
parenta34fea0eae78fbabb289a5bce6d7a04bf889156d (diff)
downloadmdadm-284546ef89168c9003da192a177cae774199f889.tar.gz
Assemble: avoid infinite loop when auto-assembling partial container.
When auto-assembling we loop until we get no successes. If a device is found that look like it is part of an already-existing container, but we subsequently fail to add that device, then the fact that the container is running looks like a success. This can result in infinite looping. So if a container was already partially assemble, and is still only partially assembled after we try to add devices, then don't treat that as success. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Assemble.c')
-rw-r--r--Assemble.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/Assemble.c b/Assemble.c
index 7e8e795..fdb38e4 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -990,6 +990,10 @@ static int start_array(int mdfd,
}
st->ss->free_super(st);
sysfs_uevent(content, "change");
+ if (err_ok && okcnt < (unsigned)content->array.raid_disks)
+ /* Was partial, is still partial, so signal an error
+ * to ensure we don't retry */
+ return 1;
return 0;
}