]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
To support clustered raid10
authorGuoqing Jiang <gqjiang@suse.com>
Mon, 30 Oct 2017 09:09:51 +0000 (17:09 +0800)
committerJes Sorensen <jsorensen@fb.com>
Thu, 9 Nov 2017 16:56:10 +0000 (11:56 -0500)
We are now considering to extend clustered raid to
support raid10. But only near layout is supported,
so make the check when create the array or switch
the bitmap from internal to clustered.

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
Grow.c
mdadm.c
mdadm.h
util.c

diff --git a/Grow.c b/Grow.c
index 0f9e89bcc5bad5ce97c269dee3b1efad2a8992d7..80176e32c52f62a55da1862dbc26ed4c84b636f1 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -359,6 +359,12 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
 
                ncopies = (array.layout & 255) * ((array.layout >> 8) & 255);
                bitmapsize = bitmapsize * array.raid_disks / ncopies;
+
+               if (strcmp(s->bitmap_file, "clustered") == 0 &&
+                   !is_near_layout_10(array.layout)) {
+                       pr_err("only near layout is supported with clustered raid10\n");
+                       return 1;
+               }
        }
 
        st = super_by_fd(fd, &subarray);
diff --git a/mdadm.c b/mdadm.c
index 7cdcdba7c652248a74b9a49f90f0f56648f1a2b6..87cb33f84ac2f414dfd5a4f636ce116ee34ba2ff 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -1542,8 +1542,13 @@ int main(int argc, char *argv[])
                                break;
                        }
 
-                       if (s.level != 1) {
-                               pr_err("--bitmap=clustered is currently supported with RAID mirror only\n");
+                       if (s.level != 1 && s.level != 10) {
+                               pr_err("--bitmap=clustered is currently supported with raid1/10 only\n");
+                               rv = 1;
+                               break;
+                       }
+                       if (s.level == 10 && !is_near_layout_10(s.layout)) {
+                               pr_err("only near layout is supported with clustered raid10\n");
                                rv = 1;
                                break;
                        }
diff --git a/mdadm.h b/mdadm.h
index 85947bf62ff0eb3eb078016339bc46c0cea5875e..3cbf82f18d9ebb0cf20b787f16bedb10c70b4ba8 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -1434,6 +1434,7 @@ extern int get_linux_version(void);
 extern int mdadm_version(char *version);
 extern unsigned long long parse_size(char *size);
 extern int parse_uuid(char *str, int uuid[4]);
+extern int is_near_layout_10(int layout);
 extern int parse_layout_10(char *layout);
 extern int parse_layout_faulty(char *layout);
 extern long parse_num(char *num);
diff --git a/util.c b/util.c
index c11729e3260ed38a8be54021e525f0b31ecadddf..543ec6cf46ef889f02472d3d186702988c65fc47 100644 (file)
--- a/util.c
+++ b/util.c
@@ -397,6 +397,17 @@ unsigned long long parse_size(char *size)
        return s;
 }
 
+int is_near_layout_10(int layout)
+{
+       int fc, fo;
+
+       fc = (layout >> 8) & 255;
+       fo = layout & (1 << 16);
+       if (fc > 1 || fo > 0)
+               return 0;
+       return 1;
+}
+
 int parse_layout_10(char *layout)
 {
        int copies, rv;