]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Monitor: track metadata type or parent/container of arrays.
authorNeilBrown <neilb@suse.de>
Mon, 22 Nov 2010 09:58:07 +0000 (20:58 +1100)
committerNeilBrown <neilb@suse.de>
Mon, 22 Nov 2010 09:58:07 +0000 (20:58 +1100)
For subarrays, record the devid of the parent.
For others arrays, record the metadata type.

This will be used in a subsequent patch to link related arrays
together and allow spare migration between containers.

Signed-off-by: NeilBrown <neilb@suse.de>
Monitor.c

index bbf46d6ee31efcab3d15921fcc75831f883283f7..2ca5ee171e282bad52a788b4944f8bc14abd28b3 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -97,6 +97,10 @@ int Monitor(struct mddev_dev *devlist,
                int devstate[MaxDisks];
                unsigned devid[MaxDisks];
                int percent;
+               int parent_dev; /* For subarray, devnum of parent.
+                                * For others, NoMdDev
+                                */
+               struct supertype *metadata;
                struct state *next;
        } *statelist = NULL;
        int finished = 0;
@@ -391,6 +395,17 @@ int Monitor(struct mddev_dev *devlist,
                                } else
                                        info[i].major = info[i].minor = 0;
                        }
+
+                       if (strncmp(mse->metadata_version, "external:", 9) == 0 &&
+                           is_subarray(mse->metadata_version+9))
+                               st->parent_dev =
+                                       devname2devnum(mse->metadata_version+10);
+                       else
+                               st->parent_dev = NoMdDev;
+                       if (st->metadata == NULL &&
+                           st->parent_dev == NoMdDev)
+                               st->metadata = super_by_fd(fd, NULL);
+
                        close(fd);
 
                        for (i=0; i<MaxDisks; i++) {
@@ -472,6 +487,10 @@ int Monitor(struct mddev_dev *devlist,
                                                if (fd >=0) close(fd);
                                                put_md_name(st->devname);
                                                free(st->devname);
+                                               if (st->metadata) {
+                                                       st->metadata->ss->free_super(st->metadata);
+                                                       free(st->metadata);
+                                               }
                                                free(st);
                                                continue;
                                        }
@@ -483,6 +502,13 @@ int Monitor(struct mddev_dev *devlist,
                                        st->percent = -2;
                                        st->spare_group = NULL;
                                        st->expected_spares = -1;
+                                       if (strncmp(mse->metadata_version, "external:", 9) == 0 &&
+                                           is_subarray(mse->metadata_version+9))
+                                               st->parent_dev =
+                                                       devname2devnum(mse->metadata_version+10);
+                                       else
+                                               st->parent_dev = NoMdDev;
+                                       st->metadata = NULL;
                                        statelist = st;
                                        if (test)
                                                alert("TestMessage", st->devname, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);