]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
mdadm-1.8.0
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index 2f4ad9638e71fd2c9ed757d0bd1cdc1d227ded81..121ddbb731a28db5a4d890beaab2bf4031a22d01 100644 (file)
--- a/util.c
+++ b/util.c
@@ -121,6 +121,8 @@ int get_linux_version()
 int enough(int level, int raid_disks, int avail_disks)
 {
        switch (level) {
+       case 10: return 1; /* a lie, but it is hard to tell */
+
        case -4:
                return avail_disks>= 1;
        case -1:
@@ -210,15 +212,23 @@ int load_super(int fd, mdp_super_t *super)
         *   6 - wrong major version
         */
        unsigned long size;
+       unsigned long long dsize;
        unsigned long long offset;
     
-       if (ioctl(fd, BLKGETSIZE, &size))
-               return 1;
+#ifdef BLKGETSIZE64
+       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
+#endif
+       {
+               if (ioctl(fd, BLKGETSIZE, &size))
+                       return 1;
+               else
+                       dsize = size << 9;
+       }
 
-       if (size < MD_RESERVED_SECTORS*2)
+       if (dsize < MD_RESERVED_SECTORS*2)
                return 2;
        
-       offset = MD_NEW_SIZE_SECTORS(size);
+       offset = MD_NEW_SIZE_SECTORS(dsize>>9);
 
        offset *= 512;
 
@@ -240,16 +250,25 @@ int load_super(int fd, mdp_super_t *super)
 
 int store_super(int fd, mdp_super_t *super)
 {
-       long size;
+       unsigned long size;
+       unsigned long long dsize;
+       
        long long offset;
     
-       if (ioctl(fd, BLKGETSIZE, &size))
-               return 1;
+#ifdef BLKGETSIZE64
+       if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
+#endif
+       {
+               if (ioctl(fd, BLKGETSIZE, &size))
+                       return 1;
+               else
+                       dsize = ((unsigned long long)size) << 9;
+       }
 
-       if (size < MD_RESERVED_SECTORS*2)
+       if (dsize < MD_RESERVED_SECTORS*2)
                return 2;
        
-       offset = MD_NEW_SIZE_SECTORS(size);
+       offset = MD_NEW_SIZE_SECTORS(dsize>>9);
 
        offset *= 512;
 
@@ -375,6 +394,32 @@ int map_name(mapping_t *map, char *name)
        return UnSet;
 }
 
+
+int is_standard(char *dev)
+{
+       /* tests if dev is a "standard" md dev name.
+        * i.e if the last component is "/dNN" or "/mdNN",
+        * where NN is a string of digits 
+        */
+       dev = strrchr(dev, '/');
+       if (!dev)
+               return 0;
+       if (strncmp(dev, "/d",2)==0)
+               dev += 2;
+       else if (strncmp(dev, "/md", 3)==0)
+               dev += 3;
+       else
+               return 0;
+       if (!*dev)
+               return 0;
+       while (isdigit(*dev))
+               dev++;
+       if (*dev)
+               return 0;
+       return 1;
+}
+
+
 /*
  * convert a major/minor pair for a block device into a name in /dev, if possible.
  * On the first call, walk /dev collecting name.
@@ -421,31 +466,6 @@ int add_dev(const char *name, const struct stat *stb, int flag)
     return 0;
 }
 
-int is_standard(char *dev)
-{
-       /* tests if dev is a "standard" md dev name.
-        * i.e if the last component is "/dNN" or "/mdNN",
-        * where NN is a string of digits 
-        */
-       dev = strrchr(dev, '/');
-       if (!dev)
-               return 0;
-       if (strncmp(dev, "/d",2)==0)
-               dev += 2;
-       else if (strncmp(dev, "/md", 3)==0)
-               dev += 3;
-       else
-               return 0;
-       if (!*dev)
-               return 0;
-       while (isdigit(*dev))
-               dev++;
-       if (*dev)
-               return 0;
-       return 1;
-}
-
-
 /*
  * Find a block device with the right major/minor number.
  * Avoid /dev/mdNN and /dev/md/dNN is possible