From: NeilBrown Date: Tue, 4 Nov 2008 09:50:38 +0000 (+1100) Subject: Always update mdadm/map when starting an array. X-Git-Tag: mdadm-3.0-devel2~40 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=a04d576343fcdc3da6dee3a198a4534daddbe96e Always update mdadm/map when starting an array. 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 --- diff --git a/Assemble.c b/Assemble.c index 5179df99..5c5a13e0 100644 --- a/Assemble.c +++ b/Assemble.c @@ -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 789aca45..d831e555 100644 --- 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 */ diff --git a/Create.c b/Create.c index ab4406e1..23047c93 100644 --- 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 diff --git a/mapfile.c b/mapfile.c index 14b6df4c..53d9aea4 100644 --- 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; diff --git a/mdassemble.c b/mdassemble.c index 270ced26..ef5639a6 100644 --- a/mdassemble.c +++ b/mdassemble.c @@ -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;