]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Wait for name to appear after create/assemble etc.
authorNeilBrown <neilb@suse.de>
Tue, 4 Nov 2008 10:56:42 +0000 (21:56 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 4 Nov 2008 10:56:42 +0000 (21:56 +1100)
We don't really want mdadm to exit until udev has
created the names in /dev.  So wait.

Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c
Build.c
Create.c
Incremental.c
mdadm.h
util.c

index 0aff1be8350c85afb7747d83f746949ed30214b7..c86a165ee139b6a560e02c1a23b92c99554ed761 100644 (file)
@@ -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 c92c6a985b947d819e11572dc8cd9053405546fe..52fc0ca01623cbeb220aa180a488fdcbd557e552 100644 (file)
--- 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:
index 2ff7d8e1ed2f900b08fc67df885ef3d607d39ec7..da05eeddf89e46db6d08d6880803972ca703c222 100644 (file)
--- 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:
index 29cbca384af1455a278028f8e66f0ea1f2816b7c..ff8aa9a91d3fe949111732312e95fad402bf54c2 100644 (file)
@@ -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 35c1e95d15c561169bef992ff372f21d7a0731c2..2b34acffd5a0d1878d13492a4c654112b1d731cc 100644 (file)
--- 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 1736d70791c8ce5d145f6c01516384f4c19adb30..8845a0fb09bc452d6851c15d346c00eee4a8e5dd 100644 (file)
--- 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)