]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Create.c
Fix RAID metadata check
[thirdparty/mdadm.git] / Create.c
index 40f1b7ea81be67015570ad0c4eefb067c162a245..1594a39191396c315c036c4adaec5de72ac18bf1 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -114,8 +114,13 @@ int Create(struct supertype *st, char *mddev,
        unsigned long long newsize;
 
        int major_num = BITMAP_MAJOR_HI;
-       if (s->bitmap_file && strcmp(s->bitmap_file, "clustered") == 0)
+       if (s->bitmap_file && strcmp(s->bitmap_file, "clustered") == 0) {
                major_num = BITMAP_MAJOR_CLUSTERED;
+               if (c->nodes <= 1) {
+                       pr_err("At least 2 nodes are needed for cluster-md\n");
+                       return 1;
+               }
+       }
 
        memset(&info, 0, sizeof(info));
        if (s->level == UnSet && st && st->ss->default_geometry)
@@ -330,7 +335,7 @@ int Create(struct supertype *st, char *mddev,
                }
                close(dfd);
                info.array.working_disks++;
-               if (dnum < s->raiddisks)
+               if (dnum < s->raiddisks && dv->disposition != 'j')
                        info.array.active_disks++;
                if (st == NULL) {
                        struct createinfo *ci = conf_get_create_info();
@@ -400,7 +405,7 @@ int Create(struct supertype *st, char *mddev,
                }
 
                if (dv->disposition == 'j')
-                       continue;  /* skip write journal for size check */
+                       goto skip_size_check;  /* skip write journal for size check */
 
                freesize /= 2; /* convert to K */
                if (s->chunk && s->chunk != UnSet) {
@@ -434,6 +439,7 @@ int Create(struct supertype *st, char *mddev,
                        mindisc = dname;
                        minsize = freesize;
                }
+       skip_size_check:
                if (c->runstop != 1 || c->verbose >= 0) {
                        int fd = open(dname, O_RDONLY);
                        if (fd <0 ) {
@@ -768,9 +774,9 @@ int Create(struct supertype *st, char *mddev,
                                st->ss->name);
                        goto abort_locked;
                }
-               if (!st->ss->add_internal_bitmap(st, &s->bitmap_chunk,
-                                                c->delay, s->write_behind,
-                                                bitmapsize, 1, major_num)) {
+               if (st->ss->add_internal_bitmap(st, &s->bitmap_chunk,
+                                               c->delay, s->write_behind,
+                                               bitmapsize, 1, major_num)) {
                        pr_err("Given bitmap chunk size not supported.\n");
                        goto abort_locked;
                }