From: NeilBrown Date: Thu, 4 Oct 2012 06:34:20 +0000 (+1000) Subject: Allow parse_size to return 0. X-Git-Tag: mdadm-3.3-rc1~201 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=822e393a050510b0002bdfb1b0554fa8d7860a99 Allow parse_size to return 0. We will shortly introduce --data-offset= which is allowed to be zero. We will want to use parse_size() so it needs to be able to return '0' without it being an error. So define INVALID_SECTORS to be an impossible value (currently '1') and return and test for it consistently. Signed-off-by: NeilBrown --- diff --git a/mdadm.c b/mdadm.c index 870e5376..51c57c5d 100644 --- a/mdadm.c +++ b/mdadm.c @@ -372,7 +372,8 @@ int main(int argc, char *argv[]) exit(2); } s.chunk = parse_size(optarg); - if (s.chunk < 8 || (s.chunk&1)) { + if (s.chunk == INVALID_SECTORS || + s.chunk < 8 || (s.chunk&1)) { pr_err("invalid chunk/rounding value: %s\n", optarg); exit(2); @@ -426,7 +427,8 @@ int main(int argc, char *argv[]) s.size = MAX_SIZE; else { s.size = parse_size(optarg); - if (s.size < 8) { + if (s.size == INVALID_SECTORS || + s.size < 8) { pr_err("invalid size: %s\n", optarg); exit(2); @@ -446,7 +448,8 @@ int main(int argc, char *argv[]) array_size = MAX_SIZE; else { array_size = parse_size(optarg); - if (array_size <= 0) { + if (array_size == 0 || + array_size == INVALID_SECTORS) { pr_err("invalid array size: %s\n", optarg); exit(2); @@ -1062,7 +1065,8 @@ int main(int argc, char *argv[]) case O(BUILD,BitmapChunk): case O(CREATE,BitmapChunk): /* bitmap chunksize */ s.bitmap_chunk = parse_size(optarg); - if (s.bitmap_chunk <= 0 || + if (s.bitmap_chunk == 0 || + s.bitmap_chunk == INVALID_SECTORS || s.bitmap_chunk & (s.bitmap_chunk - 1)) { pr_err("invalid bitmap chunksize: %s\n", optarg); diff --git a/mdadm.h b/mdadm.h index 6980bfb8..6db7714a 100644 --- a/mdadm.h +++ b/mdadm.h @@ -1460,4 +1460,10 @@ char *xstrdup(const char *str); * In those cases with use MAX_SIZE */ #define MAX_SIZE 1 + +/* We want to use unsigned numbers for sector counts, but need + * a value for 'invalid'. Use '1'. + */ +#define INVALID_SECTORS 1 + extern int __offroot; diff --git a/util.c b/util.c index fad72cc9..4bd07e1b 100644 --- a/util.c +++ b/util.c @@ -194,7 +194,7 @@ unsigned long long parse_size(char *size) * followed by 'K', 'M', or 'G'. * Without a suffix, K is assumed. * Number returned is in sectors (half-K) - * 0 returned on error. + * INVALID_SECTORS returned on error. */ char *c; long long s = strtoll(size, &c, 10); @@ -215,9 +215,9 @@ unsigned long long parse_size(char *size) break; } } else - s = 0; + s = INVALID_SECTORS; if (*c) - s = 0; + s = INVALID_SECTORS; return s; }