Add nodes option while creating md

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>
This commit is contained in:
Guoqing Jiang 2015-06-10 13:42:05 +08:00 committed by NeilBrown
parent 95a05b37e8
commit 529e2aa573
6 changed files with 44 additions and 1 deletions

View File

@ -531,6 +531,7 @@ int Create(struct supertype *st, char *mddev,
st->ss->name);
warn = 1;
}
st->nodes = c->nodes;
if (warn) {
if (c->runstop!= 1) {

View File

@ -140,6 +140,7 @@ struct option long_options[] = {
{"homehost", 1, 0, HomeHost},
{"symlinks", 1, 0, Symlinks},
{"data-offset",1, 0, DataOffset},
{"nodes",1, 0, Nodes},
/* For assemble */
{"uuid", 1, 0, 'u'},

View 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.
.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

33
mdadm.c
View File

@ -588,7 +588,14 @@ int main(int argc, char *argv[])
}
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",
@ -1097,6 +1104,15 @@ int main(int argc, char *argv[])
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);
@ -1377,6 +1393,21 @@ int main(int argc, char *argv[])
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;

View File

@ -344,6 +344,7 @@ enum special_options {
Dump,
Restore,
Action,
Nodes,
};
enum prefix_standard {
@ -418,6 +419,7 @@ struct context {
char *backup_file;
int invalid_backup;
char *action;
int nodes;
};
struct shape {
@ -1029,6 +1031,7 @@ struct supertype {
*/
int devcnt;
int retry_soon;
int nodes;
struct mdinfo *devs;

View File

@ -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->nodes = __cpu_to_le32(st->nodes);
*chunkp = chunk;
return 1;