Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:Update
mdadm.1739
0009-mdadm-change-the-num-of-cluster-node.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0009-mdadm-change-the-num-of-cluster-node.patch of Package mdadm.1739
From 0c2f78f03491a63a8192f85996e503d1caa60b1c Mon Sep 17 00:00:00 2001 From: Guoqing Jiang <gqjiang@suse.com> Date: Tue, 7 Jul 2015 14:58:09 +0800 Subject: [PATCH 09/11] mdadm: change the num of cluster node This extends nodes option for assemble mode, make the num of cluster node could be change by user. Before that, it is necessary to ensure there are enough space for those nodes, calc_bitmap_size is introduced to calculate the bitmap size of each node. Signed-off-by: Guoqing Jiang <gqjiang@suse.com> Signed-off-by: NeilBrown <neilb@suse.de> --- Assemble.c | 3 +++ ReadMe.c | 2 +- mdadm.8.in | 8 ++++++++ mdadm.c | 5 ++++- mdadm.h | 1 + super1.c | 37 +++++++++++++++++++++++++++++++++++++ 6 files changed, 54 insertions(+), 2 deletions(-) diff --git a/Assemble.c b/Assemble.c index 25dfb5a..7e14136 100644 --- a/Assemble.c +++ b/Assemble.c @@ -627,6 +627,9 @@ static int load_devices(struct devs *devices, char *devmap, else if (strcmp(c->update, "home-cluster") == 0) { tst->cluster_name = c->homecluster; tst->ss->write_bitmap(tst, dfd, NameUpdate); + } else if (strcmp(c->update, "nodes") == 0) { + tst->nodes = c->nodes; + err = tst->ss->write_bitmap(tst, dfd, NodeNumUpdate); } else err = tst->ss->update_super(tst, content, c->update, devname, c->verbose, diff --git a/ReadMe.c b/ReadMe.c index 0e6aa17..2ba9fa7 100644 --- a/ReadMe.c +++ b/ReadMe.c @@ -142,7 +142,7 @@ struct option long_options[] = { {"homehost", 1, 0, HomeHost}, {"symlinks", 1, 0, Symlinks}, {"data-offset",1, 0, DataOffset}, - {"nodes",1, 0, Nodes}, + {"nodes",1, 0, Nodes}, /* also for --assemble */ {"home-cluster",1, 0, ClusterName}, /* For assemble */ diff --git a/mdadm.8.in b/mdadm.8.in index f0e3030..89b66d4 100644 --- a/mdadm.8.in +++ b/mdadm.8.in @@ -1112,6 +1112,7 @@ argument given to this flag can be one of .BR summaries , .BR uuid , .BR name , +.BR nodes , .BR homehost , .BR home-cluster , .BR resync , @@ -1164,6 +1165,13 @@ The .B name option will change the .I name +of the array as stored in the superblock and bitmap. This option only +works for clustered environment. + +The +.B nodes +option will change the +.I nodes of the array as stored in the superblock. This is only supported for version-1 superblocks. diff --git a/mdadm.c b/mdadm.c index 694fd36..5dc87f8 100644 --- a/mdadm.c +++ b/mdadm.c @@ -608,6 +608,7 @@ int main(int argc, char *argv[]) } ident.raid_disks = s.raiddisks; continue; + case O(ASSEMBLE, Nodes): case O(CREATE, Nodes): c.nodes = parse_num(optarg); if (c.nodes <= 0) { @@ -768,6 +769,8 @@ int main(int argc, char *argv[]) continue; if (strcmp(c.update, "home-cluster")==0) continue; + if (strcmp(c.update, "nodes")==0) + continue; if (strcmp(c.update, "devicesize")==0) continue; if (strcmp(c.update, "no-bitmap")==0) @@ -808,7 +811,7 @@ int main(int argc, char *argv[]) c.update); } fprintf(outf, "Valid --update options are:\n" - " 'sparc2.2', 'super-minor', 'uuid', 'name', 'resync',\n" + " 'sparc2.2', 'super-minor', 'uuid', 'name', 'nodes', 'resync',\n" " 'summaries', 'homehost', 'home-cluster', 'byteorder', 'devicesize',\n" " 'no-bitmap', 'metadata', 'revert-reshape'\n"); exit(outf == stdout ? 0 : 2); diff --git a/mdadm.h b/mdadm.h index f2eb015..c1216fa 100644 --- a/mdadm.h +++ b/mdadm.h @@ -358,6 +358,7 @@ enum prefix_standard { enum bitmap_update { NoUpdate, NameUpdate, + NodeNumUpdate, }; /* structures read from config file */ diff --git a/super1.c b/super1.c index ea027aa..1f02265 100644 --- a/super1.c +++ b/super1.c @@ -135,6 +135,20 @@ struct misc_dev_info { |MD_FEATURE_NEW_OFFSET \ ) +/* return how many bytes are needed for bitmap, for cluster-md each node + * should have it's own bitmap */ +static unsigned int calc_bitmap_size(bitmap_super_t *bms, unsigned int boundary) +{ + unsigned long long bits, bytes; + + bits = __le64_to_cpu(bms->sync_size) / (__le32_to_cpu(bms->chunksize)>>9); + bytes = (bits+7) >> 3; + bytes += sizeof(bitmap_super_t); + bytes = ROUND_UP(bytes, boundary); + + return bytes; +} + static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb) { unsigned int disk_csum, csum; @@ -2203,6 +2217,7 @@ static int write_bitmap1(struct supertype *st, int fd, enum bitmap_update update int towrite, n; struct align_fd afd; unsigned int i = 0; + unsigned long long total_bm_space, bm_space_per_node; switch (update) { case NameUpdate: @@ -2212,6 +2227,28 @@ static int write_bitmap1(struct supertype *st, int fd, enum bitmap_update update strncpy((char *)bms->cluster_name, st->cluster_name, 64); } break; + case NodeNumUpdate: + /* cluster md only supports superblock 1.2 now */ + if (st->minor_version != 2) { + pr_err("Warning: cluster md only works with superblock 1.2\n"); + return -EINVAL; + } + + /* Each node has an independent bitmap, it is necessary to calculate the + * space is enough or not, first get how many bytes for the total bitmap */ + bm_space_per_node = calc_bitmap_size(bms, 4096); + + total_bm_space = 512 * (__le64_to_cpu(sb->data_offset) - __le64_to_cpu(sb->super_offset)); + total_bm_space = total_bm_space - 4096; /* leave another 4k for superblock */ + + if (bm_space_per_node * st->nodes > total_bm_space) { + pr_err("Warning: The max num of nodes can't exceed %llu\n", + total_bm_space / bm_space_per_node); + return -ENOMEM; + } + + bms->nodes = __cpu_to_le32(st->nodes); + break; case NoUpdate: default: break; -- 1.7.12.4
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor