summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-05-10 17:35:41 +1000
committerNeilBrown <neilb@suse.de>2011-05-10 17:35:41 +1000
commita252c078142d938b716f8c8e9c5866bedb630a18 (patch)
treebecccd055127d4e201da118e103615653354cda6
parentdec18cae724516353ef911f5bed6c3bfee5845f1 (diff)
Create: allow chunksize to be non-power-of-2.
RAID0 has accepted chunksizes that are not a power of 2 since 2.6.30. So it time mdadm allowed that to be used. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Build.c4
-rw-r--r--Create.c4
-rw-r--r--mdadm.8.in3
-rw-r--r--mdadm.c4
4 files changed, 13 insertions, 2 deletions
diff --git a/Build.c b/Build.c
index cb9f01e3..4338e190 100644
--- a/Build.c
+++ b/Build.c
@@ -254,6 +254,10 @@ int Build(char *mddev, int chunk, int level, int layout,
if (ioctl(mdfd, RUN_ARRAY, &param)) {
fprintf(stderr, Name ": RUN_ARRAY failed: %s\n",
strerror(errno));
+ if (chunk & (chunk-1)) {
+ fprintf(stderr, " : Problem may be that chunk size"
+ " is not a power of 2\n");
+ }
goto abort;
}
} else {
diff --git a/Create.c b/Create.c
index 9ee09280..ef60244a 100644
--- a/Create.c
+++ b/Create.c
@@ -930,6 +930,10 @@ int Create(struct supertype *st, char *mddev,
if (ioctl(mdfd, RUN_ARRAY, &param)) {
fprintf(stderr, Name ": RUN_ARRAY failed: %s\n",
strerror(errno));
+ if (info.array.chunk_size & (info.array.chunk_size-1)) {
+ fprintf(stderr, " : Problem may be that "
+ "chunk size is not a power of 2\n");
+ }
ioctl(mdfd, STOP_ARRAY, NULL);
goto abort;
}
diff --git a/mdadm.8.in b/mdadm.8.in
index d9b51473..3fbfcce8 100644
--- a/mdadm.8.in
+++ b/mdadm.8.in
@@ -484,6 +484,9 @@ array is 512KB. To ensure compatibility with earlier versions, the
default when Building and array with no persistent metadata is 64KB.
This is only meaningful for RAID0, RAID4, RAID5, RAID6, and RAID10.
+RAID4, RAID5, RAID6, and RAID10 require the chunk size to be a power
+of 2. In any case it must be a multiple of 4KB.
+
A suffix of 'M' or 'G' can be given to indicate Megabytes or
Gigabytes respectively.
diff --git a/mdadm.c b/mdadm.c
index 662822d1..d55e9cfa 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -361,12 +361,12 @@ int main(int argc, char *argv[])
exit(2);
}
chunk = parse_size(optarg);
- if (chunk < 8 || ((chunk-1)&chunk)) {
+ if (chunk < 8 || (chunk&1)) {
fprintf(stderr, Name ": invalid chunk/rounding value: %s\n",
optarg);
exit(2);
}
- /* Covert sectors to K */
+ /* Convert sectors to K */
chunk /= 2;
continue;