summaryrefslogtreecommitdiff
path: root/mdadm.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-10-04 16:34:21 +1000
committerNeilBrown <neilb@suse.de>2012-10-04 16:34:21 +1000
commit40c9a66a5c1a89d621daa2184888e66952b06a71 (patch)
treebf7dae47d213cc7629f112880a9c18cb509d8415 /mdadm.c
parent83cd1e97cbc0c4749561b72864dbaaed3a014123 (diff)
Add --data-offset flag for Create and Grow
This can be used to over-ride the automatic assignment of data offset. For --create, it is useful to re-create old arrays where different defaults applied. For --grow it may be able to force a reshape in the reverse direction. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'mdadm.c')
-rw-r--r--mdadm.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/mdadm.c b/mdadm.c
index 51c57c5d..5f395714 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -49,6 +49,7 @@ int main(int argc, char *argv[])
int i;
unsigned long long array_size = 0;
+ unsigned long long data_offset = INVALID_SECTORS;
struct mddev_ident ident;
char *configfile = NULL;
int devmode = 0;
@@ -457,6 +458,21 @@ int main(int argc, char *argv[])
}
continue;
+ case O(CREATE,DataOffset):
+ case O(GROW,DataOffset):
+ if (data_offset != INVALID_SECTORS) {
+ fprintf(stderr, Name ": data-offset may only be specified one. "
+ "Second value is %s.\n", optarg);
+ exit(2);
+ }
+ data_offset = parse_size(optarg);
+ if (data_offset == INVALID_SECTORS) {
+ fprintf(stderr, Name ": invalid data-offset: %s\n",
+ optarg);
+ exit(2);
+ }
+ continue;
+
case O(GROW,'l'):
case O(CREATE,'l'):
case O(BUILD,'l'): /* set raid level*/
@@ -1345,7 +1361,7 @@ int main(int argc, char *argv[])
rv = Create(ss, devlist->devname,
ident.name, ident.uuid_set ? ident.uuid : NULL,
devs_found-1, devlist->next,
- &s, &c);
+ &s, &c, data_offset);
break;
case MISC:
if (devmode == 'E') {
@@ -1469,7 +1485,8 @@ int main(int argc, char *argv[])
else if (s.size > 0 || s.raiddisks || s.layout_str != NULL
|| s.chunk != 0 || s.level != UnSet) {
rv = Grow_reshape(devlist->devname, mdfd,
- devlist->next, &c, &s);
+ devlist->next,
+ data_offset, &c, &s);
} else if (array_size == 0)
pr_err("no changes to --grow\n");
break;