1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Wolfgang Bumiller <w.bumiller@proxmox.com>
3 Date: Mon, 6 Apr 2020 12:16:41 +0200
4 Subject: [PATCH] PVE: [Up] qemu-img dd: add isize parameter
6 for writing small images from stdin to bigger ones
8 In order to distinguish between an actually unexpected and
9 an expected end of input.
11 Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
12 Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
13 Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
15 qemu-img.c | 28 +++++++++++++++++++++++++---
16 1 file changed, 25 insertions(+), 3 deletions(-)
18 diff --git a/qemu-img.c b/qemu-img.c
19 index 221b9d6a16..c1306385a8 100644
22 @@ -4830,11 +4830,13 @@ static int img_bitmap(int argc, char **argv)
36 @@ -4923,6 +4925,19 @@ static int img_dd_osize(const char *arg,
40 +static int img_dd_isize(const char *arg,
41 + struct DdIo *in, struct DdIo *out,
44 + dd->isize = cvtnum("size", arg);
46 + if (dd->isize < 0) {
53 static int img_dd(int argc, char **argv)
56 @@ -4937,12 +4952,14 @@ static int img_dd(int argc, char **argv)
58 const char *out_fmt = "raw";
59 const char *fmt = NULL;
61 + int64_t size = 0, readsize = 0;
62 int64_t out_pos, in_pos;
63 bool force_share = false;
71 .bsz = 512, /* Block size is by default 512 bytes */
72 @@ -4964,6 +4981,7 @@ static int img_dd(int argc, char **argv)
73 { "of", img_dd_of, C_OF },
74 { "skip", img_dd_skip, C_SKIP },
75 { "osize", img_dd_osize, C_OSIZE },
76 + { "isize", img_dd_isize, C_ISIZE },
79 const struct option long_options[] = {
80 @@ -5160,9 +5178,10 @@ static int img_dd(int argc, char **argv)
82 in.buf = g_new(uint8_t, in.bsz);
84 - for (out_pos = 0; in_pos < size; ) {
85 + readsize = (dd.isize > 0) ? dd.isize : size;
86 + for (out_pos = 0; in_pos < readsize; ) {
88 - int bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz;
89 + int bytes = (in_pos + in.bsz > readsize) ? readsize - in_pos : in.bsz;
91 in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
93 @@ -5171,6 +5190,9 @@ static int img_dd(int argc, char **argv)
95 in_ret = read(STDIN_FILENO, in.buf, bytes);
97 + if (dd.isize == 0) {
100 /* early EOF is considered an error */
101 error_report("Input ended unexpectedly");