|
@@ -1912,6 +1912,8 @@ static int convert_do_copy(ImgConvertState *s)
|
|
|
return s->ret;
|
|
|
}
|
|
|
|
|
|
+#define MAX_BUF_SECTORS 32768
|
|
|
+
|
|
|
static int img_convert(int argc, char **argv)
|
|
|
{
|
|
|
int c, bs_i, flags, src_flags = 0;
|
|
@@ -2008,8 +2010,12 @@ static int img_convert(int argc, char **argv)
|
|
|
int64_t sval;
|
|
|
|
|
|
sval = cvtnum(optarg);
|
|
|
- if (sval < 0) {
|
|
|
- error_report("Invalid minimum zero buffer size for sparse output specified");
|
|
|
+ if (sval < 0 || sval & (BDRV_SECTOR_SIZE - 1) ||
|
|
|
+ sval / BDRV_SECTOR_SIZE > MAX_BUF_SECTORS) {
|
|
|
+ error_report("Invalid buffer size for sparse output specified. "
|
|
|
+ "Valid sizes are multiples of %llu up to %llu. Select "
|
|
|
+ "0 to disable sparse detection (fully allocates output).",
|
|
|
+ BDRV_SECTOR_SIZE, MAX_BUF_SECTORS * BDRV_SECTOR_SIZE);
|
|
|
goto fail_getopt;
|
|
|
}
|
|
|
|
|
@@ -2297,9 +2303,9 @@ static int img_convert(int argc, char **argv)
|
|
|
}
|
|
|
|
|
|
/* increase bufsectors from the default 4096 (2M) if opt_transfer
|
|
|
- * or discard_alignment of the out_bs is greater. Limit to 32768 (16MB)
|
|
|
- * as maximum. */
|
|
|
- s.buf_sectors = MIN(32768,
|
|
|
+ * or discard_alignment of the out_bs is greater. Limit to
|
|
|
+ * MAX_BUF_SECTORS as maximum which is currently 32768 (16MB). */
|
|
|
+ s.buf_sectors = MIN(MAX_BUF_SECTORS,
|
|
|
MAX(s.buf_sectors,
|
|
|
MAX(out_bs->bl.opt_transfer >> BDRV_SECTOR_BITS,
|
|
|
out_bs->bl.pdiscard_alignment >>
|