From: NeilBrown Date: Fri, 16 Oct 2009 06:02:34 +0000 (+1100) Subject: Grow: don't make 'blocks' too large during in-place reshape. X-Git-Tag: mdadm-3.1~13 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=eba7152931708db1d3049030e0a1ffa4ed174373 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 --- diff --git a/Grow.c b/Grow.c index c0fa5660..043e28ff 100644 --- a/Grow.c +++ b/Grow.c @@ -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);