]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Teach IncrementalRemove about containers.
authorNeilBrown <neilb@suse.de>
Mon, 22 Nov 2010 09:58:06 +0000 (20:58 +1100)
committerNeilBrown <neilb@suse.de>
Mon, 22 Nov 2010 09:58:06 +0000 (20:58 +1100)
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>
Incremental.c

index a2235530fa6682449a8a742afb1f3280fe1c5138..0fef20f5206e3f7472d661befed3b9dd72a7938f 100644 (file)
@@ -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;
 }