From a252c078142d938b716f8c8e9c5866bedb630a18 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Tue, 10 May 2011 17:35:41 +1000 Subject: [PATCH] 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 --- Build.c | 4 ++++ Create.c | 4 ++++ mdadm.8.in | 3 +++ mdadm.c | 4 ++-- 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, ¶m)) { 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, ¶m)) { 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;