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)
downloadmdadm-a252c078142d938b716f8c8e9c5866bedb630a18.tar.gz
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 cb9f01e..4338e19 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 9ee0928..ef60244 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 d9b5147..3fbfcce 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 662822d..d55e9cf 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;