Files
pve-qemu-qoup/debian/patches/pve/0011-PVE-Up-qemu-img-dd-add-isize-parameter.patch
T

103 lines
3.1 KiB
Diff
Raw Normal View History

2018-02-23 10:31:40 +01:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
2020-04-07 16:53:19 +02:00
Date: Mon, 6 Apr 2020 12:16:41 +0200
Subject: [PATCH] PVE: [Up] qemu-img dd: add isize parameter
2018-02-23 10:31:40 +01:00
for writing small images from stdin to bigger ones
In order to distinguish between an actually unexpected and
an expected end of input.
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
2019-06-06 12:58:15 +02:00
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2022-10-14 14:07:13 +02:00
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
2018-02-23 10:31:40 +01:00
---
2020-08-20 10:42:45 +02:00
qemu-img.c | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
2018-02-23 10:31:40 +01:00
diff --git a/qemu-img.c b/qemu-img.c
2022-12-14 15:16:32 +01:00
index 221b9d6a16..c1306385a8 100644
2018-02-23 10:31:40 +01:00
--- a/qemu-img.c
+++ b/qemu-img.c
2022-12-14 15:16:32 +01:00
@@ -4830,11 +4830,13 @@ static int img_bitmap(int argc, char **argv)
2018-02-23 10:31:40 +01:00
#define C_OF 010
#define C_SKIP 020
#define C_OSIZE 040
+#define C_ISIZE 0100
struct DdInfo {
unsigned int flags;
int64_t count;
int64_t osize;
+ int64_t isize;
};
struct DdIo {
2022-12-14 15:16:32 +01:00
@@ -4923,6 +4925,19 @@ static int img_dd_osize(const char *arg,
2018-02-23 10:31:40 +01:00
return 0;
}
+static int img_dd_isize(const char *arg,
+ struct DdIo *in, struct DdIo *out,
+ struct DdInfo *dd)
+{
2020-08-20 10:42:45 +02:00
+ dd->isize = cvtnum("size", arg);
2018-02-23 10:31:40 +01:00
+
+ if (dd->isize < 0) {
+ return 1;
+ }
+
+ return 0;
+}
+
static int img_dd(int argc, char **argv)
{
int ret = 0;
2022-12-14 15:16:32 +01:00
@@ -4937,12 +4952,14 @@ static int img_dd(int argc, char **argv)
2018-02-23 10:31:40 +01:00
int c, i;
const char *out_fmt = "raw";
const char *fmt = NULL;
- int64_t size = 0;
+ int64_t size = 0, readsize = 0;
2022-12-14 15:16:32 +01:00
int64_t out_pos, in_pos;
2018-02-23 10:31:40 +01:00
bool force_share = false;
struct DdInfo dd = {
.flags = 0,
.count = 0,
+ .osize = 0,
+ .isize = -1,
};
struct DdIo in = {
.bsz = 512, /* Block size is by default 512 bytes */
2022-12-14 15:16:32 +01:00
@@ -4964,6 +4981,7 @@ static int img_dd(int argc, char **argv)
2018-02-23 10:31:40 +01:00
{ "of", img_dd_of, C_OF },
{ "skip", img_dd_skip, C_SKIP },
{ "osize", img_dd_osize, C_OSIZE },
+ { "isize", img_dd_isize, C_ISIZE },
{ NULL, NULL, 0 }
};
const struct option long_options[] = {
2022-12-14 15:16:32 +01:00
@@ -5160,9 +5178,10 @@ static int img_dd(int argc, char **argv)
2018-02-23 10:31:40 +01:00
in.buf = g_new(uint8_t, in.bsz);
2022-12-14 15:16:32 +01:00
- for (out_pos = 0; in_pos < size; ) {
2018-02-23 10:31:40 +01:00
+ readsize = (dd.isize > 0) ? dd.isize : size;
2022-12-14 15:16:32 +01:00
+ for (out_pos = 0; in_pos < readsize; ) {
2018-02-23 10:31:40 +01:00
int in_ret, out_ret;
2022-10-14 14:07:13 +02:00
- int bytes = (in_pos + in.bsz > size) ? size - in_pos : in.bsz;
+ int bytes = (in_pos + in.bsz > readsize) ? readsize - in_pos : in.bsz;
2018-02-23 10:31:40 +01:00
if (blk1) {
2022-10-14 14:07:13 +02:00
in_ret = blk_pread(blk1, in_pos, bytes, in.buf, 0);
if (in_ret == 0) {
2022-12-14 15:16:32 +01:00
@@ -5171,6 +5190,9 @@ static int img_dd(int argc, char **argv)
2018-02-23 10:31:40 +01:00
} else {
2022-10-14 14:07:13 +02:00
in_ret = read(STDIN_FILENO, in.buf, bytes);
2018-02-23 10:31:40 +01:00
if (in_ret == 0) {
+ if (dd.isize == 0) {
+ goto out;
+ }
/* early EOF is considered an error */
error_report("Input ended unexpectedly");
ret = -1;