summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-04-04 05:16:22 +0000
committerNeil Brown <neilb@suse.de>2005-04-04 05:16:22 +0000
commit057bd352c2b754cc0b4c7d582570dc2ebc4b1f9a (patch)
tree88081886d43bcb07c4577e0d4444c5b85e31182c
parent43fc16763d8cc94275a79247d11da121de716424 (diff)
downloadmdadm-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>
-rw-r--r--ChangeLog2
-rw-r--r--config.c31
2 files changed, 19 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index fb391d3..8a28181 100644
--- 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>
diff --git a/config.c b/config.c
index 550bb80..f23da81 100644
--- 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++) {