summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-10-04 16:34:20 +1000
committerNeilBrown <neilb@suse.de>2012-10-04 16:34:20 +1000
commit822e393a050510b0002bdfb1b0554fa8d7860a99 (patch)
tree80799a3b855960a91c5aaa0bb8471a18988952a1
parent7103b9b88d8c27989e17c80d7296eda97370dc1e (diff)
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 <neilb@suse.de>
-rw-r--r--mdadm.c12
-rw-r--r--mdadm.h6
-rw-r--r--util.c6
3 files changed, 17 insertions, 7 deletions
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;
}