]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Always update mdadm/map when starting an array.
authorNeilBrown <neilb@suse.de>
Tue, 4 Nov 2008 09:50:38 +0000 (20:50 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 4 Nov 2008 09:50:38 +0000 (20:50 +1100)
We previously only updated /var/run/mdadm/map when starting an
array with --incremental.  However we now make more use of
that file (to pass the dev name to udev) so always update it.

Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c
Build.c
Create.c
mapfile.c
mdassemble.c

index 5179df99ff087c4b690ec695deace068fbd27820..5c5a13e0e57ec51be2b1e1625cc69dd33223cfc3 100644 (file)
@@ -144,6 +144,7 @@ int Assemble(struct supertype *st, char *mddev,
        int nextspare = 0;
        char *name;
        int trustworthy;
+       char chosen_name[1024];
 
        memset(&info, 0, sizeof(info));
 
@@ -429,7 +430,8 @@ int Assemble(struct supertype *st, char *mddev,
                        trustworthy = FOREIGN;
                break;
        }
-       mdfd = create_mddev(mddev, name, ident->autof, trustworthy, NULL);
+       mdfd = create_mddev(mddev, name, ident->autof, trustworthy,
+                           chosen_name);
        if (mdfd < 0) {
                st->ss->free_super(st);
                free(devices);
@@ -437,6 +439,7 @@ int Assemble(struct supertype *st, char *mddev,
                        goto try_again;
                return 1;
        }
+       mddev = chosen_name;
        vers = md_get_version(mdfd);
        if (vers < 9000) {
                fprintf(stderr, Name ": Assemble requires driver version 0.90.0 or later.\n"
@@ -899,6 +902,12 @@ int Assemble(struct supertype *st, char *mddev,
        if (!old_linux) {
                int rv;
 
+               /* First, fill in the map, so that udev can find our name
+                * as soon as we become active.
+                */
+               map_update(NULL, fd2devnum(mdfd), info.text_version,
+                          info.uuid, chosen_name);
+
                rv = set_array_info(mdfd, st, &info);
                if (rv) {
                        fprintf(stderr, Name ": failed to set array info for %s: %s\n",
diff --git a/Build.c b/Build.c
index 789aca45996bf8a37796e0de34f0e5192e3268a8..d831e555fdb44fd506d19fb089a47032db97ecc3 100644 (file)
--- a/Build.c
+++ b/Build.c
@@ -60,6 +60,8 @@ int Build(char *mddev, int chunk, int level, int layout,
        unsigned long long size = ~0ULL;
        unsigned long long bitmapsize;
        int mdfd;
+       char chosen_name[1024];
+       int uuid[4] = {0,0,0,0};
 
        /* scan all devices, make sure they really are block devices */
        for (dv = devlist; dv; dv=dv->next) {
@@ -114,10 +116,13 @@ int Build(char *mddev, int chunk, int level, int layout,
                }
 
        /* We need to create the device.  It can have no name. */
-       mdfd = create_mddev(mddev, NULL, autof, LOCAL, NULL);
+       mdfd = create_mddev(mddev, NULL, autof, LOCAL,
+                           chosen_name);
        if (mdfd < 0)
                return 1;
 
+       map_update(NULL, fd2devnum(mdfd), "none", uuid, chosen_name);
+
        vers = md_get_version(mdfd);
 
        /* looks Ok, go for it */
index ab4406e1c0d803b8066ad316aae5876f1b7dea49..23047c93d9f2bad5b82720140ecfe74c0090e4e6 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -79,6 +79,7 @@ int Create(struct supertype *st, char *mddev,
        struct mdinfo info, *infos;
        int did_default = 0;
        unsigned long safe_mode_delay = 0;
+       char chosen_name[1024];
 
        int major_num = BITMAP_MAJOR_HI;
 
@@ -421,7 +422,7 @@ int Create(struct supertype *st, char *mddev,
        }
 
        /* We need to create the device */
-       mdfd = create_mddev(mddev, name, autof, LOCAL, NULL);
+       mdfd = create_mddev(mddev, name, autof, LOCAL, chosen_name);
        if (mdfd < 0)
                return 1;
 
@@ -439,6 +440,7 @@ int Create(struct supertype *st, char *mddev,
                        goto abort;
                }
        }
+
        /* Ok, lets try some ioctls */
 
        info.array.level = level;
@@ -559,6 +561,9 @@ int Create(struct supertype *st, char *mddev,
                                " %s metadata\n", info.text_version);
        }
 
+       map_update(NULL, fd2devnum(mdfd), info.text_version,
+                  info.uuid, chosen_name);
+
        if (bitmap_file && vers < 9003) {
                major_num = BITMAP_MAJOR_HOSTENDIAN;
 #ifdef __BIG_ENDIAN
index 14b6df4cae765ab49182680c47a8d2c865f10ef0..53d9aea42c7d17f16e742da331c56febc5cabd75 100644 (file)
--- a/mapfile.c
+++ b/mapfile.c
@@ -161,7 +161,8 @@ int map_update(struct map_ent **mpp, int devnum, char *metadata,
                }
        if (!mp)
                map_add(&map, devnum, metadata, uuid, path);
-       *mpp = NULL;
+       if (mpp)
+               *mpp = NULL;
        rv = map_write(map);
        map_free(map);
        return rv;
index 270ced2660981cbb16c534d0b1b9f5eea74766ad..ef5639a62807d161350c62b4b2ac88e4f4b12512 100644 (file)
@@ -75,6 +75,11 @@ int create_mddev(char *dev, char *name, int autof/*unused*/, int trustworthy,
        return open_mddev(dev, 0);
 }
 #endif
+int map_update(struct map_ent **mpp, int devnum, char *metadata,
+              int *uuid, char *path)
+{
+       return 0;
+}
 
 int rv;
 int mdfd = -1;