]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - mapfile.c
Remove scattered checks for malloc success.
[thirdparty/mdadm.git] / mapfile.c
index ff1e97360dc20cf06e586567e22d58e1c982da97..fa238832ab6ba633ef08960125f37242945cfd09 100644 (file)
--- a/mapfile.c
+++ b/mapfile.c
  *  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       <sys/file.h>
 #include       <ctype.h>
 
-#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)
@@ -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;