]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
Fix parsing of /dev/md/N in is_standard
[thirdparty/mdadm.git] / Create.c
index e1b173738dac11228b748320acc2cf3095f8bfbe..735b8d799a858ae3d69f66acf8a88c53b91e0de0 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -341,11 +341,26 @@ int Create(struct supertype *st, char *mddev, int mdfd,
        array.nr_disks = array.working_disks + array.failed_disks;
        array.layout = layout;
        array.chunk_size = chunk*1024;
-       printf("VERS = %d\n", vers);
 
-       if (!st->ss->init_super(&super, &array))
+
+       if (!st->ss->init_super(st, &super, &array))
                return 1;
 
+       if (bitmap_file && strcmp(bitmap_file, "internal")==0) {
+               if ((vers%100) < 2) {
+                       fprintf(stderr, Name ": internal bitmaps not supported by this kernel.\n");
+                       return 1;
+               }
+               if (!st->ss->add_internal_bitmap(super, bitmap_chunk, delay, 
+                                                size ? size : maxsize)) {
+                       fprintf(stderr, Name ": Given bitmap chunk size not supported.\n");
+                       return 1;
+               }
+               bitmap_file = NULL;
+       }
+
+
+
        if ((vers % 100) >= 1) { /* can use different versions */
                mdu_array_info_t inf;
                memset(&inf, 0, sizeof(inf));
@@ -362,6 +377,10 @@ int Create(struct supertype *st, char *mddev, int mdfd,
 
        if (bitmap_file) {
                int uuid[4];
+
+               if (bitmap_chunk == UnSet)
+                       bitmap_chunk = DEFAULT_BITMAP_CHUNK;
+
                st->ss->uuid_from_super(uuid, super);
                if (CreateBitmap(bitmap_file, force, (char*)uuid, bitmap_chunk, delay,
                                 array.size*2ULL /* FIXME wrong for raid10 */)) {
@@ -417,12 +436,12 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                                disk.minor = minor(stb.st_rdev);
                                close(fd);
                        }
-                       if (disk.state != 1)
                        switch(pass){
                        case 1:
                                st->ss->add_to_super(super, &disk);
                                break;
                        case 2:
+                               if (disk.state == 1) break;
                                st->ss->write_init_super(st, super, &disk, dv->devname);
 
                                if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
@@ -445,7 +464,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                if (ioctl(mdfd, RUN_ARRAY, &param)) {
                        fprintf(stderr, Name ": RUN_ARRAY failed: %s\n",
                                strerror(errno));
-                       Manage_runstop(mddev, mdfd, -1);
+                       Manage_runstop(mddev, mdfd, -1, 0);
                        return 1;
                }
                fprintf(stderr, Name ": array %s started.\n", mddev);