From 08387a0473b3a2629c3e306d59a9720022e17af7 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 22 Nov 2010 20:58:06 +1100 Subject: [PATCH] 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 --- Incremental.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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; } -- 2.39.2