]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Add nodes option while creating md
authorGuoqing Jiang <gqjiang@suse.com>
Wed, 10 Jun 2015 05:42:05 +0000 (13:42 +0800)
committerNeilBrown <neilb@suse.de>
Tue, 16 Jun 2015 23:04:16 +0000 (09:04 +1000)
Specifies the maximum number of nodes in the cluster that may use
this device simultaneously. This is equivalent to the number of
bitmaps created in the internal superblock (patches to follow).

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Create.c
ReadMe.c
mdadm.8.in
mdadm.c
mdadm.h
super1.c

index 19f3054a5209cb76681b7b034454aa7d3cce5edc..565bf500577dc7e397b8ed86db5fcb7e036c269b 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -531,6 +531,7 @@ int Create(struct supertype *st, char *mddev,
                                st->ss->name);
                warn = 1;
        }
                                st->ss->name);
                warn = 1;
        }
+       st->nodes = c->nodes;
 
        if (warn) {
                if (c->runstop!= 1) {
 
        if (warn) {
                if (c->runstop!= 1) {
index 87a4916b80970da9221e6c2d9fc2b38d732e3d21..30c569da6b0832fe929b7faa54bf1ffb039644eb 100644 (file)
--- a/ReadMe.c
+++ b/ReadMe.c
@@ -140,6 +140,7 @@ struct option long_options[] = {
     {"homehost",  1, 0,  HomeHost},
     {"symlinks",  1, 0,  Symlinks},
     {"data-offset",1, 0, DataOffset},
     {"homehost",  1, 0,  HomeHost},
     {"symlinks",  1, 0,  Symlinks},
     {"data-offset",1, 0, DataOffset},
+    {"nodes",1, 0, Nodes},
 
     /* For assemble */
     {"uuid",      1, 0, 'u'},
 
     /* For assemble */
     {"uuid",      1, 0, 'u'},
index 2a89458dfd027cc6711331f0601287edd01f6967..fed00070384be7440d52edcf8dd526d8d472dac6 100644 (file)
@@ -971,6 +971,12 @@ However for RAID0, it is not possible to add spares.  So to increase
 the number of devices in a RAID0, it is necessary to set the new
 number of devices, and to add the new devices, in the same command.
 
 the number of devices in a RAID0, it is necessary to set the new
 number of devices, and to add the new devices, in the same command.
 
+.TP
+.BR \-\-nodes
+Only works when the array is for clustered environment. It specifies
+the maximum number of nodes in the cluster that will use this device
+simultaneously. If not specified, this defaults to 4.
+
 .SH For assemble:
 
 .TP
 .SH For assemble:
 
 .TP
diff --git a/mdadm.c b/mdadm.c
index 3e8c49b5931126dc1225c51168d8ebf40c372060..2ab006ab6bc1ac786f5f15dc6cc7f18f5e291470 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -588,7 +588,14 @@ int main(int argc, char *argv[])
                        }
                        ident.raid_disks = s.raiddisks;
                        continue;
                        }
                        ident.raid_disks = s.raiddisks;
                        continue;
-
+               case O(CREATE, Nodes):
+                       c.nodes = parse_num(optarg);
+                       if (c.nodes <= 0) {
+                               pr_err("invalid number for the number of cluster nodes: %s\n",
+                                       optarg);
+                               exit(2);
+                       }
+                       continue;
                case O(CREATE,'x'): /* number of spare (eXtra) disks */
                        if (s.sparedisks) {
                                pr_err("spare-devices set twice: %d and %s\n",
                case O(CREATE,'x'): /* number of spare (eXtra) disks */
                        if (s.sparedisks) {
                                pr_err("spare-devices set twice: %d and %s\n",
@@ -1097,6 +1104,15 @@ int main(int argc, char *argv[])
                                s.bitmap_file = optarg;
                                continue;
                        }
                                s.bitmap_file = optarg;
                                continue;
                        }
+                       if (strcmp(optarg, "clustered")== 0) {
+                               s.bitmap_file = optarg;
+                               /* Set the default number of cluster nodes
+                                * to 4 if not already set by user
+                                */
+                               if (c.nodes < 1)
+                                       c.nodes = 4;
+                               continue;
+                       }
                        /* probable typo */
                        pr_err("bitmap file must contain a '/', or be 'internal', or 'none'\n"
                                "       not '%s'\n", optarg);
                        /* probable typo */
                        pr_err("bitmap file must contain a '/', or be 'internal', or 'none'\n"
                                "       not '%s'\n", optarg);
@@ -1377,6 +1393,21 @@ int main(int argc, char *argv[])
        case CREATE:
                if (c.delay == 0)
                        c.delay = DEFAULT_BITMAP_DELAY;
        case CREATE:
                if (c.delay == 0)
                        c.delay = DEFAULT_BITMAP_DELAY;
+
+               if (c.nodes) {
+                       if (!s.bitmap_file || strcmp(s.bitmap_file, "clustered") != 0) {
+                               pr_err("--nodes argument only compatible with --bitmap=clustered\n");
+                               rv = 1;
+                               break;
+                       }
+
+                       if (s.level != 1) {
+                               pr_err("--bitmap=clustered is currently supported with RAID mirror only\n");
+                               rv = 1;
+                               break;
+                       }
+               }
+
                if (s.write_behind && !s.bitmap_file) {
                        pr_err("write-behind mode requires a bitmap.\n");
                        rv = 1;
                if (s.write_behind && !s.bitmap_file) {
                        pr_err("write-behind mode requires a bitmap.\n");
                        rv = 1;
diff --git a/mdadm.h b/mdadm.h
index 141f963e8fc28bcdb6cf5977fb7f195a6c02be7b..9d5580192b5f111f77ae131f3d5b304d1da0883d 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -344,6 +344,7 @@ enum special_options {
        Dump,
        Restore,
        Action,
        Dump,
        Restore,
        Action,
+       Nodes,
 };
 
 enum prefix_standard {
 };
 
 enum prefix_standard {
@@ -418,6 +419,7 @@ struct context {
        char    *backup_file;
        int     invalid_backup;
        char    *action;
        char    *backup_file;
        int     invalid_backup;
        char    *action;
+       int     nodes;
 };
 
 struct shape {
 };
 
 struct shape {
@@ -1029,6 +1031,7 @@ struct supertype {
                         */
        int devcnt;
        int retry_soon;
                         */
        int devcnt;
        int retry_soon;
+       int nodes;
 
        struct mdinfo *devs;
 
 
        struct mdinfo *devs;
 
index 7928a3d2853bfd39df188d62e9aab61ec70f2c22..78d98a7c0f8b1982505b780a96bf33cf76c9c0a9 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -2144,6 +2144,7 @@ add_internal_bitmap1(struct supertype *st,
        bms->daemon_sleep = __cpu_to_le32(delay);
        bms->sync_size = __cpu_to_le64(size);
        bms->write_behind = __cpu_to_le32(write_behind);
        bms->daemon_sleep = __cpu_to_le32(delay);
        bms->sync_size = __cpu_to_le64(size);
        bms->write_behind = __cpu_to_le32(write_behind);
+       bms->nodes = __cpu_to_le32(st->nodes);
 
        *chunkp = chunk;
        return 1;
 
        *chunkp = chunk;
        return 1;