From 3a56f223e94106102eed3fd2b08d3ecad353361b Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 18 Dec 2008 16:23:46 +1100 Subject: [PATCH] map: rebuild map if it doesn't exist. It is possible for some arrays to be created e.g. by initrd, and so not get mentioned in /var/run/mdadm/map. As "-I" depends on things being listed in 'map', we create it by scanning all devices if it doesn't exist. Signed-off-by: NeilBrown --- Incremental.c | 47 --------------------------------------------- mapfile.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 47 deletions(-) diff --git a/Incremental.c b/Incremental.c index 1d326fda..08e0e6f7 100644 --- a/Incremental.c +++ b/Incremental.c @@ -603,53 +603,6 @@ static int count_active(struct supertype *st, int mdfd, char **availp, return cnt + cnt1; } -void RebuildMap(void) -{ - struct mdstat_ent *mdstat = mdstat_read(0, 0); - struct mdstat_ent *md; - struct map_ent *map = NULL; - int mdp = get_mdp_major(); - - for (md = mdstat ; md ; md = md->next) { - struct mdinfo *sra = sysfs_read(-1, md->devnum, GET_DEVS); - struct mdinfo *sd; - - for (sd = sra->devs ; sd ; sd = sd->next) { - char dn[30]; - int dfd; - int ok; - struct supertype *st; - char *path; - struct mdinfo info; - - sprintf(dn, "%d:%d", sd->disk.major, sd->disk.minor); - dfd = dev_open(dn, O_RDONLY); - if (dfd < 0) - continue; - st = guess_super(dfd); - if ( st == NULL) - ok = -1; - else - ok = st->ss->load_super(st, dfd, NULL); - close(dfd); - if (ok != 0) - continue; - st->ss->getinfo_super(st, &info); - if (md->devnum > 0) - path = map_dev(MD_MAJOR, md->devnum, 0); - else - path = map_dev(mdp, (-1-md->devnum)<< 6, 0); - map_add(&map, md->devnum, st->ss->major, - st->minor_version, - info.uuid, path ? : "/unknown"); - st->ss->free_super(st); - break; - } - } - map_write(map); - map_free(map); -} - int IncrementalScan(int verbose) { /* look at every device listed in the 'map' file. diff --git a/mapfile.c b/mapfile.c index f616f159..0d0aa398 100644 --- a/mapfile.c +++ b/mapfile.c @@ -111,6 +111,12 @@ void map_read(struct map_ent **melp) *melp = NULL; f = fopen("/var/run/mdadm/map", "r"); + if (!f) + f = fopen("/var/run/mdadm.map", "r"); + if (!f) { + RebuildMap(); + f = fopen("/var/run/mdadm/map", "r"); + } if (!f) f = fopen("/var/run/mdadm.map", "r"); if (!f) @@ -195,3 +201,50 @@ struct map_ent *map_by_uuid(struct map_ent **map, int uuid[4]) return NULL; } + +void RebuildMap(void) +{ + struct mdstat_ent *mdstat = mdstat_read(0, 0); + struct mdstat_ent *md; + struct map_ent *map = NULL; + int mdp = get_mdp_major(); + + for (md = mdstat ; md ; md = md->next) { + struct mdinfo *sra = sysfs_read(-1, md->devnum, GET_DEVS); + struct mdinfo *sd; + + for (sd = sra->devs ; sd ; sd = sd->next) { + char dn[30]; + int dfd; + int ok; + struct supertype *st; + char *path; + struct mdinfo info; + + sprintf(dn, "%d:%d", sd->disk.major, sd->disk.minor); + dfd = dev_open(dn, O_RDONLY); + if (dfd < 0) + continue; + st = guess_super(dfd); + if ( st == NULL) + ok = -1; + else + ok = st->ss->load_super(st, dfd, NULL); + close(dfd); + if (ok != 0) + continue; + st->ss->getinfo_super(st, &info); + if (md->devnum > 0) + path = map_dev(MD_MAJOR, md->devnum, 0); + else + path = map_dev(mdp, (-1-md->devnum)<< 6, 0); + map_add(&map, md->devnum, st->ss->major, + st->minor_version, + info.uuid, path ? : "/unknown"); + st->ss->free_super(st); + break; + } + } + map_write(map); + map_free(map); +} -- 2.39.2