]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
util: fix test for text_version
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index e613a0c8e9fc442d61252184dcab8760de46e046..dddcc8b3cefd4fb365d00de4d723ccf6593a3f9a 100644 (file)
--- a/util.c
+++ b/util.c
@@ -765,7 +765,7 @@ int find_free_devnum(int use_partitions)
 {
        int devnum;
        for (devnum = 127; devnum != 128;
-            devnum = devnum ? devnum-1 : (1<<22)-1) {
+            devnum = devnum ? devnum-1 : (1<<20)-1) {
                char *dn;
                int _devnum;
 
@@ -852,13 +852,20 @@ int same_dev(char *one, char *two)
        return st1.st_rdev == st2.st_rdev;
 }
 
-void wait_for(char *dev)
+void wait_for(char *dev, int fd)
 {
        int i;
+       struct stat stb_want;
+
+       if (fstat(fd, &stb_want) != 0 ||
+           (stb_want.st_mode & S_IFMT) != S_IFBLK)
+               return;
 
        for (i=0 ; i<25 ; i++) {
                struct stat stb;
-               if (stat(dev, &stb) == 0)
+               if (stat(dev, &stb) == 0 &&
+                   (stb.st_mode & S_IFMT) == S_IFBLK &&
+                   (stb.st_rdev == stb_want.st_rdev))
                        return;
                usleep(200000);
        }
@@ -909,7 +916,10 @@ struct supertype *super_by_fd(int fd)
                if (sra)
                        sysfs_free(sra);
                sra = sysfs_read(-1, devnum, GET_VERSION);
-               verstr = sra->text_version ? : "-no-metadata-";
+               if (sra && sra->text_version[0])
+                       verstr = sra->text_version;
+               else
+                       verstr = "-no-metadata-";
        }
 
        for (i = 0; st == NULL && superlist[i] ; i++)
@@ -1085,7 +1095,8 @@ int add_disk(int mdfd, struct supertype *st,
        int rv;
 #ifndef MDASSEMBLE
        if (st->ss->external) {
-               rv = sysfs_add_disk(sra, info);
+               rv = sysfs_add_disk(sra, info,
+                                   info->disk.state & (1<<MD_DISK_SYNC));
                if (! rv) {
                        struct mdinfo *sd2;
                        for (sd2 = sra->devs; sd2; sd2=sd2->next)