diff options
author | Dan Williams <dan.j.williams@intel.com> | 2010-07-19 14:59:25 -0700 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2010-07-19 14:59:25 -0700 |
commit | 1dccfff910ce9d854330302b9a34636d63cdac7b (patch) | |
tree | b031a618780c833d50f7dc82bbb9eeee270cb158 | |
parent | 569cc43ffb0634510defee91407d261555c7a991 (diff) | |
download | mdadm-1dccfff910ce9d854330302b9a34636d63cdac7b.tar.gz mdadm-1dccfff910ce9d854330302b9a34636d63cdac7b.tar.xz mdadm-1dccfff910ce9d854330302b9a34636d63cdac7b.zip |
Incremental: restore assembly for inactive containers, block active
GET_ARRAY_INFO always succeeds on an inactive container, so we need to
be a bit more diligent about adding a disk to an active container.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | Incremental.c | 11 | ||||
-rw-r--r-- | mdadm.h | 1 | ||||
-rw-r--r-- | util.c | 7 |
3 files changed, 17 insertions, 2 deletions
diff --git a/Incremental.c b/Incremental.c index 96bfcec..abfea24 100644 --- a/Incremental.c +++ b/Incremental.c @@ -376,7 +376,16 @@ int Incremental(char *devname, int verbose, int runstop, * statement about this. */ if (runstop < 1) { - if (ioctl(mdfd, GET_ARRAY_INFO, &ainf) == 0) { + int active = 0; + + if (st->ss->external) { + char *devname = devnum2devname(fd2devnum(mdfd)); + + active = devname && is_container_active(devname); + free(devname); + } else if (ioctl(mdfd, GET_ARRAY_INFO, &ainf) == 0) + active = 1; + if (active) { fprintf(stderr, Name ": not adding %s to active array (without --run) %s\n", devname, chosen_name); @@ -930,6 +930,7 @@ extern int open_mddev(char *dev, int report_errors); extern int open_container(int fd); extern int is_container_member(struct mdstat_ent *ent, char *devname); extern int is_subarray_active(char *subarray, char *devname); +int is_container_active(char *devname); extern int open_subarray(char *dev, struct supertype *st, int quiet); extern struct superswitch *version_to_superswitch(char *vers); @@ -1427,7 +1427,7 @@ int is_subarray_active(char *subarray, char *container) if (is_container_member(ent, container)) { char *inst = &ent->metadata_version[10+strlen(container)+1]; - if (strcmp(inst, subarray) == 0) + if (!subarray || strcmp(inst, subarray) == 0) break; } } @@ -1437,6 +1437,11 @@ int is_subarray_active(char *subarray, char *container) return ent != NULL; } +int is_container_active(char *container) +{ + return is_subarray_active(NULL, container); +} + /* open_subarray - opens a subarray in a container * @dev: container device name * @st: supertype with only ->subarray set |