]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Build.c
Change MAJOR() etc to major() etc
[thirdparty/mdadm.git] / Build.c
diff --git a/Build.c b/Build.c
index 51f2df07c3744389be1bde877ac061d63d2ba003..6bb3a626c391eafd8aafc0c407d48b2cec0f7737 100644 (file)
--- a/Build.c
+++ b/Build.c
@@ -1,5 +1,5 @@
 /*
- * mdctl - manage Linux "md" devices aka RAID arrays.
+ * mdadm - manage Linux "md" devices aka RAID arrays.
  *
  * Copyright (C) 2001-2002 Neil Brown <neilb@cse.unsw.edu.au>
  *
  *           Australia
  */
 
-#include "mdctl.h"
+#include "mdadm.h"
 
 #define REGISTER_DEV           _IO (MD_MAJOR, 1)
 #define START_MD               _IO (MD_MAJOR, 2)
 #define STOP_MD                _IO (MD_MAJOR, 3)
 
-int Build(char *mddev, int mdfd, int chunk, int level,
+int Build(char *mddev, int mdfd, int chunk, int level, int layout,
          int raiddisks,
-         mddev_dev_t devlist)
+         mddev_dev_t devlist, int assume_clean)
 {
        /* Build a linear or raid0 arrays without superblocks
         * We cannot really do any checks, we just do it.
@@ -50,6 +50,7 @@ int Build(char *mddev, int mdfd, int chunk, int level,
         * SET_ARRAY_INFO,  ADD_NEW_DISK, RUN_ARRAY
         *
         */
+       int verbose = 0;
        int i;
        int vers;
        struct stat stb;
@@ -77,6 +78,34 @@ int Build(char *mddev, int mdfd, int chunk, int level,
                return 1;
        }
 
+       if (layout == UnSet)
+               switch(level) {
+               default: /* no layout */
+                       layout = 0;
+                       break;
+               case 10:
+                       layout = 0x102; /* near=2, far=1 */
+                       if (verbose)
+                               fprintf(stderr,
+                                       Name ": layout defaults to n1\n");
+                       break;
+               case 5:
+               case 6:
+                       layout = map_name(r5layout, "default");
+                       if (verbose)
+                               fprintf(stderr,
+                                       Name ": layout defaults to %s\n", map_num(r5layout, layout));
+                       break;
+               case LEVEL_FAULTY:
+                       layout = map_name(faultylayout, "default");
+
+                       if (verbose)
+                               fprintf(stderr,
+                                       Name ": layout defaults to %s\n", map_num(faultylayout, layout));
+                       break;
+               }
+
+
        vers = md_get_version(mdfd);
        
        /* looks Ok, go for it */
@@ -88,9 +117,11 @@ int Build(char *mddev, int mdfd, int chunk, int level,
                array.raid_disks = raiddisks;
                array.md_minor = 0;
                if (fstat(mdfd, &stb)==0)
-                       array.md_minor = MINOR(stb.st_rdev);
+                       array.md_minor = minor(stb.st_rdev);
                array.not_persistent = 1;
                array.state = 0; /* not clean, but no errors */
+               if (assume_clean)
+                       array.state |= 1;
                array.active_disks = raiddisks;
                array.working_disks = raiddisks;
                array.spare_disks = 0;
@@ -98,6 +129,7 @@ int Build(char *mddev, int mdfd, int chunk, int level,
                if (chunk == 0)  
                        chunk = 64;
                array.chunk_size = chunk*1024;
+               array.layout = layout;
                if (ioctl(mdfd, SET_ARRAY_INFO, &array)) {
                        fprintf(stderr, Name ": SET_ARRAY_INFO failed for %s: %s\n",
                                mddev, strerror(errno));
@@ -121,8 +153,8 @@ int Build(char *mddev, int mdfd, int chunk, int level,
                        disk.number = i;
                        disk.raid_disk = i;
                        disk.state = 6;
-                       disk.major = MAJOR(stb.st_rdev);
-                       disk.minor = MINOR(stb.st_rdev);
+                       disk.major = major(stb.st_rdev);
+                       disk.minor = minor(stb.st_rdev);
                        if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
                                fprintf(stderr, Name ": ADD_NEW_DISK failed for %s: %s\n",
                                        dv->devname, strerror(errno));
@@ -130,7 +162,7 @@ int Build(char *mddev, int mdfd, int chunk, int level,
                        }
                } else {
                        if (ioctl(mdfd, REGISTER_DEV, &stb.st_rdev)) {
-                               fprintf(stderr, Name ": REGISTER_DEV failed for %s.\n",
+                               fprintf(stderr, Name ": REGISTER_DEV failed for %s: %s.\n",
                                        dv->devname, strerror(errno));
                                goto abort;
                        }