X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=mapfile.c;h=fa238832ab6ba633ef08960125f37242945cfd09;hb=abe94694dadc1a889e208bfafdfce7d742e9cbd4;hp=1cc61d1b82aa702437768fbdfaa2dbb0b6028452;hpb=fa56eddbd1ff1e007cfe588ddc97787d81a4fc3d;p=thirdparty%2Fmdadm.git diff --git a/mapfile.c b/mapfile.c index 1cc61d1b..fa238832 100644 --- a/mapfile.c +++ b/mapfile.c @@ -38,27 +38,19 @@ * UUID - uuid of the array * path - path where device created: /dev/md/home * - * The best place for the mapfile wold be /var/run/mdadm/map. However - * it is needed during initramfs early-boot, and /var/run doesn't exist there - * and certainly doesn't persist through to normal boot. - * So we store it in /dev/.mdadm/map but allow this to be changed at - * compile time. via MAP_DIR and MAP_FILE - * + * The best place for the mapfile is /run/mdadm/map. Distros and users + * which have not switched to /run yet can choose a different location + * at compile time via MAP_DIR and MAP_FILE. */ #include "mdadm.h" #include #include -#ifndef MAP_DIR -#define MAP_DIR "/dev/.mdadm" -#define MAP_FILE "map" -#endif #define MAP_READ 0 #define MAP_NEW 1 #define MAP_LOCK 2 #define MAP_DIRNAME 3 -#define mapnames(dir, base) { \ char *mapname[4] = { MAP_DIR "/" MAP_FILE, @@ -159,15 +151,27 @@ void map_unlock(struct map_ent **melp) lf = NULL; } +void map_fork(void) +{ + /* We are forking, so must close the lock file. + * Don't risk flushing anything though. + */ + if (lf) { + close(fileno(lf)); + fclose(lf); + lf = NULL; + } +} + void map_add(struct map_ent **melp, int devnum, char *metadata, int uuid[4], char *path) { - struct map_ent *me = malloc(sizeof(*me)); + struct map_ent *me = xmalloc(sizeof(*me)); me->devnum = devnum; strcpy(me->metadata, metadata); memcpy(me->uuid, uuid, 16); - me->path = path ? strdup(path) : NULL; + me->path = path ? xstrdup(path) : NULL; me->next = *melp; me->bad = 0; *melp = me; @@ -233,7 +237,8 @@ int map_update(struct map_ent **mpp, int devnum, char *metadata, strcpy(mp->metadata, metadata); memcpy(mp->uuid, uuid, 16); free(mp->path); - mp->path = path ? strdup(path) : NULL; + mp->path = path ? xstrdup(path) : NULL; + mp->bad = 0; break; } if (!mp) @@ -380,7 +385,7 @@ void RebuildMap(void) int dfd; int ok; struct supertype *st; - char *subarray; + char *subarray = NULL; char *path; struct mdinfo *info; @@ -399,6 +404,8 @@ void RebuildMap(void) if (ok != 0) continue; info = st->ss->container_content(st, subarray); + if (!info) + continue; if (md->devnum >= 0) path = map_dev(MD_MAJOR, md->devnum, 0); @@ -419,7 +426,9 @@ void RebuildMap(void) * find a unique name based on metadata name. * */ - struct mddev_ident *match = conf_match(info, st); + struct mddev_ident *match = conf_match(st, info, + NULL, 0, + NULL); struct stat stb; if (match && match->devname && match->devname[0] == '/') { path = match->devname;