]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Reread partitions file for each array being assembled.
authorNeil Brown <neilb@suse.de>
Mon, 4 Apr 2005 05:16:22 +0000 (05:16 +0000)
committerNeil Brown <neilb@suse.de>
Mon, 4 Apr 2005 05:16:22 +0000 (05:16 +0000)
This makes assembling arrays from other arrays work better.
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
ChangeLog
config.c

index fb391d3856a323985654eb72ee16e8a516837d32..8a28181598f40530b2d03638e35898d02b5f9152 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,8 @@ Changes Prior to 1.9.0 release
        "MAJOR", "MINOR", "MKDEV" so that large device numbers work
        on 2.6 (providing you have glibc 2.3.3 or later).
     -   Add some missing closes of open file descriptors.
+    -   Reread /proc/partition for every array assembled when using
+       it to find devices, rather than only once.
 
 Changes Prior to 1.8.0 release
     -   Makefile cleanup from  Luca Berra <bluca@comedia.it>
index 550bb80aed4f5be15dbf034a9726345d98fd1978..f23da81615113e589f8f64a7a20a379a4f4a900c 100644 (file)
--- a/config.c
+++ b/config.c
@@ -202,13 +202,14 @@ struct conf_dev {
     char *name;
 } *cdevlist = NULL;
 
-void load_partitions(void)
+mddev_dev_t load_partitions(void)
 {
        FILE *f = fopen("/proc/partitions", "r");
        char buf[1024];
+       mddev_dev_t rv = NULL;
        if (f == NULL) {
                fprintf(stderr, Name ": cannot open /proc/partitions\n");
-               return;
+               return NULL;
        }
        while (fgets(buf, 1024, f)) {
                int major, minor;
@@ -223,15 +224,16 @@ void load_partitions(void)
 
                name = map_dev(major, minor);
                if (name) {
-                       struct conf_dev *cd;
+                       mddev_dev_t d;
 
-                       cd = malloc(sizeof(*cd));
-                       cd->name = strdup(name);
-                       cd->next = cdevlist;
-                       cdevlist = cd;
+                       d = malloc(sizeof(*d));
+                       d->devname = strdup(name);
+                       d->next = rv;
+                       rv = d;
                }
        }
        fclose(f);
+       return rv;
 }
 
 
@@ -241,14 +243,11 @@ void devline(char *line)
        struct conf_dev *cd;
 
        for (w=dl_next(line); w != line; w=dl_next(w)) {
-               if (w[0] == '/') {
+               if (w[0] == '/' || strcasecmp(w, "partitions") == 0) {
                        cd = malloc(sizeof(*cd));
                        cd->name = strdup(w);
                        cd->next = cdevlist;
                        cdevlist = cd;
-               } else if (strcasecmp(w, "partitions") == 0) {
-                       /* read /proc/partitions, and look major/minor up in /dev */
-                       load_partitions();
                } else {
                        fprintf(stderr, Name ": unreconised word on DEVICE line: %s\n",
                                w);
@@ -422,7 +421,7 @@ void load_conffile(char *conffile)
                return;
        }
        if (strcmp(conffile, "partitions")==0) {
-               load_partitions();
+               devline("DEV partitions");
                loaded = 1;
                return;
        }
@@ -497,8 +496,12 @@ mddev_dev_t conf_get_devs(char *conffile)
        load_conffile(conffile);
     
        for (cd=cdevlist; cd; cd=cd->next) {
-               glob(cd->name, flags, NULL, &globbuf);
-               flags |= GLOB_APPEND;
+               if (strcasecmp(cd->name, "partitions")==0 && dlist == NULL)
+                       dlist = load_partitions();
+               else {
+                       glob(cd->name, flags, NULL, &globbuf);
+                       flags |= GLOB_APPEND;
+               }
        }
        if (flags & GLOB_APPEND) {
                for (i=0; i<globbuf.gl_pathc; i++) {