|
@@ -70,6 +70,7 @@ enum {
|
|
|
OPTION_PREALLOCATION = 265,
|
|
|
OPTION_SHRINK = 266,
|
|
|
OPTION_SALVAGE = 267,
|
|
|
+ OPTION_TARGET_IS_ZERO = 268,
|
|
|
};
|
|
|
|
|
|
typedef enum OutputFormat {
|
|
@@ -1984,10 +1985,9 @@ static int convert_do_copy(ImgConvertState *s)
|
|
|
int64_t sector_num = 0;
|
|
|
|
|
|
/* Check whether we have zero initialisation or can get it efficiently */
|
|
|
- if (s->target_is_new && s->min_sparse && !s->target_has_backing) {
|
|
|
+ if (!s->has_zero_init && s->target_is_new && s->min_sparse &&
|
|
|
+ !s->target_has_backing) {
|
|
|
s->has_zero_init = bdrv_has_zero_init(blk_bs(s->target));
|
|
|
- } else {
|
|
|
- s->has_zero_init = false;
|
|
|
}
|
|
|
|
|
|
if (!s->has_zero_init && !s->target_has_backing &&
|
|
@@ -2086,6 +2086,7 @@ static int img_convert(int argc, char **argv)
|
|
|
{"force-share", no_argument, 0, 'U'},
|
|
|
{"target-image-opts", no_argument, 0, OPTION_TARGET_IMAGE_OPTS},
|
|
|
{"salvage", no_argument, 0, OPTION_SALVAGE},
|
|
|
+ {"target-is-zero", no_argument, 0, OPTION_TARGET_IS_ZERO},
|
|
|
{0, 0, 0, 0}
|
|
|
};
|
|
|
c = getopt_long(argc, argv, ":hf:O:B:Cco:l:S:pt:T:qnm:WU",
|
|
@@ -2209,6 +2210,14 @@ static int img_convert(int argc, char **argv)
|
|
|
case OPTION_TARGET_IMAGE_OPTS:
|
|
|
tgt_image_opts = true;
|
|
|
break;
|
|
|
+ case OPTION_TARGET_IS_ZERO:
|
|
|
+ /*
|
|
|
+ * The user asserting that the target is blank has the
|
|
|
+ * same effect as the target driver supporting zero
|
|
|
+ * initialisation.
|
|
|
+ */
|
|
|
+ s.has_zero_init = true;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2247,6 +2256,11 @@ static int img_convert(int argc, char **argv)
|
|
|
warn_report("This will become an error in future QEMU versions.");
|
|
|
}
|
|
|
|
|
|
+ if (s.has_zero_init && !skip_create) {
|
|
|
+ error_report("--target-is-zero requires use of -n flag");
|
|
|
+ goto fail_getopt;
|
|
|
+ }
|
|
|
+
|
|
|
s.src_num = argc - optind - 1;
|
|
|
out_filename = s.src_num >= 1 ? argv[argc - 1] : NULL;
|
|
|
|
|
@@ -2380,6 +2394,12 @@ static int img_convert(int argc, char **argv)
|
|
|
}
|
|
|
s.target_has_backing = (bool) out_baseimg;
|
|
|
|
|
|
+ if (s.has_zero_init && s.target_has_backing) {
|
|
|
+ error_report("Cannot use --target-is-zero when the destination "
|
|
|
+ "image has a backing file");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
if (s.src_num > 1 && out_baseimg) {
|
|
|
error_report("Having a backing file for the target makes no sense when "
|
|
|
"concatenating multiple input images");
|