From a714580e029ff92606a10be5db0693f419ce1fec Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 4 Nov 2008 21:56:42 +1100 Subject: [PATCH] Wait for name to appear after create/assemble etc. We don't really want mdadm to exit until udev has created the names in /dev. So wait. Signed-off-by: NeilBrown --- Assemble.c | 8 +++++--- Build.c | 2 ++ Create.c | 1 + Incremental.c | 2 ++ mdadm.h | 1 + util.c | 12 ++++++++++++ 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Assemble.c b/Assemble.c index 0aff1be8..c86a165e 100644 --- a/Assemble.c +++ b/Assemble.c @@ -1216,6 +1216,10 @@ int assemble_container_content(struct supertype *st, int mdfd, /* Nothing new, don't try to start */ ; else if (runstop > 0 || (working + preexist) >= content->array.working_disks) { + + map_update(&map, fd2devnum(mdfd), + content->text_version, + content->uuid, chosen_name); switch(content->array.level) { case LEVEL_LINEAR: case LEVEL_MULTIPATH: @@ -1241,6 +1245,7 @@ int assemble_container_content(struct supertype *st, int mdfd, fprintf(stderr, " (%d new)", working); fprintf(stderr, "\n"); } + wait_for(chosen_name); /* FIXME should have an O_EXCL and wait for read-auto */ } else if (verbose >= 0) @@ -1248,9 +1253,6 @@ int assemble_container_content(struct supertype *st, int mdfd, ": %s assembled with %d devices but " "not started\n", chosen_name, working); - map_update(&map, fd2devnum(mdfd), - content->text_version, - content->uuid, chosen_name); return 0; } diff --git a/Build.c b/Build.c index c92c6a98..52fc0ca0 100644 --- a/Build.c +++ b/Build.c @@ -124,6 +124,7 @@ int Build(char *mddev, int chunk, int level, int layout, map_unlock(&map); return 1; } + mddev = chosen_name; map_update(&map, fd2devnum(mdfd), "none", uuid, chosen_name); map_unlock(&map); @@ -281,6 +282,7 @@ int Build(char *mddev, int chunk, int level, int layout, fprintf(stderr, Name ": array %s built and started.\n", mddev); close(mdfd); + wait_for(mddev); return 0; abort: diff --git a/Create.c b/Create.c index 2ff7d8e1..da05eedd 100644 --- a/Create.c +++ b/Create.c @@ -784,6 +784,7 @@ int Create(struct supertype *st, char *mddev, fprintf(stderr, Name ": not starting array - not enough devices.\n"); } close(mdfd); + wait_for(chosen_name); return 0; abort: diff --git a/Incremental.c b/Incremental.c index 29cbca38..ff8aa9a9 100644 --- a/Incremental.c +++ b/Incremental.c @@ -390,6 +390,7 @@ int Incremental(char *devname, int verbose, int runstop, fprintf(stderr, Name ": container %s now has %d devices\n", chosen_name, info.array.working_disks); + wait_for(chosen_name); return Incremental(chosen_name, verbose, runstop, NULL, homehost, autof); } @@ -461,6 +462,7 @@ int Incremental(char *devname, int verbose, int runstop, ": %s attached to %s, which has been started.\n", devname, chosen_name); rv = 0; + wait_for(chosen_name); } else { fprintf(stderr, Name ": %s attached to %s, but failed to start: %s.\n", diff --git a/mdadm.h b/mdadm.h index 35c1e95d..2b34acff 100644 --- a/mdadm.h +++ b/mdadm.h @@ -646,6 +646,7 @@ extern struct supertype *dup_super(struct supertype *st); extern int get_dev_size(int fd, char *dname, unsigned long long *sizep); extern void get_one_disk(int mdfd, mdu_array_info_t *ainf, mdu_disk_info_t *disk); +void wait_for(char *dev); #if __GNUC__ < 3 struct stat64; diff --git a/util.c b/util.c index 1736d707..8845a0fb 100644 --- a/util.c +++ b/util.c @@ -842,6 +842,18 @@ int same_dev(char *one, char *two) return st1.st_rdev == st2.st_rdev; } +void wait_for(char *dev) +{ + int i; + + for (i=0 ; i<25 ; i++) { + struct stat stb; + if (stat(dev, &stb) == 0) + return; + usleep(200000); + } +} + struct superswitch *superlist[] = { &super0, &super1, &super_ddf, &super_imsm, NULL }; #if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO) -- 2.39.2