diff options
author | NeilBrown <neilb@suse.de> | 2010-11-22 20:58:06 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2010-11-22 20:58:06 +1100 |
commit | 08387a0473b3a2629c3e306d59a9720022e17af7 (patch) | |
tree | 77bcd8e9a4368d241db017dd5804376eb187a2e2 /Incremental.c | |
parent | 475a01b8bce8575dd1b2ab6495e65e854702ac0e (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.c | 20 |
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; } |