Grow: don't make 'blocks' too large during in-place reshape.

On small (test) arrays, multiplying by 16 can make the 'chunk' size
larger than half the array, which is a problem.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2009-10-16 17:02:34 +11:00
parent 521f349cb0
commit eba7152931
1 changed files with 7 additions and 3 deletions

10
Grow.c
View File

@ -892,9 +892,13 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
/* LCM == product / GCD */
blocks = ochunk/512 * nchunk/512 * odata * ndata / a;
if (ndata == odata)
blocks *= 16;
else
if (ndata == odata) {
/* Make 'blocks' bigger for better throughput, but
* not so big that we reject it below.
*/
if (blocks * 32 < sra->component_size)
blocks *= 16;
} else
fprintf(stderr, Name ": Need to backup %luK of critical "
"section..\n", blocks/2);