]> git.proxmox.com Git - pve-qemu.git/blame - debian/patches/pve/0012-PVE-Up-qemu-img-dd-add-isize-parameter.patch
update to QEMU 5.1
[pve-qemu.git] / debian / patches / pve / 0012-PVE-Up-qemu-img-dd-add-isize-parameter.patch
CommitLineData
c854115a
WB
1From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2From: Wolfgang Bumiller <w.bumiller@proxmox.com>
83faa3fe
TL
3Date: Mon, 6 Apr 2020 12:16:41 +0200
4Subject: [PATCH] PVE: [Up] qemu-img dd: add isize parameter
c854115a
WB
5
6for writing small images from stdin to bigger ones
7
8In order to distinguish between an actually unexpected and
9an expected end of input.
10
11Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
b855dce7 12Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
c854115a 13---
60ae3775
SR
14 qemu-img.c | 28 +++++++++++++++++++++++++---
15 1 file changed, 25 insertions(+), 3 deletions(-)
c854115a
WB
16
17diff --git a/qemu-img.c b/qemu-img.c
60ae3775 18index af54d0896e..0f1d464392 100644
c854115a
WB
19--- a/qemu-img.c
20+++ b/qemu-img.c
60ae3775 21@@ -4820,11 +4820,13 @@ static int img_bitmap(int argc, char **argv)
c854115a
WB
22 #define C_OF 010
23 #define C_SKIP 020
24 #define C_OSIZE 040
25+#define C_ISIZE 0100
26
27 struct DdInfo {
28 unsigned int flags;
29 int64_t count;
30 int64_t osize;
31+ int64_t isize;
32 };
33
34 struct DdIo {
60ae3775 35@@ -4913,6 +4915,19 @@ static int img_dd_osize(const char *arg,
c854115a
WB
36 return 0;
37 }
38
39+static int img_dd_isize(const char *arg,
40+ struct DdIo *in, struct DdIo *out,
41+ struct DdInfo *dd)
42+{
60ae3775 43+ dd->isize = cvtnum("size", arg);
c854115a
WB
44+
45+ if (dd->isize < 0) {
c854115a
WB
46+ return 1;
47+ }
48+
49+ return 0;
50+}
51+
52 static int img_dd(int argc, char **argv)
53 {
54 int ret = 0;
60ae3775 55@@ -4927,12 +4942,14 @@ static int img_dd(int argc, char **argv)
c854115a
WB
56 int c, i;
57 const char *out_fmt = "raw";
58 const char *fmt = NULL;
59- int64_t size = 0;
60+ int64_t size = 0, readsize = 0;
61 int64_t block_count = 0, out_pos, in_pos;
62 bool force_share = false;
63 struct DdInfo dd = {
64 .flags = 0,
65 .count = 0,
66+ .osize = 0,
67+ .isize = -1,
68 };
69 struct DdIo in = {
70 .bsz = 512, /* Block size is by default 512 bytes */
60ae3775 71@@ -4954,6 +4971,7 @@ static int img_dd(int argc, char **argv)
c854115a
WB
72 { "of", img_dd_of, C_OF },
73 { "skip", img_dd_skip, C_SKIP },
74 { "osize", img_dd_osize, C_OSIZE },
75+ { "isize", img_dd_isize, C_ISIZE },
76 { NULL, NULL, 0 }
77 };
78 const struct option long_options[] = {
60ae3775 79@@ -5160,14 +5178,18 @@ static int img_dd(int argc, char **argv)
c854115a
WB
80
81 in.buf = g_new(uint8_t, in.bsz);
82
83- for (out_pos = 0; in_pos < size; block_count++) {
84+ readsize = (dd.isize > 0) ? dd.isize : size;
85+ for (out_pos = 0; in_pos < readsize; block_count++) {
86 int in_ret, out_ret;
87- size_t in_bsz = in_pos + in.bsz > size ? size - in_pos : in.bsz;
88+ size_t in_bsz = in_pos + in.bsz > readsize ? readsize - in_pos : in.bsz;
89 if (blk1) {
90 in_ret = blk_pread(blk1, in_pos, in.buf, in_bsz);
91 } else {
92 in_ret = read(STDIN_FILENO, in.buf, in_bsz);
93 if (in_ret == 0) {
94+ if (dd.isize == 0) {
95+ goto out;
96+ }
97 /* early EOF is considered an error */
98 error_report("Input ended unexpectedly");
99 ret = -1;