]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
Can now mostly assemble DDF arrays
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index a33486fde62c4bf1d67e510d7e2abc33cb1ba58f..7b43ee2e54d16df5b502dcca575d943384ad5cd2 100644 (file)
--- a/util.c
+++ b/util.c
@@ -390,6 +390,9 @@ int is_standard(char *dev, int *nump)
        /* 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
+        * Returns 1 if a partitionable standard,
+        *   -1 if non-partitonable,
+        *   0 if not a standard name.
         */
        char *d = strrchr(dev, '/');
        int type=0;
@@ -609,6 +612,23 @@ char *human_size_brief(long long bytes)
 }
 #endif
 
+unsigned long long calc_array_size(int level, int raid_disks, int layout,
+                                  int chunksize, unsigned long long devsize)
+{
+       int data_disks = 0;
+       switch (level) {
+       case 0: data_disks = raid_disks; break;
+       case 1: data_disks = 1; break;
+       case 4:
+       case 5: data_disks = raid_disks - 1; break;
+       case 6: data_disks = raid_disks - 2; break;
+       case 10: data_disks = raid_disks / (layout & 255) / ((layout>>8)&255);
+               break;
+       }
+       devsize &= ~(unsigned long long)((chunksize>>9)-1);
+       return data_disks * devsize;
+}
+
 #if !defined(MDASSEMBLE) || defined(MDASSEMBLE) && defined(MDASSEMBLE_AUTO)
 int get_mdp_major(void)
 {