summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Create.c11
-rw-r--r--super-ddf.c7
-rw-r--r--super0.c6
-rw-r--r--super1.c6
4 files changed, 19 insertions, 11 deletions
diff --git a/Create.c b/Create.c
index bbd25e55..2e3d7235 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 c62d9ca2..41ff0053 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 832072d8..4f7110d0 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 be059167..9299322f 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)