From bb7295f15e02d8cd8b52de14f40c1d7e10555cc9 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Wed, 9 Mar 2011 18:27:19 +1100 Subject: [PATCH] Fix chunksize defaulting. the new code for defaulting chunksizes didn't work quite right - default was set to late in super1/super0/ddf - defaults would over-ride values of '0' imposed by some levels - default value wasn't applied to size properly. Signed-off-by: NeilBrown --- Create.c | 11 +++++++++-- super-ddf.c | 7 ++++--- super0.c | 6 +++--- super1.c | 6 +++--- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Create.c b/Create.c index bbd25e5..2e3d723 100644 --- a/Create.c +++ b/Create.c @@ -230,9 +230,11 @@ int Create(struct supertype *st, char *mddev, case 10: case 6: case 0: - if (chunk == 0 || chunk == UnSet) + if (chunk == 0 || chunk == UnSet) { + chunk = UnSet; do_default_chunk = 1; /* chunk will be set later */ + } break; case LEVEL_LINEAR: /* a chunksize of zero 0s perfectly valid (and preferred) since 2.6.16 */ @@ -257,12 +259,17 @@ int Create(struct supertype *st, char *mddev, return 1; } - if (size && chunk) + if (size && chunk && chunk != UnSet) size &= ~(unsigned long long)(chunk - 1); newsize = size * 2; if (st && ! st->ss->validate_geometry(st, level, layout, raiddisks, &chunk, size*2, NULL, &newsize, verbose>=0)) return 1; + + if (chunk) { + newsize &= ~(unsigned long long)(chunk*2 - 1); + size &= ~(unsigned long long)(chunk - 1); + } if (size == 0) { size = newsize / 2; if (size && verbose > 0) diff --git a/super-ddf.c b/super-ddf.c index c62d9ca..41ff005 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -2566,6 +2566,10 @@ static int validate_geometry_ddf(struct supertype *st, * If given BVDs, we make an SVD, changing all the GUIDs in the process. */ + if (chunk && *chunk == UnSet) + *chunk = DEFAULT_CHUNK; + + if (level == LEVEL_CONTAINER) { /* Must be a fresh device to add to a container */ return validate_geometry_ddf_container(st, level, layout, @@ -2734,9 +2738,6 @@ static int validate_geometry_ddf_bvd(struct supertype *st, if (!ddf) return 0; - if (chunk && (*chunk == 0 || *chunk == UnSet)) - *chunk = DEFAULT_CHUNK; - if (!dev) { /* General test: make sure there is space for * 'raiddisks' device extents of size 'size'. diff --git a/super0.c b/super0.c index 832072d..4f7110d 100644 --- a/super0.c +++ b/super0.c @@ -1113,12 +1113,12 @@ static int validate_geometry0(struct supertype *st, int level, fprintf(stderr, Name ": 0.90 metadata supports at most 2 terrabytes per device\n"); return 0; } + if (chunk && *chunk == UnSet) + *chunk = DEFAULT_CHUNK; + if (!subdev) return 1; - if (chunk && (*chunk == 0 || *chunk == UnSet)) - *chunk = DEFAULT_CHUNK; - fd = open(subdev, O_RDONLY|O_EXCL, 0); if (fd < 0) { if (verbose) diff --git a/super1.c b/super1.c index be05916..9299322 100644 --- a/super1.c +++ b/super1.c @@ -1666,12 +1666,12 @@ static int validate_geometry1(struct supertype *st, int level, fprintf(stderr, Name ": 1.x metadata does not support containers\n"); return 0; } + if (chunk && *chunk == UnSet) + *chunk = DEFAULT_CHUNK; + if (!subdev) return 1; - if (chunk && (*chunk == 0 || *chunk == UnSet)) - *chunk = DEFAULT_CHUNK; - fd = open(subdev, O_RDONLY|O_EXCL, 0); if (fd < 0) { if (verbose)