]> git.proxmox.com Git - pve-qemu.git/blame - debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-isize-parameter.patch
update submodule and patches to 7.1.0
[pve-qemu.git] / debian / patches / pve / 0011-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>
5b15e2ec 13Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
c854115a 14---
60ae3775
SR
15 qemu-img.c | 28 +++++++++++++++++++++++++---
16 1 file changed, 25 insertions(+), 3 deletions(-)
c854115a
WB
17
18diff --git a/qemu-img.c b/qemu-img.c
5b15e2ec 19index 74afcb79ef..14594d44b6 100644
c854115a
WB
20--- a/qemu-img.c
21+++ b/qemu-img.c
5b15e2ec 22@@ -4827,11 +4827,13 @@ static int img_bitmap(int argc, char **argv)
c854115a
WB
23 #define C_OF 010
24 #define C_SKIP 020
25 #define C_OSIZE 040
26+#define C_ISIZE 0100
27
28 struct DdInfo {
29 unsigned int flags;
30 int64_t count;
31 int64_t osize;
32+ int64_t isize;
33 };
34
35 struct DdIo {
5b15e2ec 36@@ -4920,6 +4922,19 @@ static int img_dd_osize(const char *arg,
c854115a
WB
37 return 0;
38 }
39
40+static int img_dd_isize(const char *arg,
41+ struct DdIo *in, struct DdIo *out,
42+ struct DdInfo *dd)
43+{
60ae3775 44+ dd->isize = cvtnum("size", arg);
c854115a
WB
45+
46+ if (dd->isize < 0) {
c854115a
WB
47+ return 1;
48+ }
49+
50+ return 0;
51+}
52+
53 static int img_dd(int argc, char **argv)
54 {
55 int ret = 0;
5b15e2ec 56@@ -4934,12 +4949,14 @@ static int img_dd(int argc, char **argv)
c854115a
WB
57 int c, i;
58 const char *out_fmt = "raw";
59 const char *fmt = NULL;
60- int64_t size = 0;
61+ int64_t size = 0, readsize = 0;
62 int64_t block_count = 0, out_pos, in_pos;
63 bool force_share = false;
64 struct DdInfo dd = {
65 .flags = 0,
66 .count = 0,
67+ .osize = 0,
68+ .isize = -1,
69 };
70 struct DdIo in = {
71 .bsz = 512, /* Block size is by default 512 bytes */
5b15e2ec 72@@ -4961,6 +4978,7 @@ static int img_dd(int argc, char **argv)
c854115a
WB
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 },
77 { NULL, NULL, 0 }
78 };
79 const struct option long_options[] = {
5b15e2ec 80@@ -5157,9 +5175,10 @@ static int img_dd(int argc, char **argv)
c854115a
WB
81
82 in.buf = g_new(uint8_t, in.bsz);
83
84- for (out_pos = 0; in_pos < size; block_count++) {
85+ readsize = (dd.isize > 0) ? dd.isize : size;
86+ for (out_pos = 0; in_pos < readsize; block_count++) {
87 int in_ret, out_ret;
5b15e2ec
FE
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;
c854115a 90 if (blk1) {
5b15e2ec
FE
91 in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
92 if (in_ret == 0) {
93@@ -5168,6 +5187,9 @@ static int img_dd(int argc, char **argv)
c854115a 94 } else {
5b15e2ec 95 in_ret = read(STDIN_FILENO, in.buf, bytes);
c854115a
WB
96 if (in_ret == 0) {
97+ if (dd.isize == 0) {
98+ goto out;
99+ }
100 /* early EOF is considered an error */
101 error_report("Input ended unexpectedly");
102 ret = -1;