summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-07-06 12:04:40 +1000
committerNeilBrown <neilb@suse.de>2010-07-06 12:04:40 +1000
commit3a6ec29ad5695e23723fe18cb0ce3c49cd675fa2 (patch)
tree5fe0d624e7def6583c9ee83b4275f1c5ed6c4b00
parente5c99c0811199a734ed0fe41784d22230922a49a (diff)
downloadmdadm-3a6ec29ad5695e23723fe18cb0ce3c49cd675fa2.tar.gz
mdadm-3a6ec29ad5695e23723fe18cb0ce3c49cd675fa2.tar.xz
mdadm-3a6ec29ad5695e23723fe18cb0ce3c49cd675fa2.zip
Don't let incremental add devices to active arrays.
Adding devices to active arrays in --incremental is a bit dubious. Normally the array won't be activated until all expected devices are present, so this situation would mean that the given device is not expected, so is probably failed. In that case it should only be added by explicit sysadmin request. However if --run was given, then quite possibly the array was assembled earlier when not complete, so it is less clear whether it is wrong to add this device or not. In that case add it as that is generally safest. It would be nice to allow policy for this to be explicitly given by sysadmin. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Incremental.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/Incremental.c b/Incremental.c
index a99811d..7f67535 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -368,6 +368,22 @@ int Incremental(char *devname, int verbose, int runstop,
else
strcpy(chosen_name, devnum2devname(mp->devnum));
+ /* It is generally not OK to add drives to a running array
+ * as they are probably missing because they failed.
+ * However if runstop is 1, then the array was possibly
+ * started early and our best be is to add this anyway.
+ * It would probably be good to allow explicit policy
+ * statement about this.
+ */
+ if (runstop < 1) {
+ if (ioctl(mdfd, GET_ARRAY_INFO, &ainf) == 0) {
+ fprintf(stderr, Name
+ ": not adding %s to active array (without --run) %s\n",
+ devname, chosen_name);
+ close(mdfd);
+ return 2;
+ }
+ }
sra = sysfs_read(mdfd, fd2devnum(mdfd), (GET_DEVS | GET_STATE));
if (sra->devs) {