diff options
author | Neil Brown <neilb@suse.de> | 2005-04-04 05:16:22 +0000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2005-04-04 05:16:22 +0000 |
commit | 057bd352c2b754cc0b4c7d582570dc2ebc4b1f9a (patch) | |
tree | 88081886d43bcb07c4577e0d4444c5b85e31182c /config.c | |
parent | 43fc16763d8cc94275a79247d11da121de716424 (diff) | |
download | mdadm-057bd352c2b754cc0b4c7d582570dc2ebc4b1f9a.tar.gz mdadm-057bd352c2b754cc0b4c7d582570dc2ebc4b1f9a.tar.xz mdadm-057bd352c2b754cc0b4c7d582570dc2ebc4b1f9a.zip |
Reread partitions file for each array being assembled.
This makes assembling arrays from other arrays work better.
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 31 |
1 files changed, 17 insertions, 14 deletions
@@ -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++) { |