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 <neilb@suse.de>
This commit is contained in:
parent
66ccd96ebc
commit
bb7295f15e
11
Create.c
11
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)
|
||||
|
|
|
@ -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'.
|
||||
|
|
6
super0.c
6
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)
|
||||
|
|
6
super1.c
6
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)
|
||||
|
|
Loading…
Reference in New Issue