summaryrefslogtreecommitdiff
path: root/Incremental.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-11-22 20:58:06 +1100
committerNeilBrown <neilb@suse.de>2010-11-22 20:58:06 +1100
commit08387a0473b3a2629c3e306d59a9720022e17af7 (patch)
tree77bcd8e9a4368d241db017dd5804376eb187a2e2 /Incremental.c
parent475a01b8bce8575dd1b2ab6495e65e854702ac0e (diff)
Teach IncrementalRemove about containers.
When we -I -R a device in a container, we must first fail it from each member array before we can remove it from the container. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Incremental.c')
-rw-r--r--Incremental.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/Incremental.c b/Incremental.c
index a2235530..0fef20f5 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -1382,14 +1382,32 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
mdfd = open_dev(ent->devnum);
if (mdfd < 0) {
fprintf(stderr, Name ": Cannot open array %s!!\n", ent->dev);
+ free_mdstat(ent);
return 1;
}
memset(&devlist, 0, sizeof(devlist));
devlist.devname = devname;
devlist.disposition = 'f';
- Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0);
+ /* for a container, we must fail each member array */
+ if (ent->metadata_version &&
+ strncmp(ent->metadata_version, "external:", 9) == 0) {
+ struct mdstat_ent *mdstat = mdstat_read(0, 0);
+ struct mdstat_ent *memb;
+ for (memb = mdstat ; memb ; memb = memb->next)
+ if (is_container_member(memb, ent->dev)) {
+ int subfd = open_dev(memb->devnum);
+ if (subfd >= 0) {
+ Manage_subdevs(memb->dev, subfd,
+ &devlist, verbose, 0);
+ close(subfd);
+ }
+ }
+ free_mdstat(mdstat);
+ } else
+ Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0);
devlist.disposition = 'r';
rv = Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0);
close(mdfd);
+ free_mdstat(ent);
return rv;
}