From: NeilBrown Date: Mon, 22 Nov 2010 09:58:07 +0000 (+1100) Subject: Monitor: track metadata type or parent/container of arrays. X-Git-Tag: mdadm-3.2~261 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ca750d9830cca2454cd6c8d1679dfb9b62f57281;p=thirdparty%2Fmdadm.git Monitor: track metadata type or parent/container of arrays. 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 --- diff --git a/Monitor.c b/Monitor.c index bbf46d6e..2ca5ee17 100644 --- 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=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);