summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-03-09 16:32:04 +1100
committerNeilBrown <neilb@suse.de>2010-03-09 16:32:04 +1100
commit430ea469ad1962cbef4d9068e5ca19e0bec41f65 (patch)
tree700e00db496bb5ab2097f1fe1094b8ff90df27b7
parent624c5ad4cb7030f8039042ad442f919da8adad59 (diff)
downloadmdadm-430ea469ad1962cbef4d9068e5ca19e0bec41f65.tar.gz
mdadm-430ea469ad1962cbef4d9068e5ca19e0bec41f65.tar.xz
mdadm-430ea469ad1962cbef4d9068e5ca19e0bec41f65.zip
Stop: done stop a container which still have members active.
Doing that is just confusing... Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Manage.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/Manage.c b/Manage.c
index 6d94836..f848d8b 100644
--- a/Manage.c
+++ b/Manage.c
@@ -236,11 +236,32 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
mdi->array.major_version == -1 &&
mdi->array.minor_version == -2 &&
!is_subarray(mdi->text_version)) {
+ struct mdstat_ent *mds, *m;
/* container, possibly mdmon-managed.
* Make sure mdmon isn't opening it, which
* would interfere with the 'stop'
*/
ping_monitor(mdi->sys_name);
+
+ /* now check that there are no existing arrays
+ * which are members of this array
+ */
+ mds = mdstat_read(0, 0);
+ for (m=mds; m; m=m->next)
+ if (m->metadata_version &&
+ strncmp(m->metadata_version, "external:", 9)==0 &&
+ is_subarray(m->metadata_version+9) &&
+ devname2devnum(m->metadata_version+10) == devnum) {
+ if (!quiet)
+ fprintf(stderr, Name
+ ": Cannot stop container %s: "
+ "member %s still active\n",
+ devname, m->dev);
+ free_mdstat(mds);
+ if (mdi)
+ sysfs_free(mdi);
+ return 1;
+ }
}
if (fd >= 0 && ioctl(fd, STOP_ARRAY, NULL)) {