1
The following changes since commit b2f7a038bb4c4fc5ce6b8486e8513dfd97665e2a:
1
The following changes since commit 75ee62ac606bfc9eb59310b9446df3434bf6e8c2:
2
2
3
Merge remote-tracking branch 'remotes/rth/tags/pull-softfloat-20181104' into staging (2018-11-05 10:32:49 +0000)
3
Merge remote-tracking branch 'remotes/ehabkost-gl/tags/x86-next-pull-request' into staging (2020-12-17 18:53:36 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
git://repo.or.cz/qemu/kevin.git tags/for-upstream
7
git://repo.or.cz/qemu/kevin.git tags/for-upstream
8
8
9
for you to fetch changes up to 1240ac558d348f6c7a5752b1a57c1da58e4efe3e:
9
for you to fetch changes up to be7c5ddd0d80e2d6cf8e3ef12c049851d28d9c26:
10
10
11
include: Add a comment to explain the origin of sizes' lookup table (2018-11-05 15:29:59 +0100)
11
block/vpc: Use sizeof() instead of HEADER_SIZE for footer size (2020-12-18 12:43:30 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Block layer patches:
14
Block layer patches:
15
15
16
- auto-read-only option to fix commit job when used with -blockdev
16
- Add qemu-storage-daemon documentation
17
- Fix help text related qemu-iotests failure (by improving the help text
17
- hw/block/nand: Decommission the NAND museum
18
and updating the reference output)
18
- vpc: Clean up some buffer abuse
19
- quorum: Add missing checks when adding/removing child nodes
19
- nfs: fix int overflow in nfs_client_open_qdict
20
- Don't take address of fields in packed structs
20
- Several iotests fixes
21
- vvfat: Fix crash when reporting error about too many files in directory
22
21
23
----------------------------------------------------------------
22
----------------------------------------------------------------
24
Alberto Garcia (7):
23
Markus Armbruster (9):
25
block: replace "discard" literal with BDRV_OPT_DISCARD macro
24
block/vpc: Make vpc_open() read the full dynamic header
26
qcow2: Get the request alignment for encrypted images from QCryptoBlock
25
block/vpc: Don't abuse the footer buffer as BAT sector buffer
27
quorum: Remove quorum_err()
26
block/vpc: Don't abuse the footer buffer for dynamic header
28
quorum: Return an error if the blkverify mode has invalid settings
27
block/vpc: Make vpc_checksum() take void *
29
iotest: Test the blkverify mode of the Quorum driver
28
block/vpc: Pad VHDDynDiskHeader, replace uint8_t[] buffers
30
quorum: Forbid adding children in blkverify mode
29
block/vpc: Use sizeof() instead of 1024 for dynamic header size
31
iotest: Test x-blockdev-change on a Quorum
30
block/vpc: Pad VHDFooter, replace uint8_t[] buffers
31
block/vpc: Pass footer buffers as VHDFooter * instead of uint8_t *
32
block/vpc: Use sizeof() instead of HEADER_SIZE for footer size
32
33
33
Cleber Rosa (1):
34
Max Reitz (1):
34
iotests: make 083 specific to raw
35
iotests/210: Fix reference output
35
36
36
Daniel P. Berrangé (1):
37
Peter Lieven (1):
37
crypto: initialize sector size even when opening with no IO flag
38
block/nfs: fix int overflow in nfs_client_open_qdict
38
39
39
Kevin Wolf (12):
40
Philippe Mathieu-Daudé (1):
40
vpc: Don't leak opts in vpc_open()
41
hw/block/nand: Decommission the NAND museum
41
block: Update flags in bdrv_set_read_only()
42
block: Add auto-read-only option
43
rbd: Close image in qemu_rbd_open() error path
44
block: Require auto-read-only for existing fallbacks
45
nbd: Support auto-read-only option
46
file-posix: Support auto-read-only option
47
curl: Support auto-read-only option
48
gluster: Support auto-read-only option
49
iscsi: Support auto-read-only option
50
block: Make auto-read-only=on default for -drive
51
qemu-iotests: Test auto-read-only with -drive and -blockdev
52
42
53
Leonid Bloch (2):
43
Stefan Hajnoczi (3):
54
vdi: Use a literal number of bytes for DEFAULT_CLUSTER_SIZE
44
docs: generate qemu-storage-daemon-qmp-ref(7) man page
55
include: Add a comment to explain the origin of sizes' lookup table
45
docs: add qemu-storage-daemon(1) man page
46
MAINTAINERS: add Kevin Wolf as storage daemon maintainer
56
47
57
Li Qiang (1):
48
Vladimir Sementsov-Ogievskiy (2):
58
block: change some function return type to bool
49
iotests: make _filter_qom_path more strict
50
iotests:172: use _filter_qom_path
59
51
60
Max Reitz (5):
52
docs/interop/conf.py | 2 +
61
option: Make option help nicer to read
53
docs/interop/index.rst | 1 +
62
chardev: Indent list of chardevs
54
docs/interop/qemu-storage-daemon-qmp-ref.rst | 13 +++
63
qdev-monitor: Make device options help nicer
55
docs/meson.build | 1 +
64
object: Make option help nicer to read
56
docs/tools/conf.py | 2 +
65
fw_cfg: Drop newline in @file description
57
docs/tools/index.rst | 1 +
58
docs/tools/qemu-storage-daemon.rst | 148 ++++++++++++++++++++++++++
59
block/nfs.c | 2 +-
60
block/vpc.c | 146 +++++++++++++------------
61
hw/block/nand.c | 12 +--
62
MAINTAINERS | 9 ++
63
storage-daemon/qapi/qapi-schema.json | 3 +
64
tests/qemu-iotests/172 | 2 +-
65
tests/qemu-iotests/172.out | 152 +++++++++++++--------------
66
tests/qemu-iotests/186.out | 56 +++++-----
67
tests/qemu-iotests/210.out | 2 +-
68
tests/qemu-iotests/common.filter | 2 +-
69
17 files changed, 361 insertions(+), 193 deletions(-)
70
create mode 100644 docs/interop/qemu-storage-daemon-qmp-ref.rst
71
create mode 100644 docs/tools/qemu-storage-daemon.rst
66
72
67
Peter Maydell (5):
68
block/qcow2: Don't take address of fields in packed structs
69
block/qcow: Don't take address of fields in packed structs
70
block/qcow2-bitmap: Don't take address of fields in packed structs
71
block/vhdx: Don't take address of fields in packed structs
72
block/vdi: Don't take address of fields in packed structs
73
73
74
Stefan Weil (1):
75
qemu-io-cmds: Fix two format strings
76
77
Thomas Huth (1):
78
block/vvfat: Fix crash when reporting error about too many files in directory
79
80
qapi/block-core.json | 7 +
81
block/vhdx.h | 12 +-
82
include/block/block.h | 5 +-
83
include/qemu/option.h | 2 +-
84
include/qemu/units.h | 18 +
85
include/sysemu/block-backend.h | 6 +-
86
block.c | 60 ++-
87
block/block-backend.c | 8 +-
88
block/bochs.c | 17 +-
89
block/cloop.c | 16 +-
90
block/curl.c | 8 +-
91
block/dmg.c | 16 +-
92
block/file-posix.c | 19 +-
93
block/gluster.c | 12 +-
94
block/iscsi.c | 8 +-
95
block/nbd-client.c | 10 +-
96
block/qcow.c | 18 +-
97
block/qcow2-bitmap.c | 24 +-
98
block/qcow2.c | 66 +--
99
block/quorum.c | 45 +-
100
block/rbd.c | 14 +-
101
block/vdi.c | 68 +--
102
block/vhdx-endian.c | 118 ++---
103
block/vhdx-log.c | 4 +-
104
block/vhdx.c | 18 +-
105
block/vpc.c | 2 +
106
block/vvfat.c | 15 +-
107
blockdev.c | 3 +-
108
chardev/char.c | 2 +-
109
crypto/block-qcow.c | 2 +
110
qdev-monitor.c | 13 +-
111
qemu-img.c | 4 +-
112
qemu-io-cmds.c | 4 +-
113
util/qemu-option.c | 32 +-
114
vl.c | 15 +-
115
tests/qemu-iotests/081 | 116 +++++
116
tests/qemu-iotests/081.out | 70 +++
117
tests/qemu-iotests/082.out | 956 ++++++++++++++++++++---------------------
118
tests/qemu-iotests/083 | 2 +-
119
tests/qemu-iotests/232 | 147 +++++++
120
tests/qemu-iotests/232.out | 59 +++
121
tests/qemu-iotests/group | 1 +
122
42 files changed, 1266 insertions(+), 776 deletions(-)
123
create mode 100755 tests/qemu-iotests/232
124
create mode 100644 tests/qemu-iotests/232.out
125
diff view generated by jsdifflib
Deleted patch
1
From: Thomas Huth <thuth@redhat.com>
2
1
3
When using the vvfat driver with a directory that contains too many files,
4
QEMU currently crashes. This can be triggered like this for example:
5
6
mkdir /tmp/vvfattest
7
cd /tmp/vvfattest
8
for ((x=0;x<=513;x++)); do mkdir $x; done
9
qemu-system-x86_64 -drive \
10
file.driver=vvfat,file.dir=.,read-only=on,media=cdrom
11
12
Seems like read_directory() is changing the mapping->path variable. Make
13
sure we use the right pointer instead.
14
15
Signed-off-by: Thomas Huth <thuth@redhat.com>
16
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
17
---
18
block/vvfat.c | 4 ++--
19
1 file changed, 2 insertions(+), 2 deletions(-)
20
21
diff --git a/block/vvfat.c b/block/vvfat.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/block/vvfat.c
24
+++ b/block/vvfat.c
25
@@ -XXX,XX +XXX,XX @@ static int init_directories(BDRVVVFATState* s,
26
mapping = array_get(&(s->mapping), i);
27
28
if (mapping->mode & MODE_DIRECTORY) {
29
+ char *path = mapping->path;
30
mapping->begin = cluster;
31
if(read_directory(s, i)) {
32
- error_setg(errp, "Could not read directory %s",
33
- mapping->path);
34
+ error_setg(errp, "Could not read directory %s", path);
35
return -1;
36
}
37
mapping = array_get(&(s->mapping), i);
38
--
39
2.19.1
40
41
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
Signed-off-by: Alberto Garcia <berto@igalia.com>
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
5
---
6
block.c | 6 +++---
7
1 file changed, 3 insertions(+), 3 deletions(-)
8
9
diff --git a/block.c b/block.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/block.c
12
+++ b/block.c
13
@@ -XXX,XX +XXX,XX @@ QemuOptsList bdrv_runtime_opts = {
14
.help = "try to optimize zero writes (off, on, unmap)",
15
},
16
{
17
- .name = "discard",
18
+ .name = BDRV_OPT_DISCARD,
19
.type = QEMU_OPT_STRING,
20
.help = "discard operation (ignore/off, unmap/on)",
21
},
22
@@ -XXX,XX +XXX,XX @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,
23
}
24
}
25
26
- discard = qemu_opt_get(opts, "discard");
27
+ discard = qemu_opt_get(opts, BDRV_OPT_DISCARD);
28
if (discard != NULL) {
29
if (bdrv_parse_discard_flags(discard, &bs->open_flags) != 0) {
30
error_setg(errp, "Invalid discard option");
31
@@ -XXX,XX +XXX,XX @@ int bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
32
33
update_flags_from_options(&reopen_state->flags, opts);
34
35
- discard = qemu_opt_get_del(opts, "discard");
36
+ discard = qemu_opt_get_del(opts, BDRV_OPT_DISCARD);
37
if (discard != NULL) {
38
if (bdrv_parse_discard_flags(discard, &reopen_state->flags) != 0) {
39
error_setg(errp, "Invalid discard option");
40
--
41
2.19.1
42
43
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Max Reitz <mreitz@redhat.com>
2
2
3
There is no good reason why there should be a newline in this
3
Commit 8b1170012b1 has added a global maximum disk length for the block
4
description, so remove it.
4
layer, so the error message when creating an overly large disk has
5
changed.
5
6
7
Fixes: 8b1170012b1de6649c66ac1887f4df7e312abf3b
8
("block: introduce BDRV_MAX_LENGTH")
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Message-Id: <20201214175158.299919-1-mreitz@redhat.com>
8
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
11
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
---
13
---
11
vl.c | 2 +-
14
tests/qemu-iotests/210.out | 2 +-
12
1 file changed, 1 insertion(+), 1 deletion(-)
15
1 file changed, 1 insertion(+), 1 deletion(-)
13
16
14
diff --git a/vl.c b/vl.c
17
diff --git a/tests/qemu-iotests/210.out b/tests/qemu-iotests/210.out
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/vl.c
19
--- a/tests/qemu-iotests/210.out
17
+++ b/vl.c
20
+++ b/tests/qemu-iotests/210.out
18
@@ -XXX,XX +XXX,XX @@ static QemuOptsList qemu_fw_cfg_opts = {
21
@@ -XXX,XX +XXX,XX @@ Job failed: The requested file size is too large
19
}, {
22
=== Resize image with invalid sizes ===
20
.name = "file",
23
21
.type = QEMU_OPT_STRING,
24
{"execute": "block_resize", "arguments": {"node-name": "node1", "size": 9223372036854775296}}
22
- .help = "Sets the name of the file from which\n"
25
-{"error": {"class": "GenericError", "desc": "The requested file size is too large"}}
23
+ .help = "Sets the name of the file from which "
26
+{"error": {"class": "GenericError", "desc": "Required too big image size, it must be not greater than 9223372035781033984"}}
24
"the fw_cfg blob will be loaded",
27
{"execute": "block_resize", "arguments": {"node-name": "node1", "size": 9223372036854775808}}
25
}, {
28
{"error": {"class": "GenericError", "desc": "Invalid parameter type for 'size', expected: integer"}}
26
.name = "string",
29
{"execute": "block_resize", "arguments": {"node-name": "node1", "size": 18446744073709551104}}
27
--
30
--
28
2.19.1
31
2.29.2
29
32
30
33
diff view generated by jsdifflib
1
From: Leonid Bloch <lbloch@janustech.com>
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
2
3
The lookup table for power-of-two sizes was added in commit 540b8492618eb
3
This is the QEMU equivalent of this Linux commit (but 7 years later):
4
for the purpose of having convenient shortcuts for these sizes in cases
4
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f7025a43a9da2
5
when the literal number has to be present at compile time, and
6
expressions as '(1 * KiB)' can not be used. One such case is the
7
stringification of sizes. Beyond that, it is convenient to use these
8
shortcuts for all power-of-two sizes, even if they don't have to be
9
literal numbers.
10
5
11
Despite its convenience, this table introduced 55 lines of "dumb" code,
6
The MTD subsystem has its own small museum of ancient NANDs
12
the purpose and origin of which are obscure without reading the message
7
in a form of the CONFIG_MTD_NAND_MUSEUM_IDS configuration option.
13
of the commit which introduced it. This patch fixes that by adding a
8
The museum contains stone age NANDs with 256 bytes pages, as well
14
comment to the code itself with a brief explanation for the reasoning
9
as iron age NANDs with 512 bytes per page and up to 8MiB page size.
15
behind this table. This comment includes the short AWK script that
16
generated the table, so that anyone who's interested could make sure
17
that the values in it are correct (otherwise these values look as if
18
they were typed manually).
19
10
20
Signed-off-by: Leonid Bloch <lbloch@janustech.com>
11
It is with great sorrow that I inform you that the museum is being
12
decommissioned. The MTD subsystem is out of budget for Kconfig
13
options and already has too many of them, and there is a general
14
kernel trend to simplify the configuration menu.
15
16
We remove the stone age exhibits along with closing the museum,
17
but some of the iron age ones are transferred to the regular NAND
18
depot. Namely, only those which have unique device IDs are
19
transferred, and the ones which have conflicting device IDs are
20
removed.
21
22
The machine using this device are:
23
- axis-dev88
24
- tosa (via tc6393xb_init)
25
- spitz based (akita, borzoi, terrier)
26
27
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
28
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
29
Message-Id: <20201214002620.342384-1-f4bug@amsat.org>
30
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
21
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
31
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
22
---
32
---
23
include/qemu/units.h | 18 ++++++++++++++++++
33
hw/block/nand.c | 12 +-----------
24
1 file changed, 18 insertions(+)
34
1 file changed, 1 insertion(+), 11 deletions(-)
25
35
26
diff --git a/include/qemu/units.h b/include/qemu/units.h
36
diff --git a/hw/block/nand.c b/hw/block/nand.c
27
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
28
--- a/include/qemu/units.h
38
--- a/hw/block/nand.c
29
+++ b/include/qemu/units.h
39
+++ b/hw/block/nand.c
30
@@ -XXX,XX +XXX,XX @@
40
@@ -XXX,XX +XXX,XX @@ static void mem_and(uint8_t *dest, const uint8_t *src, size_t n)
31
#define PiB (INT64_C(1) << 50)
41
# define ADDR_SHIFT        16
32
#define EiB (INT64_C(1) << 60)
42
# include "nand.c"
33
43
34
+/*
44
-/* Information based on Linux drivers/mtd/nand/nand_ids.c */
35
+ * The following lookup table is intended to be used when a literal string of
45
+/* Information based on Linux drivers/mtd/nand/raw/nand_ids.c */
36
+ * the number of bytes is required (for example if it needs to be stringified).
46
static const struct {
37
+ * It can also be used for generic shortcuts of power-of-two sizes.
47
int size;
38
+ * This table is generated using the AWK script below:
48
int width;
39
+ *
49
@@ -XXX,XX +XXX,XX @@ static const struct {
40
+ * BEGIN {
50
} nand_flash_ids[0x100] = {
41
+ * suffix="KMGTPE";
51
[0 ... 0xff] = { 0 },
42
+ * for(i=10; i<64; i++) {
52
43
+ * val=2**i;
53
- [0x6e] = { 1,    8,    8, 4, 0 },
44
+ * s=substr(suffix, int(i/10), 1);
54
- [0x64] = { 2,    8,    8, 4, 0 },
45
+ * n=2**(i%10);
55
[0x6b] = { 4,    8,    9, 4, 0 },
46
+ * pad=21-int(log(n)/log(10));
56
- [0xe8] = { 1,    8,    8, 4, 0 },
47
+ * printf("#define S_%d%siB %*d\n", n, s, pad, val);
57
- [0xec] = { 1,    8,    8, 4, 0 },
48
+ * }
58
- [0xea] = { 2,    8,    8, 4, 0 },
49
+ * }
59
- [0xd5] = { 4,    8,    9, 4, 0 },
50
+ */
60
[0xe3] = { 4,    8,    9, 4, 0 },
51
+
61
[0xe5] = { 4,    8,    9, 4, 0 },
52
#define S_1KiB 1024
62
[0xd6] = { 8,    8,    9, 4, 0 },
53
#define S_2KiB 2048
63
-
54
#define S_4KiB 4096
64
- [0x39] = { 8,    8,    9, 4, 0 },
65
[0xe6] = { 8,    8,    9, 4, 0 },
66
- [0x49] = { 8,    16,    9, 4, NAND_BUSWIDTH_16 },
67
- [0x59] = { 8,    16,    9, 4, NAND_BUSWIDTH_16 },
68
69
[0x33] = { 16,    8,    9, 5, 0 },
70
[0x73] = { 16,    8,    9, 5, 0 },
55
--
71
--
56
2.19.1
72
2.29.2
57
73
58
74
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Peter Lieven <pl@kamp.de>
2
2
3
Following the example of qemu_opts_print_help(), indent all entries in
3
nfs_client_open returns the file size in sectors. This effectively
4
the list of character devices.
4
makes it impossible to open files larger than 1TB.
5
5
6
Signed-off-by: Max Reitz <mreitz@redhat.com>
6
Fixes: c22a03454544c2a08f1107c5cc8481a5574533d5
7
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
7
Cc: qemu-stable@nongnu.org
8
Signed-off-by: Peter Lieven <pl@kamp.de>
9
Message-Id: <20201209121735.16437-1-pl@kamp.de>
10
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
---
12
---
10
chardev/char.c | 2 +-
13
block/nfs.c | 2 +-
11
1 file changed, 1 insertion(+), 1 deletion(-)
14
1 file changed, 1 insertion(+), 1 deletion(-)
12
15
13
diff --git a/chardev/char.c b/chardev/char.c
16
diff --git a/block/nfs.c b/block/nfs.c
14
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
15
--- a/chardev/char.c
18
--- a/block/nfs.c
16
+++ b/chardev/char.c
19
+++ b/block/nfs.c
17
@@ -XXX,XX +XXX,XX @@ help_string_append(const char *name, void *opaque)
20
@@ -XXX,XX +XXX,XX @@ static int64_t nfs_client_open_qdict(NFSClient *client, QDict *options,
21
int flags, int open_flags, Error **errp)
18
{
22
{
19
GString *str = opaque;
23
BlockdevOptionsNfs *opts;
20
24
- int ret;
21
- g_string_append_printf(str, "\n%s", name);
25
+ int64_t ret;
22
+ g_string_append_printf(str, "\n %s", name);
26
23
}
27
opts = nfs_options_qdict_to_qapi(options, errp);
24
28
if (opts == NULL) {
25
static const char *chardev_alias_translate(const char *name)
26
--
29
--
27
2.19.1
30
2.29.2
28
31
29
32
diff view generated by jsdifflib
1
From: Leonid Bloch <lbloch@janustech.com>
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
2
3
If an expression is used to define DEFAULT_CLUSTER_SIZE, when compiled,
3
Although individual qemu-storage-daemon QMP commands are identical to
4
it will be embedded as a literal expression in the binary (as the
4
QEMU QMP commands, qemu-storage-daemon only supports a subset of QEMU's
5
default value) because it is stringified to mark the size of the default
5
QMP commands. Generate a manual page of just the commands supported by
6
value. Now this is fixed by using a defined number to define this value.
6
qemu-storage-daemon so that users know exactly what is available in
7
qemu-storage-daemon.
7
8
8
Signed-off-by: Leonid Bloch <lbloch@janustech.com>
9
Add an h1 heading in storage-daemon/qapi/qapi-schema.json so that
9
Reviewed-by: Stefan Weil <sw@weilnetz.de>
10
block-core.json is at the h2 heading level.
11
12
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
13
Message-Id: <20201209103802.350848-2-stefanha@redhat.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
14
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
---
15
---
12
block/vdi.c | 4 ++--
16
docs/interop/conf.py | 2 ++
13
1 file changed, 2 insertions(+), 2 deletions(-)
17
docs/interop/index.rst | 1 +
18
docs/interop/qemu-storage-daemon-qmp-ref.rst | 13 +++++++++++++
19
docs/meson.build | 1 +
20
storage-daemon/qapi/qapi-schema.json | 3 +++
21
5 files changed, 20 insertions(+)
22
create mode 100644 docs/interop/qemu-storage-daemon-qmp-ref.rst
14
23
15
diff --git a/block/vdi.c b/block/vdi.c
24
diff --git a/docs/interop/conf.py b/docs/interop/conf.py
16
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
17
--- a/block/vdi.c
26
--- a/docs/interop/conf.py
18
+++ b/block/vdi.c
27
+++ b/docs/interop/conf.py
28
@@ -XXX,XX +XXX,XX @@ man_pages = [
29
[], 7),
30
('qemu-qmp-ref', 'qemu-qmp-ref', 'QEMU QMP Reference Manual',
31
[], 7),
32
+ ('qemu-storage-daemon-qmp-ref', 'qemu-storage-daemon-qmp-ref',
33
+ 'QEMU Storage Daemon QMP Reference Manual', [], 7),
34
]
35
diff --git a/docs/interop/index.rst b/docs/interop/index.rst
36
index XXXXXXX..XXXXXXX 100644
37
--- a/docs/interop/index.rst
38
+++ b/docs/interop/index.rst
39
@@ -XXX,XX +XXX,XX @@ Contents:
40
qemu-ga
41
qemu-ga-ref
42
qemu-qmp-ref
43
+ qemu-storage-daemon-qmp-ref
44
vhost-user
45
vhost-user-gpu
46
vhost-vdpa
47
diff --git a/docs/interop/qemu-storage-daemon-qmp-ref.rst b/docs/interop/qemu-storage-daemon-qmp-ref.rst
48
new file mode 100644
49
index XXXXXXX..XXXXXXX
50
--- /dev/null
51
+++ b/docs/interop/qemu-storage-daemon-qmp-ref.rst
19
@@ -XXX,XX +XXX,XX @@
52
@@ -XXX,XX +XXX,XX @@
20
#define BLOCK_OPT_STATIC "static"
53
+QEMU Storage Daemon QMP Reference Manual
21
54
+========================================
22
#define SECTOR_SIZE 512
55
+
23
-#define DEFAULT_CLUSTER_SIZE (1 * MiB)
56
+..
24
+#define DEFAULT_CLUSTER_SIZE S_1MiB
57
+ TODO: the old Texinfo manual used to note that this manual
25
58
+ is GPL-v2-or-later. We should make that reader-visible
26
#if defined(CONFIG_VDI_DEBUG)
59
+ both here and in our Sphinx manuals more generally.
27
#define VDI_DEBUG 1
60
+
28
@@ -XXX,XX +XXX,XX @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
61
+..
29
goto fail;
62
+ TODO: display the QEMU version, both here and in our Sphinx manuals
30
} else if (header.block_size != DEFAULT_CLUSTER_SIZE) {
63
+ more generally.
31
error_setg(errp, "unsupported VDI image (block size %" PRIu32
64
+
32
- " is not %" PRIu64 ")",
65
+.. qapi-doc:: storage-daemon/qapi/qapi-schema.json
33
+ " is not %" PRIu32 ")",
66
diff --git a/docs/meson.build b/docs/meson.build
34
header.block_size, DEFAULT_CLUSTER_SIZE);
67
index XXXXXXX..XXXXXXX 100644
35
ret = -ENOTSUP;
68
--- a/docs/meson.build
36
goto fail;
69
+++ b/docs/meson.build
70
@@ -XXX,XX +XXX,XX @@ if build_docs
71
'qemu-ga.8': (have_tools ? 'man8' : ''),
72
'qemu-ga-ref.7': 'man7',
73
'qemu-qmp-ref.7': 'man7',
74
+ 'qemu-storage-daemon-qmp-ref.7': (have_tools ? 'man7' : ''),
75
},
76
'tools': {
77
'qemu-img.1': (have_tools ? 'man1' : ''),
78
diff --git a/storage-daemon/qapi/qapi-schema.json b/storage-daemon/qapi/qapi-schema.json
79
index XXXXXXX..XXXXXXX 100644
80
--- a/storage-daemon/qapi/qapi-schema.json
81
+++ b/storage-daemon/qapi/qapi-schema.json
82
@@ -XXX,XX +XXX,XX @@
83
84
{ 'include': '../../qapi/pragma.json' }
85
86
+##
87
+# = Block devices
88
+##
89
{ 'include': '../../qapi/block-core.json' }
90
{ 'include': '../../qapi/block-export.json' }
91
{ 'include': '../../qapi/char.json' }
37
--
92
--
38
2.19.1
93
2.29.2
39
94
40
95
diff view generated by jsdifflib
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
3
Document the qemu-storage-daemon tool. Most of the command-line options
4
are identical to their QEMU counterparts. Perhaps Sphinx hxtool
5
integration could be extended to extract documentation for individual
6
command-line options so they can be shared. For now the
7
qemu-storage-daemon simply refers to the qemu(1) man page where the
8
command-line options are identical.
9
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
11
Message-Id: <20201209103802.350848-3-stefanha@redhat.com>
1
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2
Reviewed-by: Eric Blake <eblake@redhat.com>
3
---
13
---
4
tests/qemu-iotests/232 | 147 +++++++++++++++++++++++++++++++++++++
14
docs/tools/conf.py | 2 +
5
tests/qemu-iotests/232.out | 59 +++++++++++++++
15
docs/tools/index.rst | 1 +
6
tests/qemu-iotests/group | 1 +
16
docs/tools/qemu-storage-daemon.rst | 148 +++++++++++++++++++++++++++++
7
3 files changed, 207 insertions(+)
17
3 files changed, 151 insertions(+)
8
create mode 100755 tests/qemu-iotests/232
18
create mode 100644 docs/tools/qemu-storage-daemon.rst
9
create mode 100644 tests/qemu-iotests/232.out
19
10
20
diff --git a/docs/tools/conf.py b/docs/tools/conf.py
11
diff --git a/tests/qemu-iotests/232 b/tests/qemu-iotests/232
21
index XXXXXXX..XXXXXXX 100644
12
new file mode 100755
22
--- a/docs/tools/conf.py
13
index XXXXXXX..XXXXXXX
23
+++ b/docs/tools/conf.py
14
--- /dev/null
24
@@ -XXX,XX +XXX,XX @@ html_theme_options['description'] = \
15
+++ b/tests/qemu-iotests/232
25
man_pages = [
16
@@ -XXX,XX +XXX,XX @@
26
('qemu-img', 'qemu-img', u'QEMU disk image utility',
17
+#!/bin/bash
27
['Fabrice Bellard'], 1),
18
+#
28
+ ('qemu-storage-daemon', 'qemu-storage-daemon', u'QEMU storage daemon',
19
+# Test for auto-read-only
29
+ [], 1),
20
+#
30
('qemu-nbd', 'qemu-nbd', u'QEMU Disk Network Block Device Server',
21
+# Copyright (C) 2018 Red Hat, Inc.
31
['Anthony Liguori <anthony@codemonkey.ws>'], 8),
22
+#
32
('qemu-pr-helper', 'qemu-pr-helper', 'QEMU persistent reservation helper',
23
+# This program is free software; you can redistribute it and/or modify
33
diff --git a/docs/tools/index.rst b/docs/tools/index.rst
24
+# it under the terms of the GNU General Public License as published by
34
index XXXXXXX..XXXXXXX 100644
25
+# the Free Software Foundation; either version 2 of the License, or
35
--- a/docs/tools/index.rst
26
+# (at your option) any later version.
36
+++ b/docs/tools/index.rst
27
+#
37
@@ -XXX,XX +XXX,XX @@ Contents:
28
+# This program is distributed in the hope that it will be useful,
38
:maxdepth: 2
29
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
39
30
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
40
qemu-img
31
+# GNU General Public License for more details.
41
+ qemu-storage-daemon
32
+#
42
qemu-nbd
33
+# You should have received a copy of the GNU General Public License
43
qemu-pr-helper
34
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
44
qemu-trace-stap
35
+#
45
diff --git a/docs/tools/qemu-storage-daemon.rst b/docs/tools/qemu-storage-daemon.rst
36
+
37
+# creator
38
+owner=kwolf@redhat.com
39
+
40
+seq=`basename $0`
41
+echo "QA output created by $seq"
42
+
43
+here=`pwd`
44
+status=1    # failure is the default!
45
+
46
+_cleanup()
47
+{
48
+ _cleanup_test_img
49
+ rm -f $TEST_IMG.snap
50
+}
51
+trap "_cleanup; exit \$status" 0 1 2 3 15
52
+
53
+# get standard environment, filters and checks
54
+. ./common.rc
55
+. ./common.filter
56
+
57
+_supported_fmt generic
58
+_supported_proto file
59
+_supported_os Linux
60
+
61
+function do_run_qemu()
62
+{
63
+ echo Testing: "$@"
64
+ (
65
+ if ! test -t 0; then
66
+ while read cmd; do
67
+ echo $cmd
68
+ done
69
+ fi
70
+ echo quit
71
+ ) | $QEMU -nographic -monitor stdio -nodefaults "$@"
72
+ echo
73
+}
74
+
75
+function run_qemu()
76
+{
77
+ do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qemu | _filter_hmp |
78
+ _filter_generated_node_ids | _filter_imgfmt
79
+}
80
+
81
+function run_qemu_info_block()
82
+{
83
+ echo "info block -n" | run_qemu "$@" | grep -e "(file" -e "QEMU_PROG"
84
+}
85
+
86
+size=128M
87
+
88
+_make_test_img $size
89
+
90
+echo
91
+echo "=== -drive with read-write image: read-only/auto-read-only combinations ==="
92
+echo
93
+
94
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on,auto-read-only=off
95
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on,auto-read-only=on
96
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on
97
+echo
98
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off,auto-read-only=off
99
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off,auto-read-only=on
100
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off
101
+echo
102
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,auto-read-only=off
103
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,auto-read-only=on
104
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none
105
+
106
+echo
107
+echo "=== -drive with read-only image: read-only/auto-read-only combinations ==="
108
+echo
109
+
110
+chmod a-w $TEST_IMG
111
+
112
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on,auto-read-only=off
113
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on,auto-read-only=on
114
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=on
115
+echo
116
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off,auto-read-only=off
117
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off,auto-read-only=on
118
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,read-only=off
119
+echo
120
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,auto-read-only=off
121
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none,auto-read-only=on
122
+run_qemu_info_block -drive driver=file,file="$TEST_IMG",if=none
123
+
124
+echo
125
+echo "=== -blockdev with read-write image: read-only/auto-read-only combinations ==="
126
+echo
127
+
128
+chmod a+w $TEST_IMG
129
+
130
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on,auto-read-only=off
131
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on,auto-read-only=on
132
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on
133
+echo
134
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off,auto-read-only=off
135
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off,auto-read-only=on
136
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off
137
+echo
138
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,auto-read-only=off
139
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,auto-read-only=on
140
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0
141
+
142
+echo
143
+echo "=== -blockdev with read-only image: read-only/auto-read-only combinations ==="
144
+echo
145
+
146
+chmod a-w $TEST_IMG
147
+
148
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on,auto-read-only=off
149
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on,auto-read-only=on
150
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=on
151
+echo
152
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off,auto-read-only=off
153
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off,auto-read-only=on
154
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,read-only=off
155
+echo
156
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,auto-read-only=off
157
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0,auto-read-only=on
158
+run_qemu_info_block -blockdev driver=file,filename="$TEST_IMG",node-name=node0
159
+
160
+# success, all done
161
+echo "*** done"
162
+rm -f $seq.full
163
+status=0
164
diff --git a/tests/qemu-iotests/232.out b/tests/qemu-iotests/232.out
165
new file mode 100644
46
new file mode 100644
166
index XXXXXXX..XXXXXXX
47
index XXXXXXX..XXXXXXX
167
--- /dev/null
48
--- /dev/null
168
+++ b/tests/qemu-iotests/232.out
49
+++ b/docs/tools/qemu-storage-daemon.rst
169
@@ -XXX,XX +XXX,XX @@
50
@@ -XXX,XX +XXX,XX @@
170
+QA output created by 232
51
+QEMU Storage Daemon
171
+Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=134217728
52
+===================
172
+
53
+
173
+=== -drive with read-write image: read-only/auto-read-only combinations ===
54
+Synopsis
174
+
55
+--------
175
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
56
+
176
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
57
+**qemu-storage-daemon** [options]
177
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
58
+
178
+
59
+Description
179
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
60
+-----------
180
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
61
+
181
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
62
+qemu-storage-daemon provides disk image functionality from QEMU, qemu-img, and
182
+
63
+qemu-nbd in a long-running process controlled via QMP commands without running
183
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
64
+a virtual machine. It can export disk images, run block job operations, and
184
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
65
+perform other disk-related operations. The daemon is controlled via a QMP
185
+NODE_NAME: TEST_DIR/t.IMGFMT (file)
66
+monitor and initial configuration from the command-line.
186
+
67
+
187
+=== -drive with read-only image: read-only/auto-read-only combinations ===
68
+The daemon offers the following subset of QEMU features:
188
+
69
+
189
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
70
+* Block nodes
190
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
71
+* Block jobs
191
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
72
+* Block exports
192
+
73
+* Throttle groups
193
+QEMU_PROG: -drive driver=file,file=TEST_DIR/t.IMGFMT,if=none,read-only=off,auto-read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
74
+* Character devices
194
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
75
+* Crypto and secrets
195
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
76
+* QMP
196
+
77
+* IOThreads
197
+QEMU_PROG: -drive driver=file,file=TEST_DIR/t.IMGFMT,if=none,auto-read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
78
+
198
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
79
+Commands can be sent over a QEMU Monitor Protocol (QMP) connection. See the
199
+NODE_NAME: TEST_DIR/t.IMGFMT (file, read-only)
80
+:manpage:`qemu-storage-daemon-qmp-ref(7)` manual page for a description of the
200
+
81
+commands.
201
+=== -blockdev with read-write image: read-only/auto-read-only combinations ===
82
+
202
+
83
+The daemon runs until it is stopped using the ``quit`` QMP command or
203
+node0: TEST_DIR/t.IMGFMT (file, read-only)
84
+SIGINT/SIGHUP/SIGTERM.
204
+node0: TEST_DIR/t.IMGFMT (file, read-only)
85
+
205
+node0: TEST_DIR/t.IMGFMT (file, read-only)
86
+**Warning:** Never modify images in use by a running virtual machine or any
206
+
87
+other process; this may destroy the image. Also, be aware that querying an
207
+node0: TEST_DIR/t.IMGFMT (file)
88
+image that is being modified by another process may encounter inconsistent
208
+node0: TEST_DIR/t.IMGFMT (file)
89
+state.
209
+node0: TEST_DIR/t.IMGFMT (file)
90
+
210
+
91
+Options
211
+node0: TEST_DIR/t.IMGFMT (file)
92
+-------
212
+node0: TEST_DIR/t.IMGFMT (file)
93
+
213
+node0: TEST_DIR/t.IMGFMT (file)
94
+.. program:: qemu-storage-daemon
214
+
95
+
215
+=== -blockdev with read-only image: read-only/auto-read-only combinations ===
96
+Standard options:
216
+
97
+
217
+node0: TEST_DIR/t.IMGFMT (file, read-only)
98
+.. option:: -h, --help
218
+node0: TEST_DIR/t.IMGFMT (file, read-only)
99
+
219
+node0: TEST_DIR/t.IMGFMT (file, read-only)
100
+ Display help and exit
220
+
101
+
221
+QEMU_PROG: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0,read-only=off,auto-read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
102
+.. option:: -V, --version
222
+node0: TEST_DIR/t.IMGFMT (file, read-only)
103
+
223
+QEMU_PROG: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0,read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
104
+ Display version information and exit
224
+
105
+
225
+QEMU_PROG: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0,auto-read-only=off: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
106
+.. option:: -T, --trace [[enable=]PATTERN][,events=FILE][,file=FILE]
226
+node0: TEST_DIR/t.IMGFMT (file, read-only)
107
+
227
+QEMU_PROG: -blockdev driver=file,filename=TEST_DIR/t.IMGFMT,node-name=node0: Could not open 'TEST_DIR/t.IMGFMT': Permission denied
108
+ .. include:: ../qemu-option-trace.rst.inc
228
+*** done
109
+
229
diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group
110
+.. option:: --blockdev BLOCKDEVDEF
230
index XXXXXXX..XXXXXXX 100644
111
+
231
--- a/tests/qemu-iotests/group
112
+ is a block node definition. See the :manpage:`qemu(1)` manual page for a
232
+++ b/tests/qemu-iotests/group
113
+ description of block node properties and the :manpage:`qemu-block-drivers(7)`
233
@@ -XXX,XX +XXX,XX @@
114
+ manual page for a description of driver-specific parameters.
234
227 auto quick
115
+
235
229 auto quick
116
+.. option:: --chardev CHARDEVDEF
236
231 auto quick
117
+
237
+232 auto quick
118
+ is a character device definition. See the :manpage:`qemu(1)` manual page for
119
+ a description of character device properties. A common character device
120
+ definition configures a UNIX domain socket::
121
+
122
+ --chardev socket,id=char1,path=/tmp/qmp.sock,server,nowait
123
+
124
+.. option:: --export [type=]nbd,id=<id>,node-name=<node-name>[,name=<export-name>][,writable=on|off][,bitmap=<name>]
125
+ --export [type=]vhost-user-blk,id=<id>,node-name=<node-name>,addr.type=unix,addr.path=<socket-path>[,writable=on|off][,logical-block-size=<block-size>][,num-queues=<num-queues>]
126
+ --export [type=]vhost-user-blk,id=<id>,node-name=<node-name>,addr.type=fd,addr.str=<fd>[,writable=on|off][,logical-block-size=<block-size>][,num-queues=<num-queues>]
127
+
128
+ is a block export definition. ``node-name`` is the block node that should be
129
+ exported. ``writable`` determines whether or not the export allows write
130
+ requests for modifying data (the default is off).
131
+
132
+ The ``nbd`` export type requires ``--nbd-server`` (see below). ``name`` is
133
+ the NBD export name. ``bitmap`` is the name of a dirty bitmap reachable from
134
+ the block node, so the NBD client can use NBD_OPT_SET_META_CONTEXT with the
135
+ metadata context name "qemu:dirty-bitmap:BITMAP" to inspect the bitmap.
136
+
137
+ The ``vhost-user-blk`` export type takes a vhost-user socket address on which
138
+ it accept incoming connections. Both
139
+ ``addr.type=unix,addr.path=<socket-path>`` for UNIX domain sockets and
140
+ ``addr.type=fd,addr.str=<fd>`` for file descriptor passing are supported.
141
+ ``logical-block-size`` sets the logical block size in bytes (the default is
142
+ 512). ``num-queues`` sets the number of virtqueues (the default is 1).
143
+
144
+.. option:: --monitor MONITORDEF
145
+
146
+ is a QMP monitor definition. See the :manpage:`qemu(1)` manual page for
147
+ a description of QMP monitor properties. A common QMP monitor definition
148
+ configures a monitor on character device ``char1``::
149
+
150
+ --monitor chardev=char1
151
+
152
+.. option:: --nbd-server addr.type=inet,addr.host=<host>,addr.port=<port>[,tls-creds=<id>][,tls-authz=<id>][,max-connections=<n>]
153
+ --nbd-server addr.type=unix,addr.path=<path>[,tls-creds=<id>][,tls-authz=<id>][,max-connections=<n>]
154
+
155
+ is a server for NBD exports. Both TCP and UNIX domain sockets are supported.
156
+ TLS encryption can be configured using ``--object`` tls-creds-* and authz-*
157
+ secrets (see below).
158
+
159
+ To configure an NBD server on UNIX domain socket path ``/tmp/nbd.sock``::
160
+
161
+ --nbd-server addr.type=unix,addr.path=/tmp/nbd.sock
162
+
163
+.. option:: --object help
164
+ --object <type>,help
165
+ --object <type>[,<property>=<value>...]
166
+
167
+ is a QEMU user creatable object definition. List object types with ``help``.
168
+ List object properties with ``<type>,help``. See the :manpage:`qemu(1)`
169
+ manual page for a description of the object properties.
170
+
171
+Examples
172
+--------
173
+Launch the daemon with QMP monitor socket ``qmp.sock`` so clients can execute
174
+QMP commands::
175
+
176
+ $ qemu-storage-daemon \
177
+ --chardev socket,path=qmp.sock,server,nowait,id=char1 \
178
+ --monitor chardev=char1
179
+
180
+Export raw image file ``disk.img`` over NBD UNIX domain socket ``nbd.sock``::
181
+
182
+ $ qemu-storage-daemon \
183
+ --blockdev driver=file,node-name=disk,filename=disk.img \
184
+ --nbd-server addr.type=unix,addr.path=nbd.sock \
185
+ --export type=nbd,id=export,node-name=disk,writable=on
186
+
187
+Export a qcow2 image file ``disk.qcow2`` as a vhosts-user-blk device over UNIX
188
+domain socket ``vhost-user-blk.sock``::
189
+
190
+ $ qemu-storage-daemon \
191
+ --blockdev driver=file,node-name=file,filename=disk.qcow2 \
192
+ --blockdev driver=qcow2,node-name=qcow2,file=file \
193
+ --export type=vhost-user-blk,id=export,addr.type=unix,addr.path=vhost-user-blk.sock,node-name=qcow2
194
+
195
+See also
196
+--------
197
+
198
+:manpage:`qemu(1)`, :manpage:`qemu-block-drivers(7)`, :manpage:`qemu-storage-daemon-qmp-ref(7)`
238
--
199
--
239
2.19.1
200
2.29.2
240
201
241
202
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Stefan Hajnoczi <stefanha@redhat.com>
2
2
3
Just like in qemu_opts_print_help(), print the object name as a caption
3
The MAINTAINERS file was not updated when the storage daemon was merged.
4
instead of on every single line, indent all options, add angle brackets
5
around types, and align the descriptions after 24 characters.
6
4
7
Also, indent every object name in the list of available objects.
5
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
8
6
Acked-by: Kevin Wolf <kwolf@redhat.com>
9
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
10
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
Message-Id: <20201209103802.350848-4-stefanha@redhat.com>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12
---
10
---
13
vl.c | 13 ++++++++++---
11
MAINTAINERS | 9 +++++++++
14
1 file changed, 10 insertions(+), 3 deletions(-)
12
1 file changed, 9 insertions(+)
15
13
16
diff --git a/vl.c b/vl.c
14
diff --git a/MAINTAINERS b/MAINTAINERS
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/vl.c
16
--- a/MAINTAINERS
19
+++ b/vl.c
17
+++ b/MAINTAINERS
20
@@ -XXX,XX +XXX,XX @@ static bool object_create_initial(const char *type, QemuOpts *opts)
18
@@ -XXX,XX +XXX,XX @@ F: qobject/block-qdict.c
21
list = object_class_get_list_sorted(TYPE_USER_CREATABLE, false);
19
F: tests/check-block-qdict.c
22
for (l = list; l != NULL; l = l->next) {
20
T: git https://repo.or.cz/qemu/kevin.git block
23
ObjectClass *oc = OBJECT_CLASS(l->data);
21
24
- printf("%s\n", object_class_get_name(oc));
22
+Storage daemon
25
+ printf(" %s\n", object_class_get_name(oc));
23
+M: Kevin Wolf <kwolf@redhat.com>
26
}
24
+L: qemu-block@nongnu.org
27
g_slist_free(list);
25
+S: Supported
28
exit(0);
26
+F: storage-daemon/
29
@@ -XXX,XX +XXX,XX @@ static bool object_create_initial(const char *type, QemuOpts *opts)
27
+F: docs/interop/qemu-storage-daemon-qmp-ref.rst
30
}
28
+F: docs/tools/qemu-storage-daemon.rst
31
29
+T: git https://repo.or.cz/qemu/kevin.git block
32
str = g_string_new(NULL);
30
+
33
- g_string_append_printf(str, "%s.%s=%s", type,
31
Block I/O path
34
- prop->name, prop->type);
32
M: Stefan Hajnoczi <stefanha@redhat.com>
35
+ g_string_append_printf(str, " %s=<%s>", prop->name, prop->type);
33
M: Fam Zheng <fam@euphon.net>
36
if (prop->description) {
37
+ if (str->len < 24) {
38
+ g_string_append_printf(str, "%*s", 24 - (int)str->len, "");
39
+ }
40
g_string_append_printf(str, " - %s", prop->description);
41
}
42
g_ptr_array_add(array, g_string_free(str, false));
43
}
44
g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0);
45
+ if (array->len > 0) {
46
+ printf("%s options:\n", type);
47
+ } else {
48
+ printf("There are no options for %s.\n", type);
49
+ }
50
for (i = 0; i < array->len; i++) {
51
printf("%s\n", (char *)array->pdata[i]);
52
}
53
--
34
--
54
2.19.1
35
2.29.2
55
36
56
37
diff view generated by jsdifflib
1
From: Li Qiang <liq3ea@163.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
Signed-off-by: Li Qiang <liq3ea@163.com>
3
According to original commit, that added this filter (627f607e3dddb2),
4
Reviewed-by: Alberto Garcia <berto@igalia.com>
4
the problematic thing in qom path is device[NUMBER], not the whole
5
path. Seems that tracking the other parts of the path in iotest output
6
is not bad. Let's make _filter_qom_path stricter.
7
8
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
9
Message-Id: <20201216095205.526235-2-vsementsov@virtuozzo.com>
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
---
11
---
7
include/sysemu/block-backend.h | 6 +++---
12
tests/qemu-iotests/186.out | 56 ++++++++++++++++----------------
8
block/block-backend.c | 8 ++++----
13
tests/qemu-iotests/common.filter | 2 +-
9
2 files changed, 7 insertions(+), 7 deletions(-)
14
2 files changed, 29 insertions(+), 29 deletions(-)
10
15
11
diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h
16
diff --git a/tests/qemu-iotests/186.out b/tests/qemu-iotests/186.out
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/include/sysemu/block-backend.h
18
--- a/tests/qemu-iotests/186.out
14
+++ b/include/sysemu/block-backend.h
19
+++ b/tests/qemu-iotests/186.out
15
@@ -XXX,XX +XXX,XX @@ BlockErrorAction blk_get_error_action(BlockBackend *blk, bool is_read,
20
@@ -XXX,XX +XXX,XX @@ Testing: -device floppy
16
int error);
21
QEMU X.Y.Z monitor - type 'help' for more information
17
void blk_error_action(BlockBackend *blk, BlockErrorAction action,
22
(qemu) info block
18
bool is_read, int error);
23
/machine/peripheral-anon/device[1]: [not inserted]
19
-int blk_is_read_only(BlockBackend *blk);
24
- Attached to: PATH
20
-int blk_is_sg(BlockBackend *blk);
25
+ Attached to: /machine/peripheral-anon/device[N]
21
-int blk_enable_write_cache(BlockBackend *blk);
26
Removable device: not locked, tray closed
22
+bool blk_is_read_only(BlockBackend *blk);
27
(qemu) quit
23
+bool blk_is_sg(BlockBackend *blk);
28
24
+bool blk_enable_write_cache(BlockBackend *blk);
29
@@ -XXX,XX +XXX,XX @@ Testing: -device ide-cd
25
void blk_set_enable_write_cache(BlockBackend *blk, bool wce);
30
QEMU X.Y.Z monitor - type 'help' for more information
26
void blk_invalidate_cache(BlockBackend *blk, Error **errp);
31
(qemu) info block
27
bool blk_is_inserted(BlockBackend *blk);
32
/machine/peripheral-anon/device[1]: [not inserted]
28
diff --git a/block/block-backend.c b/block/block-backend.c
33
- Attached to: PATH
34
+ Attached to: /machine/peripheral-anon/device[N]
35
Removable device: not locked, tray closed
36
(qemu) quit
37
38
@@ -XXX,XX +XXX,XX @@ Testing: -device scsi-cd
39
QEMU X.Y.Z monitor - type 'help' for more information
40
(qemu) info block
41
/machine/peripheral-anon/device[1]: [not inserted]
42
- Attached to: PATH
43
+ Attached to: /machine/peripheral-anon/device[N]
44
Removable device: not locked, tray closed
45
(qemu) quit
46
47
@@ -XXX,XX +XXX,XX @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device ide-hd,d
48
QEMU X.Y.Z monitor - type 'help' for more information
49
(qemu) info block
50
null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
51
- Attached to: PATH
52
+ Attached to: /machine/peripheral-anon/device[N]
53
Cache mode: writeback
54
(qemu) quit
55
56
@@ -XXX,XX +XXX,XX @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device scsi-hd,
57
QEMU X.Y.Z monitor - type 'help' for more information
58
(qemu) info block
59
null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
60
- Attached to: PATH
61
+ Attached to: /machine/peripheral-anon/device[N]
62
Cache mode: writeback
63
(qemu) quit
64
65
@@ -XXX,XX +XXX,XX @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-b
66
QEMU X.Y.Z monitor - type 'help' for more information
67
(qemu) info block
68
null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
69
- Attached to: PATH
70
+ Attached to: /machine/peripheral-anon/device[N]/virtio-backend
71
Cache mode: writeback
72
(qemu) quit
73
74
@@ -XXX,XX +XXX,XX @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device virtio-b
75
QEMU X.Y.Z monitor - type 'help' for more information
76
(qemu) info block
77
null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
78
- Attached to: PATH
79
+ Attached to: /machine/peripheral/qdev_id/virtio-backend
80
Cache mode: writeback
81
(qemu) quit
82
83
@@ -XXX,XX +XXX,XX @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device floppy,d
84
QEMU X.Y.Z monitor - type 'help' for more information
85
(qemu) info block
86
null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
87
- Attached to: PATH
88
+ Attached to: /machine/peripheral-anon/device[N]
89
Removable device: not locked, tray closed
90
Cache mode: writeback
91
(qemu) quit
92
@@ -XXX,XX +XXX,XX @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device ide-cd,d
93
QEMU X.Y.Z monitor - type 'help' for more information
94
(qemu) info block
95
null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
96
- Attached to: PATH
97
+ Attached to: /machine/peripheral-anon/device[N]
98
Removable device: not locked, tray closed
99
Cache mode: writeback
100
(qemu) quit
101
@@ -XXX,XX +XXX,XX @@ Testing: -blockdev driver=null-co,read-zeroes=on,node-name=null -device scsi-cd,
102
QEMU X.Y.Z monitor - type 'help' for more information
103
(qemu) info block
104
null: json:{"read-zeroes": true, "driver": "null-co"} (null-co)
105
- Attached to: PATH
106
+ Attached to: /machine/peripheral-anon/device[N]
107
Removable device: not locked, tray closed
108
Cache mode: writeback
109
(qemu) quit
110
@@ -XXX,XX +XXX,XX @@ none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
111
Cache mode: writeback
112
113
null: json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
114
- Attached to: PATH
115
+ Attached to: /machine/peripheral/qdev_id/virtio-backend
116
Cache mode: writeback
117
(qemu) quit
118
119
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device ide
120
QEMU X.Y.Z monitor - type 'help' for more information
121
(qemu) info block
122
none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
123
- Attached to: PATH
124
+ Attached to: /machine/peripheral-anon/device[N]
125
Cache mode: writeback
126
(qemu) quit
127
128
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device scs
129
QEMU X.Y.Z monitor - type 'help' for more information
130
(qemu) info block
131
none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
132
- Attached to: PATH
133
+ Attached to: /machine/peripheral-anon/device[N]
134
Cache mode: writeback
135
(qemu) quit
136
137
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device vir
138
QEMU X.Y.Z monitor - type 'help' for more information
139
(qemu) info block
140
none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
141
- Attached to: PATH
142
+ Attached to: /machine/peripheral-anon/device[N]/virtio-backend
143
Cache mode: writeback
144
(qemu) quit
145
146
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device vir
147
QEMU X.Y.Z monitor - type 'help' for more information
148
(qemu) info block
149
none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
150
- Attached to: PATH
151
+ Attached to: /machine/peripheral/qdev_id/virtio-backend
152
Cache mode: writeback
153
(qemu) quit
154
155
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device flo
156
QEMU X.Y.Z monitor - type 'help' for more information
157
(qemu) info block
158
none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
159
- Attached to: PATH
160
+ Attached to: /machine/peripheral-anon/device[N]
161
Removable device: not locked, tray closed
162
Cache mode: writeback
163
(qemu) quit
164
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device ide
165
QEMU X.Y.Z monitor - type 'help' for more information
166
(qemu) info block
167
none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
168
- Attached to: PATH
169
+ Attached to: /machine/peripheral-anon/device[N]
170
Removable device: not locked, tray closed
171
Cache mode: writeback
172
(qemu) quit
173
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,driver=null-co,read-zeroes=on,node-name=null -device scs
174
QEMU X.Y.Z monitor - type 'help' for more information
175
(qemu) info block
176
none0 (null): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
177
- Attached to: PATH
178
+ Attached to: /machine/peripheral-anon/device[N]
179
Removable device: not locked, tray closed
180
Cache mode: writeback
181
(qemu) quit
182
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none -device floppy,drive=none0
183
QEMU X.Y.Z monitor - type 'help' for more information
184
(qemu) info block
185
none0: [not inserted]
186
- Attached to: PATH
187
+ Attached to: /machine/peripheral-anon/device[N]
188
Removable device: not locked, tray closed
189
(qemu) quit
190
191
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none -device ide-cd,drive=none0
192
QEMU X.Y.Z monitor - type 'help' for more information
193
(qemu) info block
194
none0: [not inserted]
195
- Attached to: PATH
196
+ Attached to: /machine/peripheral-anon/device[N]
197
Removable device: not locked, tray closed
198
(qemu) quit
199
200
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none -device scsi-cd,drive=none0
201
QEMU X.Y.Z monitor - type 'help' for more information
202
(qemu) info block
203
none0: [not inserted]
204
- Attached to: PATH
205
+ Attached to: /machine/peripheral-anon/device[N]
206
Removable device: not locked, tray closed
207
(qemu) quit
208
209
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy
210
QEMU X.Y.Z monitor - type 'help' for more information
211
(qemu) info block
212
floppy0: [not inserted]
213
- Attached to: PATH
214
+ Attached to: /machine/unattached/device[N]
215
Removable device: not locked, tray closed
216
(qemu) quit
217
218
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,driver=null-co,read-zeroes=on
219
QEMU X.Y.Z monitor - type 'help' for more information
220
(qemu) info block
221
floppy0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
222
- Attached to: PATH
223
+ Attached to: /machine/unattached/device[N]
224
Removable device: not locked, tray closed
225
Cache mode: writeback
226
(qemu) quit
227
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=ide,driver=null-co,read-zeroes=on
228
QEMU X.Y.Z monitor - type 'help' for more information
229
(qemu) info block
230
ide0-hd0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
231
- Attached to: PATH
232
+ Attached to: /machine/unattached/device[N]
233
Cache mode: writeback
234
(qemu) quit
235
236
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=ide,media=cdrom
237
QEMU X.Y.Z monitor - type 'help' for more information
238
(qemu) info block
239
ide0-cd0: [not inserted]
240
- Attached to: PATH
241
+ Attached to: /machine/unattached/device[N]
242
Removable device: not locked, tray closed
243
(qemu) quit
244
245
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=ide,driver=null-co,read-zeroes=on,media=cdrom
246
QEMU X.Y.Z monitor - type 'help' for more information
247
(qemu) info block
248
ide0-cd0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co, read-only)
249
- Attached to: PATH
250
+ Attached to: /machine/unattached/device[N]
251
Removable device: not locked, tray closed
252
Cache mode: writeback
253
(qemu) quit
254
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=virtio,driver=null-co,read-zeroes=on
255
QEMU X.Y.Z monitor - type 'help' for more information
256
(qemu) info block
257
virtio0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co"} (null-co)
258
- Attached to: PATH
259
+ Attached to: /machine/peripheral-anon/device[N]/virtio-backend
260
Cache mode: writeback
261
(qemu) quit
262
263
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=pflash,driver=null-co,read-zeroes=on,size=1M
264
QEMU X.Y.Z monitor - type 'help' for more information
265
(qemu) info block
266
pflash0 (NODE_NAME): json:{"read-zeroes": "on", "driver": "null-co", "size": "1M"} (null-co)
267
- Attached to: PATH
268
+ Attached to: /machine/system.flash0
269
Cache mode: writeback
270
(qemu) quit
271
272
diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
29
index XXXXXXX..XXXXXXX 100644
273
index XXXXXXX..XXXXXXX 100644
30
--- a/block/block-backend.c
274
--- a/tests/qemu-iotests/common.filter
31
+++ b/block/block-backend.c
275
+++ b/tests/qemu-iotests/common.filter
32
@@ -XXX,XX +XXX,XX @@ void blk_error_action(BlockBackend *blk, BlockErrorAction action,
276
@@ -XXX,XX +XXX,XX @@ _filter_generated_node_ids()
33
}
277
278
_filter_qom_path()
279
{
280
- $SED -e 's#\(Attached to: *\) /.*#\1 PATH#'
281
+ $SED -e '/Attached to:/s/\device[[0-9]\+\]/device[N]/g'
34
}
282
}
35
283
36
-int blk_is_read_only(BlockBackend *blk)
284
# replace occurrences of the actual TEST_DIR value with TEST_DIR
37
+bool blk_is_read_only(BlockBackend *blk)
38
{
39
BlockDriverState *bs = blk_bs(blk);
40
41
@@ -XXX,XX +XXX,XX @@ int blk_is_read_only(BlockBackend *blk)
42
}
43
}
44
45
-int blk_is_sg(BlockBackend *blk)
46
+bool blk_is_sg(BlockBackend *blk)
47
{
48
BlockDriverState *bs = blk_bs(blk);
49
50
if (!bs) {
51
- return 0;
52
+ return false;
53
}
54
55
return bdrv_is_sg(bs);
56
}
57
58
-int blk_enable_write_cache(BlockBackend *blk)
59
+bool blk_enable_write_cache(BlockBackend *blk)
60
{
61
return blk->enable_write_cache;
62
}
63
--
285
--
64
2.19.1
286
2.29.2
65
287
66
288
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
2
2
3
Just like in qemu_opts_print_help(), print the device name as a caption
3
device[NUMBER] thing in QOM path is not stable and tracking it during
4
instead of on every single line, indent all options, add angle brackets
4
code modifications is not fun. Let's filter it like it's already done
5
around types, and align the descriptions after 24 characters. Also,
5
in iotest 186.
6
separate the descriptions with " - " instead of putting them in
7
parentheses, because that is what we do everywhere else. This does look
8
a bit funny here because basically all bits have the description
9
"on/off", but funny does not mean it is less readable.
10
6
11
Signed-off-by: Max Reitz <mreitz@redhat.com>
7
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
12
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
8
Message-Id: <20201216095205.526235-3-vsementsov@virtuozzo.com>
13
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
14
---
10
---
15
qdev-monitor.c | 13 +++++++++++--
11
tests/qemu-iotests/172 | 2 +-
16
1 file changed, 11 insertions(+), 2 deletions(-)
12
tests/qemu-iotests/172.out | 152 ++++++++++++++++++-------------------
13
2 files changed, 77 insertions(+), 77 deletions(-)
17
14
18
diff --git a/qdev-monitor.c b/qdev-monitor.c
15
diff --git a/tests/qemu-iotests/172 b/tests/qemu-iotests/172
16
index XXXXXXX..XXXXXXX 100755
17
--- a/tests/qemu-iotests/172
18
+++ b/tests/qemu-iotests/172
19
@@ -XXX,XX +XXX,XX @@ check_floppy_qtree()
20
(QEMU_OPTIONS="" do_run_qemu "$@" |
21
    _filter_testdir |_filter_generated_node_ids | _filter_hmp |
22
sed -ne '/^ dev: isa-fdc/,/^ dev:/{x;p};/^[a-z][^ ]* (NODE_NAME):* /,/^(qemu)$/{p}') 2>&1 |
23
- _filter_win32 | _filter_qemu
24
+ _filter_win32 | _filter_qemu | _filter_qom_path
25
}
26
27
check_cache_mode()
28
diff --git a/tests/qemu-iotests/172.out b/tests/qemu-iotests/172.out
19
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
20
--- a/qdev-monitor.c
30
--- a/tests/qemu-iotests/172.out
21
+++ b/qdev-monitor.c
31
+++ b/tests/qemu-iotests/172.out
22
@@ -XXX,XX +XXX,XX @@ int qdev_device_help(QemuOpts *opts)
32
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2
23
goto error;
33
share-rw = false
24
}
34
drive-type = "144"
25
35
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
26
+ if (prop_list) {
36
- Attached to: /machine/unattached/device[15]
27
+ out_printf("%s options:\n", driver);
37
+ Attached to: /machine/unattached/device[N]
28
+ } else {
38
Removable device: not locked, tray closed
29
+ out_printf("There are no options for %s.\n", driver);
39
Cache mode: writeback
30
+ }
40
31
for (prop = prop_list; prop; prop = prop->next) {
41
ide1-cd0: [not inserted]
32
- out_printf("%s.%s=%s", driver, prop->value->name, prop->value->type);
42
- Attached to: /machine/unattached/device[22]
33
+ int len;
43
+ Attached to: /machine/unattached/device[N]
34
+ out_printf(" %s=<%s>%n", prop->value->name, prop->value->type, &len);
44
Removable device: not locked, tray closed
35
if (prop->value->has_description) {
45
36
- out_printf(" (%s)\n", prop->value->description);
46
sd0: [not inserted]
37
+ if (len < 24) {
47
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2
38
+ out_printf("%*s", 24 - len, "");
48
share-rw = false
39
+ }
49
drive-type = "288"
40
+ out_printf(" - %s\n", prop->value->description);
50
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
41
} else {
51
- Attached to: /machine/unattached/device[16]
42
out_printf("\n");
52
+ Attached to: /machine/unattached/device[N]
43
}
53
Removable device: not locked, tray closed
54
Cache mode: writeback
55
56
ide1-cd0: [not inserted]
57
- Attached to: /machine/unattached/device[23]
58
+ Attached to: /machine/unattached/device[N]
59
Removable device: not locked, tray closed
60
61
floppy0: [not inserted]
62
- Attached to: /machine/unattached/device[15]
63
+ Attached to: /machine/unattached/device[N]
64
Removable device: not locked, tray closed
65
66
sd0: [not inserted]
67
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -fdb TEST_DIR/t.qcow2.2
68
share-rw = false
69
drive-type = "144"
70
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
71
- Attached to: /machine/unattached/device[15]
72
+ Attached to: /machine/unattached/device[N]
73
Removable device: not locked, tray closed
74
Cache mode: writeback
75
76
floppy1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
77
- Attached to: /machine/unattached/device[16]
78
+ Attached to: /machine/unattached/device[N]
79
Removable device: not locked, tray closed
80
Cache mode: writeback
81
82
ide1-cd0: [not inserted]
83
- Attached to: /machine/unattached/device[23]
84
+ Attached to: /machine/unattached/device[N]
85
Removable device: not locked, tray closed
86
87
sd0: [not inserted]
88
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2
89
share-rw = false
90
drive-type = "144"
91
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
92
- Attached to: /machine/unattached/device[15]
93
+ Attached to: /machine/unattached/device[N]
94
Removable device: not locked, tray closed
95
Cache mode: writeback
96
97
ide1-cd0: [not inserted]
98
- Attached to: /machine/unattached/device[22]
99
+ Attached to: /machine/unattached/device[N]
100
Removable device: not locked, tray closed
101
102
sd0: [not inserted]
103
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2,index=1
104
share-rw = false
105
drive-type = "288"
106
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
107
- Attached to: /machine/unattached/device[16]
108
+ Attached to: /machine/unattached/device[N]
109
Removable device: not locked, tray closed
110
Cache mode: writeback
111
112
ide1-cd0: [not inserted]
113
- Attached to: /machine/unattached/device[23]
114
+ Attached to: /machine/unattached/device[N]
115
Removable device: not locked, tray closed
116
117
floppy0: [not inserted]
118
- Attached to: /machine/unattached/device[15]
119
+ Attached to: /machine/unattached/device[N]
120
Removable device: not locked, tray closed
121
122
sd0: [not inserted]
123
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=floppy,file=TEST_DIR/t
124
share-rw = false
125
drive-type = "144"
126
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
127
- Attached to: /machine/unattached/device[15]
128
+ Attached to: /machine/unattached/device[N]
129
Removable device: not locked, tray closed
130
Cache mode: writeback
131
132
floppy1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
133
- Attached to: /machine/unattached/device[16]
134
+ Attached to: /machine/unattached/device[N]
135
Removable device: not locked, tray closed
136
Cache mode: writeback
137
138
ide1-cd0: [not inserted]
139
- Attached to: /machine/unattached/device[23]
140
+ Attached to: /machine/unattached/device[N]
141
Removable device: not locked, tray closed
142
143
sd0: [not inserted]
144
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=0,drive=... instead.
145
share-rw = false
146
drive-type = "144"
147
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
148
- Attached to: /machine/unattached/device[15]
149
+ Attached to: /machine/unattached/device[N]
150
Removable device: not locked, tray closed
151
Cache mode: writeback
152
153
ide1-cd0: [not inserted]
154
- Attached to: /machine/unattached/device[22]
155
+ Attached to: /machine/unattached/device[N]
156
Removable device: not locked, tray closed
157
158
sd0: [not inserted]
159
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=1,drive=... instead.
160
share-rw = false
161
drive-type = "144"
162
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
163
- Attached to: /machine/unattached/device[15]
164
+ Attached to: /machine/unattached/device[N]
165
Removable device: not locked, tray closed
166
Cache mode: writeback
167
168
ide1-cd0: [not inserted]
169
- Attached to: /machine/unattached/device[22]
170
+ Attached to: /machine/unattached/device[N]
171
Removable device: not locked, tray closed
172
173
sd0: [not inserted]
174
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=1,drive=... instead.
175
share-rw = false
176
drive-type = "144"
177
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
178
- Attached to: /machine/unattached/device[15]
179
+ Attached to: /machine/unattached/device[N]
180
Removable device: not locked, tray closed
181
Cache mode: writeback
182
183
none1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
184
- Attached to: /machine/unattached/device[16]
185
+ Attached to: /machine/unattached/device[N]
186
Removable device: not locked, tray closed
187
Cache mode: writeback
188
189
ide1-cd0: [not inserted]
190
- Attached to: /machine/unattached/device[23]
191
+ Attached to: /machine/unattached/device[N]
192
Removable device: not locked, tray closed
193
194
sd0: [not inserted]
195
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0
196
share-rw = false
197
drive-type = "144"
198
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
199
- Attached to: /machine/peripheral-anon/device[0]
200
+ Attached to: /machine/peripheral-anon/device[N]
201
Removable device: not locked, tray closed
202
Cache mode: writeback
203
204
ide1-cd0: [not inserted]
205
- Attached to: /machine/unattached/device[21]
206
+ Attached to: /machine/unattached/device[N]
207
Removable device: not locked, tray closed
208
209
sd0: [not inserted]
210
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,unit=1
211
share-rw = false
212
drive-type = "144"
213
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
214
- Attached to: /machine/peripheral-anon/device[0]
215
+ Attached to: /machine/peripheral-anon/device[N]
216
Removable device: not locked, tray closed
217
Cache mode: writeback
218
219
ide1-cd0: [not inserted]
220
- Attached to: /machine/unattached/device[21]
221
+ Attached to: /machine/unattached/device[N]
222
Removable device: not locked, tray closed
223
224
sd0: [not inserted]
225
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
226
share-rw = false
227
drive-type = "144"
228
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
229
- Attached to: /machine/peripheral-anon/device[0]
230
+ Attached to: /machine/peripheral-anon/device[N]
231
Removable device: not locked, tray closed
232
Cache mode: writeback
233
234
none1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
235
- Attached to: /machine/peripheral-anon/device[1]
236
+ Attached to: /machine/peripheral-anon/device[N]
237
Removable device: not locked, tray closed
238
Cache mode: writeback
239
240
ide1-cd0: [not inserted]
241
- Attached to: /machine/unattached/device[21]
242
+ Attached to: /machine/unattached/device[N]
243
Removable device: not locked, tray closed
244
245
sd0: [not inserted]
246
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=1,drive=... instead.
247
share-rw = false
248
drive-type = "144"
249
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
250
- Attached to: /machine/unattached/device[16]
251
+ Attached to: /machine/unattached/device[N]
252
Removable device: not locked, tray closed
253
Cache mode: writeback
254
255
none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
256
- Attached to: /machine/unattached/device[15]
257
+ Attached to: /machine/unattached/device[N]
258
Removable device: not locked, tray closed
259
Cache mode: writeback
260
261
ide1-cd0: [not inserted]
262
- Attached to: /machine/unattached/device[23]
263
+ Attached to: /machine/unattached/device[N]
264
Removable device: not locked, tray closed
265
266
sd0: [not inserted]
267
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=0,drive=... instead.
268
share-rw = false
269
drive-type = "144"
270
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
271
- Attached to: /machine/unattached/device[16]
272
+ Attached to: /machine/unattached/device[N]
273
Removable device: not locked, tray closed
274
Cache mode: writeback
275
276
none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
277
- Attached to: /machine/unattached/device[15]
278
+ Attached to: /machine/unattached/device[N]
279
Removable device: not locked, tray closed
280
Cache mode: writeback
281
282
ide1-cd0: [not inserted]
283
- Attached to: /machine/unattached/device[23]
284
+ Attached to: /machine/unattached/device[N]
285
Removable device: not locked, tray closed
286
287
sd0: [not inserted]
288
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
289
share-rw = false
290
drive-type = "144"
291
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
292
- Attached to: /machine/unattached/device[15]
293
+ Attached to: /machine/unattached/device[N]
294
Removable device: not locked, tray closed
295
Cache mode: writeback
296
297
none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
298
- Attached to: /machine/peripheral-anon/device[0]
299
+ Attached to: /machine/peripheral-anon/device[N]
300
Removable device: not locked, tray closed
301
Cache mode: writeback
302
303
ide1-cd0: [not inserted]
304
- Attached to: /machine/unattached/device[22]
305
+ Attached to: /machine/unattached/device[N]
306
Removable device: not locked, tray closed
307
308
sd0: [not inserted]
309
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
310
share-rw = false
311
drive-type = "144"
312
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
313
- Attached to: /machine/unattached/device[15]
314
+ Attached to: /machine/unattached/device[N]
315
Removable device: not locked, tray closed
316
Cache mode: writeback
317
318
none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
319
- Attached to: /machine/peripheral-anon/device[0]
320
+ Attached to: /machine/peripheral-anon/device[N]
321
Removable device: not locked, tray closed
322
Cache mode: writeback
323
324
ide1-cd0: [not inserted]
325
- Attached to: /machine/unattached/device[22]
326
+ Attached to: /machine/unattached/device[N]
327
Removable device: not locked, tray closed
328
329
sd0: [not inserted]
330
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
331
share-rw = false
332
drive-type = "144"
333
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
334
- Attached to: /machine/unattached/device[15]
335
+ Attached to: /machine/unattached/device[N]
336
Removable device: not locked, tray closed
337
Cache mode: writeback
338
339
none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
340
- Attached to: /machine/peripheral-anon/device[0]
341
+ Attached to: /machine/peripheral-anon/device[N]
342
Removable device: not locked, tray closed
343
Cache mode: writeback
344
345
ide1-cd0: [not inserted]
346
- Attached to: /machine/unattached/device[22]
347
+ Attached to: /machine/unattached/device[N]
348
Removable device: not locked, tray closed
349
350
sd0: [not inserted]
351
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
352
share-rw = false
353
drive-type = "144"
354
floppy1 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
355
- Attached to: /machine/unattached/device[15]
356
+ Attached to: /machine/unattached/device[N]
357
Removable device: not locked, tray closed
358
Cache mode: writeback
359
360
none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
361
- Attached to: /machine/peripheral-anon/device[0]
362
+ Attached to: /machine/peripheral-anon/device[N]
363
Removable device: not locked, tray closed
364
Cache mode: writeback
365
366
ide1-cd0: [not inserted]
367
- Attached to: /machine/unattached/device[22]
368
+ Attached to: /machine/unattached/device[N]
369
Removable device: not locked, tray closed
370
371
sd0: [not inserted]
372
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
373
share-rw = false
374
drive-type = "144"
375
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
376
- Attached to: /machine/unattached/device[15]
377
+ Attached to: /machine/unattached/device[N]
378
Removable device: not locked, tray closed
379
Cache mode: writeback
380
381
none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
382
- Attached to: /machine/peripheral-anon/device[0]
383
+ Attached to: /machine/peripheral-anon/device[N]
384
Removable device: not locked, tray closed
385
Cache mode: writeback
386
387
ide1-cd0: [not inserted]
388
- Attached to: /machine/unattached/device[22]
389
+ Attached to: /machine/unattached/device[N]
390
Removable device: not locked, tray closed
391
392
sd0: [not inserted]
393
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
394
share-rw = false
395
drive-type = "144"
396
floppy0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
397
- Attached to: /machine/unattached/device[15]
398
+ Attached to: /machine/unattached/device[N]
399
Removable device: not locked, tray closed
400
Cache mode: writeback
401
402
none0 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
403
- Attached to: /machine/peripheral-anon/device[0]
404
+ Attached to: /machine/peripheral-anon/device[N]
405
Removable device: not locked, tray closed
406
Cache mode: writeback
407
408
ide1-cd0: [not inserted]
409
- Attached to: /machine/unattached/device[22]
410
+ Attached to: /machine/unattached/device[N]
411
Removable device: not locked, tray closed
412
413
sd0: [not inserted]
414
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=0,drive=... instead.
415
share-rw = false
416
drive-type = "144"
417
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
418
- Attached to: /machine/unattached/device[15]
419
+ Attached to: /machine/unattached/device[N]
420
Removable device: not locked, tray closed
421
Cache mode: writeback
422
423
none1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
424
- Attached to: /machine/peripheral-anon/device[0]
425
+ Attached to: /machine/peripheral-anon/device[N]
426
Removable device: not locked, tray closed
427
Cache mode: writeback
428
429
ide1-cd0: [not inserted]
430
- Attached to: /machine/unattached/device[22]
431
+ Attached to: /machine/unattached/device[N]
432
Removable device: not locked, tray closed
433
434
sd0: [not inserted]
435
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=0,drive=... instead.
436
share-rw = false
437
drive-type = "144"
438
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
439
- Attached to: /machine/unattached/device[15]
440
+ Attached to: /machine/unattached/device[N]
441
Removable device: not locked, tray closed
442
Cache mode: writeback
443
444
none1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
445
- Attached to: /machine/peripheral-anon/device[0]
446
+ Attached to: /machine/peripheral-anon/device[N]
447
Removable device: not locked, tray closed
448
Cache mode: writeback
449
450
ide1-cd0: [not inserted]
451
- Attached to: /machine/unattached/device[22]
452
+ Attached to: /machine/unattached/device[N]
453
Removable device: not locked, tray closed
454
455
sd0: [not inserted]
456
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=1,drive=... instead.
457
share-rw = false
458
drive-type = "144"
459
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
460
- Attached to: /machine/unattached/device[15]
461
+ Attached to: /machine/unattached/device[N]
462
Removable device: not locked, tray closed
463
Cache mode: writeback
464
465
none1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
466
- Attached to: /machine/peripheral-anon/device[0]
467
+ Attached to: /machine/peripheral-anon/device[N]
468
Removable device: not locked, tray closed
469
Cache mode: writeback
470
471
ide1-cd0: [not inserted]
472
- Attached to: /machine/unattached/device[22]
473
+ Attached to: /machine/unattached/device[N]
474
Removable device: not locked, tray closed
475
476
sd0: [not inserted]
477
@@ -XXX,XX +XXX,XX @@ Use -device floppy,unit=1,drive=... instead.
478
share-rw = false
479
drive-type = "144"
480
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
481
- Attached to: /machine/unattached/device[15]
482
+ Attached to: /machine/unattached/device[N]
483
Removable device: not locked, tray closed
484
Cache mode: writeback
485
486
none1 (NODE_NAME): TEST_DIR/t.qcow2.2 (qcow2)
487
- Attached to: /machine/peripheral-anon/device[0]
488
+ Attached to: /machine/peripheral-anon/device[N]
489
Removable device: not locked, tray closed
490
Cache mode: writeback
491
492
ide1-cd0: [not inserted]
493
- Attached to: /machine/unattached/device[22]
494
+ Attached to: /machine/unattached/device[N]
495
Removable device: not locked, tray closed
496
497
sd0: [not inserted]
498
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -global floppy.drive=none0 -device
499
share-rw = false
500
drive-type = "144"
501
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
502
- Attached to: /machine/peripheral-anon/device[0]
503
+ Attached to: /machine/peripheral-anon/device[N]
504
Removable device: not locked, tray closed
505
Cache mode: writeback
506
507
ide1-cd0: [not inserted]
508
- Attached to: /machine/unattached/device[21]
509
+ Attached to: /machine/unattached/device[N]
510
Removable device: not locked, tray closed
511
512
sd0: [not inserted]
513
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,drive-t
514
share-rw = false
515
drive-type = "120"
516
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
517
- Attached to: /machine/peripheral-anon/device[0]
518
+ Attached to: /machine/peripheral-anon/device[N]
519
Removable device: not locked, tray closed
520
Cache mode: writeback
521
522
ide1-cd0: [not inserted]
523
- Attached to: /machine/unattached/device[21]
524
+ Attached to: /machine/unattached/device[N]
525
Removable device: not locked, tray closed
526
527
sd0: [not inserted]
528
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,drive-t
529
share-rw = false
530
drive-type = "288"
531
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
532
- Attached to: /machine/peripheral-anon/device[0]
533
+ Attached to: /machine/peripheral-anon/device[N]
534
Removable device: not locked, tray closed
535
Cache mode: writeback
536
537
ide1-cd0: [not inserted]
538
- Attached to: /machine/unattached/device[21]
539
+ Attached to: /machine/unattached/device[N]
540
Removable device: not locked, tray closed
541
542
sd0: [not inserted]
543
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,logical
544
share-rw = false
545
drive-type = "144"
546
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
547
- Attached to: /machine/peripheral-anon/device[0]
548
+ Attached to: /machine/peripheral-anon/device[N]
549
Removable device: not locked, tray closed
550
Cache mode: writeback
551
552
ide1-cd0: [not inserted]
553
- Attached to: /machine/unattached/device[21]
554
+ Attached to: /machine/unattached/device[N]
555
Removable device: not locked, tray closed
556
557
sd0: [not inserted]
558
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,physica
559
share-rw = false
560
drive-type = "144"
561
none0 (NODE_NAME): TEST_DIR/t.qcow2 (qcow2)
562
- Attached to: /machine/peripheral-anon/device[0]
563
+ Attached to: /machine/peripheral-anon/device[N]
564
Removable device: not locked, tray closed
565
Cache mode: writeback
566
567
ide1-cd0: [not inserted]
568
- Attached to: /machine/unattached/device[21]
569
+ Attached to: /machine/unattached/device[N]
570
Removable device: not locked, tray closed
571
572
sd0: [not inserted]
44
--
573
--
45
2.19.1
574
2.29.2
46
575
47
576
diff view generated by jsdifflib
1
From: Max Reitz <mreitz@redhat.com>
1
From: Markus Armbruster <armbru@redhat.com>
2
2
3
This adds some whitespace into the option help (including indentation)
3
The dynamic header's size is 1024 bytes.
4
and puts angle brackets around the type names. Furthermore, the list
5
name is no longer printed as part of every line, but only once in
6
advance, and only if the caller did not print a caption already.
7
4
8
This patch also restores the description alignment we had before commit
5
vpc_open() reads only the 512 bytes of the dynamic header into buf[].
9
9cbef9d68ee1d8d0, just at 24 instead of 16 characters like we used to.
6
Works, because it doesn't actually access the second half. However, a
10
This increase is because now we have the type and two spaces of
7
colleague told me that GCC 11 warns:
11
indentation before the description, and with a usual type name length of
12
three chracters, this sums up to eight additional characters -- which
13
means that we now need 24 characters to get the same amount of padding
14
for most options. Also, 24 is a third of 80, which makes it kind of a
15
round number in terminal terms.
16
8
17
Finally, this patch amends the reference output of iotest 082 to match
9
../block/vpc.c:358:51: error: array subscript 'struct VHDDynDiskHeader[0]' is partly outside array bounds of 'uint8_t[512]' [-Werror=array-bounds]
18
the changes (and thus makes it pass again).
19
10
20
Signed-off-by: Max Reitz <mreitz@redhat.com>
11
Clean up to read the full header.
21
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
12
13
Rename buf[] to dyndisk_header_buf[] while there.
14
15
Signed-off-by: Markus Armbruster <armbru@redhat.com>
16
Message-Id: <20201217162003.1102738-2-armbru@redhat.com>
17
Reviewed-by: Max Reitz <mreitz@redhat.com>
22
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
18
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
23
---
19
---
24
include/qemu/option.h | 2 +-
20
block/vpc.c | 8 ++++----
25
qemu-img.c | 4 +-
21
1 file changed, 4 insertions(+), 4 deletions(-)
26
util/qemu-option.c | 32 +-
27
tests/qemu-iotests/082.out | 956 ++++++++++++++++++-------------------
28
4 files changed, 507 insertions(+), 487 deletions(-)
29
22
30
diff --git a/include/qemu/option.h b/include/qemu/option.h
23
diff --git a/block/vpc.c b/block/vpc.c
31
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
32
--- a/include/qemu/option.h
25
--- a/block/vpc.c
33
+++ b/include/qemu/option.h
26
+++ b/block/vpc.c
34
@@ -XXX,XX +XXX,XX @@ typedef int (*qemu_opts_loopfunc)(void *opaque, QemuOpts *opts, Error **errp);
27
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
35
int qemu_opts_foreach(QemuOptsList *list, qemu_opts_loopfunc func,
28
QemuOpts *opts = NULL;
36
void *opaque, Error **errp);
29
Error *local_err = NULL;
37
void qemu_opts_print(QemuOpts *opts, const char *sep);
30
bool use_chs;
38
-void qemu_opts_print_help(QemuOptsList *list);
31
- uint8_t buf[HEADER_SIZE];
39
+void qemu_opts_print_help(QemuOptsList *list, bool print_caption);
32
+ uint8_t dyndisk_header_buf[1024];
40
void qemu_opts_free(QemuOptsList *list);
33
uint32_t checksum;
41
QemuOptsList *qemu_opts_append(QemuOptsList *dst, QemuOptsList *list);
34
uint64_t computed_size;
42
35
uint64_t pagetable_size;
43
diff --git a/qemu-img.c b/qemu-img.c
36
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
44
index XXXXXXX..XXXXXXX 100644
45
--- a/qemu-img.c
46
+++ b/qemu-img.c
47
@@ -XXX,XX +XXX,XX @@ static int print_block_option_help(const char *filename, const char *fmt)
48
}
37
}
49
38
50
printf("Supported options:\n");
39
if (disk_type == VHD_DYNAMIC) {
51
- qemu_opts_print_help(create_opts);
40
- ret = bdrv_pread(bs->file, be64_to_cpu(footer->data_offset), buf,
52
+ qemu_opts_print_help(create_opts, false);
41
- HEADER_SIZE);
53
qemu_opts_free(create_opts);
42
+ ret = bdrv_pread(bs->file, be64_to_cpu(footer->data_offset),
54
return 0;
43
+ dyndisk_header_buf, 1024);
55
}
44
if (ret < 0) {
56
@@ -XXX,XX +XXX,XX @@ static int print_amend_option_help(const char *format)
45
error_setg(errp, "Error reading dynamic VHD header");
57
assert(drv->create_opts);
46
goto fail;
58
59
printf("Creation options for '%s':\n", format);
60
- qemu_opts_print_help(drv->create_opts);
61
+ qemu_opts_print_help(drv->create_opts, false);
62
printf("\nNote that not all of these options may be amendable.\n");
63
return 0;
64
}
65
diff --git a/util/qemu-option.c b/util/qemu-option.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/util/qemu-option.c
68
+++ b/util/qemu-option.c
69
@@ -XXX,XX +XXX,XX @@ static const char *opt_type_to_string(enum QemuOptType type)
70
g_assert_not_reached();
71
}
72
73
-void qemu_opts_print_help(QemuOptsList *list)
74
+/**
75
+ * Print the list of options available in the given list. If
76
+ * @print_caption is true, a caption (including the list name, if it
77
+ * exists) is printed. The options itself will be indented, so
78
+ * @print_caption should only be set to false if the caller prints its
79
+ * own custom caption (so that the indentation makes sense).
80
+ */
81
+void qemu_opts_print_help(QemuOptsList *list, bool print_caption)
82
{
83
QemuOptDesc *desc;
84
int i;
85
@@ -XXX,XX +XXX,XX @@ void qemu_opts_print_help(QemuOptsList *list)
86
desc = list->desc;
87
while (desc && desc->name) {
88
GString *str = g_string_new(NULL);
89
- if (list->name) {
90
- g_string_append_printf(str, "%s.", list->name);
91
- }
92
- g_string_append_printf(str, "%s=%s", desc->name,
93
+ g_string_append_printf(str, " %s=<%s>", desc->name,
94
opt_type_to_string(desc->type));
95
if (desc->help) {
96
+ if (str->len < 24) {
97
+ g_string_append_printf(str, "%*s", 24 - (int)str->len, "");
98
+ }
99
g_string_append_printf(str, " - %s", desc->help);
100
}
47
}
101
g_ptr_array_add(array, g_string_free(str, false));
48
102
@@ -XXX,XX +XXX,XX @@ void qemu_opts_print_help(QemuOptsList *list)
49
- dyndisk_header = (VHDDynDiskHeader *) buf;
103
}
50
+ dyndisk_header = (VHDDynDiskHeader *)dyndisk_header_buf;
104
51
105
g_ptr_array_sort(array, (GCompareFunc)qemu_pstrcmp0);
52
if (strncmp(dyndisk_header->magic, "cxsparse", 8)) {
106
+ if (print_caption && array->len > 0) {
53
error_setg(errp, "Invalid header magic");
107
+ if (list->name) {
108
+ printf("%s options:\n", list->name);
109
+ } else {
110
+ printf("Options:\n");
111
+ }
112
+ } else if (array->len == 0) {
113
+ if (list->name) {
114
+ printf("There are no options for %s.\n", list->name);
115
+ } else {
116
+ printf("No options available.\n");
117
+ }
118
+ }
119
for (i = 0; i < array->len; i++) {
120
printf("%s\n", (char *)array->pdata[i]);
121
}
122
@@ -XXX,XX +XXX,XX @@ QemuOpts *qemu_opts_parse_noisily(QemuOptsList *list, const char *params,
123
opts = opts_parse(list, params, permit_abbrev, false, &invalidp, &err);
124
if (err) {
125
if (invalidp && has_help_option(params)) {
126
- qemu_opts_print_help(list);
127
+ qemu_opts_print_help(list, true);
128
error_free(err);
129
} else {
130
error_report_err(err);
131
diff --git a/tests/qemu-iotests/082.out b/tests/qemu-iotests/082.out
132
index XXXXXXX..XXXXXXX 100644
133
--- a/tests/qemu-iotests/082.out
134
+++ b/tests/qemu-iotests/082.out
135
@@ -XXX,XX +XXX,XX @@ cluster_size: 8192
136
137
Testing: create -f qcow2 -o help TEST_DIR/t.qcow2 128M
138
Supported options:
139
-size Virtual disk size
140
-compat Compatibility level (0.10 or 1.1)
141
-backing_file File name of a base image
142
-backing_fmt Image format of the base image
143
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
144
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
145
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
146
-encrypt.cipher-alg Name of encryption cipher algorithm
147
-encrypt.cipher-mode Name of encryption cipher mode
148
-encrypt.ivgen-alg Name of IV generator algorithm
149
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
150
-encrypt.hash-alg Name of encryption hash algorithm
151
-encrypt.iter-time Time to spend in PBKDF in milliseconds
152
-cluster_size qcow2 cluster size
153
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
154
-lazy_refcounts Postpone refcount updates
155
-refcount_bits Width of a reference count entry in bits
156
-nocow Turn off copy-on-write (valid only on btrfs)
157
+ backing_file=<str> - File name of a base image
158
+ backing_fmt=<str> - Image format of the base image
159
+ cluster_size=<size> - qcow2 cluster size
160
+ compat=<str> - Compatibility level (0.10 or 1.1)
161
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
162
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
163
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
164
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
165
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
166
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
167
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
168
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
169
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
170
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
171
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
172
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
173
+ refcount_bits=<num> - Width of a reference count entry in bits
174
+ size=<size> - Virtual disk size
175
176
Testing: create -f qcow2 -o ? TEST_DIR/t.qcow2 128M
177
Supported options:
178
-size Virtual disk size
179
-compat Compatibility level (0.10 or 1.1)
180
-backing_file File name of a base image
181
-backing_fmt Image format of the base image
182
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
183
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
184
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
185
-encrypt.cipher-alg Name of encryption cipher algorithm
186
-encrypt.cipher-mode Name of encryption cipher mode
187
-encrypt.ivgen-alg Name of IV generator algorithm
188
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
189
-encrypt.hash-alg Name of encryption hash algorithm
190
-encrypt.iter-time Time to spend in PBKDF in milliseconds
191
-cluster_size qcow2 cluster size
192
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
193
-lazy_refcounts Postpone refcount updates
194
-refcount_bits Width of a reference count entry in bits
195
-nocow Turn off copy-on-write (valid only on btrfs)
196
+ backing_file=<str> - File name of a base image
197
+ backing_fmt=<str> - Image format of the base image
198
+ cluster_size=<size> - qcow2 cluster size
199
+ compat=<str> - Compatibility level (0.10 or 1.1)
200
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
201
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
202
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
203
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
204
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
205
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
206
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
207
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
208
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
209
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
210
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
211
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
212
+ refcount_bits=<num> - Width of a reference count entry in bits
213
+ size=<size> - Virtual disk size
214
215
Testing: create -f qcow2 -o cluster_size=4k,help TEST_DIR/t.qcow2 128M
216
Supported options:
217
-size Virtual disk size
218
-compat Compatibility level (0.10 or 1.1)
219
-backing_file File name of a base image
220
-backing_fmt Image format of the base image
221
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
222
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
223
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
224
-encrypt.cipher-alg Name of encryption cipher algorithm
225
-encrypt.cipher-mode Name of encryption cipher mode
226
-encrypt.ivgen-alg Name of IV generator algorithm
227
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
228
-encrypt.hash-alg Name of encryption hash algorithm
229
-encrypt.iter-time Time to spend in PBKDF in milliseconds
230
-cluster_size qcow2 cluster size
231
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
232
-lazy_refcounts Postpone refcount updates
233
-refcount_bits Width of a reference count entry in bits
234
-nocow Turn off copy-on-write (valid only on btrfs)
235
+ backing_file=<str> - File name of a base image
236
+ backing_fmt=<str> - Image format of the base image
237
+ cluster_size=<size> - qcow2 cluster size
238
+ compat=<str> - Compatibility level (0.10 or 1.1)
239
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
240
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
241
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
242
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
243
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
244
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
245
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
246
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
247
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
248
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
249
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
250
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
251
+ refcount_bits=<num> - Width of a reference count entry in bits
252
+ size=<size> - Virtual disk size
253
254
Testing: create -f qcow2 -o cluster_size=4k,? TEST_DIR/t.qcow2 128M
255
Supported options:
256
-size Virtual disk size
257
-compat Compatibility level (0.10 or 1.1)
258
-backing_file File name of a base image
259
-backing_fmt Image format of the base image
260
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
261
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
262
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
263
-encrypt.cipher-alg Name of encryption cipher algorithm
264
-encrypt.cipher-mode Name of encryption cipher mode
265
-encrypt.ivgen-alg Name of IV generator algorithm
266
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
267
-encrypt.hash-alg Name of encryption hash algorithm
268
-encrypt.iter-time Time to spend in PBKDF in milliseconds
269
-cluster_size qcow2 cluster size
270
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
271
-lazy_refcounts Postpone refcount updates
272
-refcount_bits Width of a reference count entry in bits
273
-nocow Turn off copy-on-write (valid only on btrfs)
274
+ backing_file=<str> - File name of a base image
275
+ backing_fmt=<str> - Image format of the base image
276
+ cluster_size=<size> - qcow2 cluster size
277
+ compat=<str> - Compatibility level (0.10 or 1.1)
278
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
279
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
280
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
281
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
282
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
283
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
284
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
285
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
286
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
287
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
288
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
289
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
290
+ refcount_bits=<num> - Width of a reference count entry in bits
291
+ size=<size> - Virtual disk size
292
293
Testing: create -f qcow2 -o help,cluster_size=4k TEST_DIR/t.qcow2 128M
294
Supported options:
295
-size Virtual disk size
296
-compat Compatibility level (0.10 or 1.1)
297
-backing_file File name of a base image
298
-backing_fmt Image format of the base image
299
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
300
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
301
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
302
-encrypt.cipher-alg Name of encryption cipher algorithm
303
-encrypt.cipher-mode Name of encryption cipher mode
304
-encrypt.ivgen-alg Name of IV generator algorithm
305
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
306
-encrypt.hash-alg Name of encryption hash algorithm
307
-encrypt.iter-time Time to spend in PBKDF in milliseconds
308
-cluster_size qcow2 cluster size
309
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
310
-lazy_refcounts Postpone refcount updates
311
-refcount_bits Width of a reference count entry in bits
312
-nocow Turn off copy-on-write (valid only on btrfs)
313
+ backing_file=<str> - File name of a base image
314
+ backing_fmt=<str> - Image format of the base image
315
+ cluster_size=<size> - qcow2 cluster size
316
+ compat=<str> - Compatibility level (0.10 or 1.1)
317
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
318
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
319
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
320
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
321
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
322
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
323
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
324
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
325
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
326
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
327
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
328
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
329
+ refcount_bits=<num> - Width of a reference count entry in bits
330
+ size=<size> - Virtual disk size
331
332
Testing: create -f qcow2 -o ?,cluster_size=4k TEST_DIR/t.qcow2 128M
333
Supported options:
334
-size Virtual disk size
335
-compat Compatibility level (0.10 or 1.1)
336
-backing_file File name of a base image
337
-backing_fmt Image format of the base image
338
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
339
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
340
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
341
-encrypt.cipher-alg Name of encryption cipher algorithm
342
-encrypt.cipher-mode Name of encryption cipher mode
343
-encrypt.ivgen-alg Name of IV generator algorithm
344
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
345
-encrypt.hash-alg Name of encryption hash algorithm
346
-encrypt.iter-time Time to spend in PBKDF in milliseconds
347
-cluster_size qcow2 cluster size
348
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
349
-lazy_refcounts Postpone refcount updates
350
-refcount_bits Width of a reference count entry in bits
351
-nocow Turn off copy-on-write (valid only on btrfs)
352
+ backing_file=<str> - File name of a base image
353
+ backing_fmt=<str> - Image format of the base image
354
+ cluster_size=<size> - qcow2 cluster size
355
+ compat=<str> - Compatibility level (0.10 or 1.1)
356
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
357
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
358
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
359
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
360
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
361
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
362
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
363
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
364
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
365
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
366
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
367
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
368
+ refcount_bits=<num> - Width of a reference count entry in bits
369
+ size=<size> - Virtual disk size
370
371
Testing: create -f qcow2 -o cluster_size=4k -o help TEST_DIR/t.qcow2 128M
372
Supported options:
373
-size Virtual disk size
374
-compat Compatibility level (0.10 or 1.1)
375
-backing_file File name of a base image
376
-backing_fmt Image format of the base image
377
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
378
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
379
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
380
-encrypt.cipher-alg Name of encryption cipher algorithm
381
-encrypt.cipher-mode Name of encryption cipher mode
382
-encrypt.ivgen-alg Name of IV generator algorithm
383
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
384
-encrypt.hash-alg Name of encryption hash algorithm
385
-encrypt.iter-time Time to spend in PBKDF in milliseconds
386
-cluster_size qcow2 cluster size
387
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
388
-lazy_refcounts Postpone refcount updates
389
-refcount_bits Width of a reference count entry in bits
390
-nocow Turn off copy-on-write (valid only on btrfs)
391
+ backing_file=<str> - File name of a base image
392
+ backing_fmt=<str> - Image format of the base image
393
+ cluster_size=<size> - qcow2 cluster size
394
+ compat=<str> - Compatibility level (0.10 or 1.1)
395
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
396
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
397
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
398
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
399
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
400
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
401
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
402
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
403
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
404
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
405
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
406
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
407
+ refcount_bits=<num> - Width of a reference count entry in bits
408
+ size=<size> - Virtual disk size
409
410
Testing: create -f qcow2 -o cluster_size=4k -o ? TEST_DIR/t.qcow2 128M
411
Supported options:
412
-size Virtual disk size
413
-compat Compatibility level (0.10 or 1.1)
414
-backing_file File name of a base image
415
-backing_fmt Image format of the base image
416
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
417
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
418
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
419
-encrypt.cipher-alg Name of encryption cipher algorithm
420
-encrypt.cipher-mode Name of encryption cipher mode
421
-encrypt.ivgen-alg Name of IV generator algorithm
422
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
423
-encrypt.hash-alg Name of encryption hash algorithm
424
-encrypt.iter-time Time to spend in PBKDF in milliseconds
425
-cluster_size qcow2 cluster size
426
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
427
-lazy_refcounts Postpone refcount updates
428
-refcount_bits Width of a reference count entry in bits
429
-nocow Turn off copy-on-write (valid only on btrfs)
430
+ backing_file=<str> - File name of a base image
431
+ backing_fmt=<str> - Image format of the base image
432
+ cluster_size=<size> - qcow2 cluster size
433
+ compat=<str> - Compatibility level (0.10 or 1.1)
434
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
435
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
436
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
437
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
438
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
439
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
440
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
441
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
442
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
443
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
444
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
445
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
446
+ refcount_bits=<num> - Width of a reference count entry in bits
447
+ size=<size> - Virtual disk size
448
449
Testing: create -f qcow2 -u -o backing_file=TEST_DIR/t.qcow2,,help TEST_DIR/t.qcow2 128M
450
Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=134217728 backing_file=TEST_DIR/t.qcow2,,help cluster_size=65536 lazy_refcounts=off refcount_bits=16
451
@@ -XXX,XX +XXX,XX @@ qemu-img: Invalid option list: ,,
452
453
Testing: create -f qcow2 -o help
454
Supported options:
455
-size Virtual disk size
456
-compat Compatibility level (0.10 or 1.1)
457
-backing_file File name of a base image
458
-backing_fmt Image format of the base image
459
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
460
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
461
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
462
-encrypt.cipher-alg Name of encryption cipher algorithm
463
-encrypt.cipher-mode Name of encryption cipher mode
464
-encrypt.ivgen-alg Name of IV generator algorithm
465
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
466
-encrypt.hash-alg Name of encryption hash algorithm
467
-encrypt.iter-time Time to spend in PBKDF in milliseconds
468
-cluster_size qcow2 cluster size
469
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
470
-lazy_refcounts Postpone refcount updates
471
-refcount_bits Width of a reference count entry in bits
472
+ backing_file=<str> - File name of a base image
473
+ backing_fmt=<str> - Image format of the base image
474
+ cluster_size=<size> - qcow2 cluster size
475
+ compat=<str> - Compatibility level (0.10 or 1.1)
476
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
477
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
478
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
479
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
480
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
481
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
482
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
483
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
484
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
485
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
486
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
487
+ refcount_bits=<num> - Width of a reference count entry in bits
488
+ size=<size> - Virtual disk size
489
490
Testing: create -o help
491
Supported options:
492
-size Virtual disk size
493
+ size=<size> - Virtual disk size
494
495
Testing: create -f bochs -o help
496
qemu-img: Format driver 'bochs' does not support image creation
497
@@ -XXX,XX +XXX,XX @@ cluster_size: 8192
498
499
Testing: convert -O qcow2 -o help TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
500
Supported options:
501
-size Virtual disk size
502
-compat Compatibility level (0.10 or 1.1)
503
-backing_file File name of a base image
504
-backing_fmt Image format of the base image
505
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
506
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
507
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
508
-encrypt.cipher-alg Name of encryption cipher algorithm
509
-encrypt.cipher-mode Name of encryption cipher mode
510
-encrypt.ivgen-alg Name of IV generator algorithm
511
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
512
-encrypt.hash-alg Name of encryption hash algorithm
513
-encrypt.iter-time Time to spend in PBKDF in milliseconds
514
-cluster_size qcow2 cluster size
515
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
516
-lazy_refcounts Postpone refcount updates
517
-refcount_bits Width of a reference count entry in bits
518
-nocow Turn off copy-on-write (valid only on btrfs)
519
+ backing_file=<str> - File name of a base image
520
+ backing_fmt=<str> - Image format of the base image
521
+ cluster_size=<size> - qcow2 cluster size
522
+ compat=<str> - Compatibility level (0.10 or 1.1)
523
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
524
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
525
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
526
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
527
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
528
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
529
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
530
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
531
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
532
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
533
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
534
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
535
+ refcount_bits=<num> - Width of a reference count entry in bits
536
+ size=<size> - Virtual disk size
537
538
Testing: convert -O qcow2 -o ? TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
539
Supported options:
540
-size Virtual disk size
541
-compat Compatibility level (0.10 or 1.1)
542
-backing_file File name of a base image
543
-backing_fmt Image format of the base image
544
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
545
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
546
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
547
-encrypt.cipher-alg Name of encryption cipher algorithm
548
-encrypt.cipher-mode Name of encryption cipher mode
549
-encrypt.ivgen-alg Name of IV generator algorithm
550
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
551
-encrypt.hash-alg Name of encryption hash algorithm
552
-encrypt.iter-time Time to spend in PBKDF in milliseconds
553
-cluster_size qcow2 cluster size
554
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
555
-lazy_refcounts Postpone refcount updates
556
-refcount_bits Width of a reference count entry in bits
557
-nocow Turn off copy-on-write (valid only on btrfs)
558
+ backing_file=<str> - File name of a base image
559
+ backing_fmt=<str> - Image format of the base image
560
+ cluster_size=<size> - qcow2 cluster size
561
+ compat=<str> - Compatibility level (0.10 or 1.1)
562
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
563
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
564
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
565
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
566
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
567
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
568
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
569
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
570
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
571
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
572
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
573
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
574
+ refcount_bits=<num> - Width of a reference count entry in bits
575
+ size=<size> - Virtual disk size
576
577
Testing: convert -O qcow2 -o cluster_size=4k,help TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
578
Supported options:
579
-size Virtual disk size
580
-compat Compatibility level (0.10 or 1.1)
581
-backing_file File name of a base image
582
-backing_fmt Image format of the base image
583
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
584
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
585
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
586
-encrypt.cipher-alg Name of encryption cipher algorithm
587
-encrypt.cipher-mode Name of encryption cipher mode
588
-encrypt.ivgen-alg Name of IV generator algorithm
589
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
590
-encrypt.hash-alg Name of encryption hash algorithm
591
-encrypt.iter-time Time to spend in PBKDF in milliseconds
592
-cluster_size qcow2 cluster size
593
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
594
-lazy_refcounts Postpone refcount updates
595
-refcount_bits Width of a reference count entry in bits
596
-nocow Turn off copy-on-write (valid only on btrfs)
597
+ backing_file=<str> - File name of a base image
598
+ backing_fmt=<str> - Image format of the base image
599
+ cluster_size=<size> - qcow2 cluster size
600
+ compat=<str> - Compatibility level (0.10 or 1.1)
601
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
602
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
603
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
604
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
605
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
606
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
607
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
608
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
609
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
610
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
611
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
612
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
613
+ refcount_bits=<num> - Width of a reference count entry in bits
614
+ size=<size> - Virtual disk size
615
616
Testing: convert -O qcow2 -o cluster_size=4k,? TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
617
Supported options:
618
-size Virtual disk size
619
-compat Compatibility level (0.10 or 1.1)
620
-backing_file File name of a base image
621
-backing_fmt Image format of the base image
622
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
623
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
624
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
625
-encrypt.cipher-alg Name of encryption cipher algorithm
626
-encrypt.cipher-mode Name of encryption cipher mode
627
-encrypt.ivgen-alg Name of IV generator algorithm
628
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
629
-encrypt.hash-alg Name of encryption hash algorithm
630
-encrypt.iter-time Time to spend in PBKDF in milliseconds
631
-cluster_size qcow2 cluster size
632
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
633
-lazy_refcounts Postpone refcount updates
634
-refcount_bits Width of a reference count entry in bits
635
-nocow Turn off copy-on-write (valid only on btrfs)
636
+ backing_file=<str> - File name of a base image
637
+ backing_fmt=<str> - Image format of the base image
638
+ cluster_size=<size> - qcow2 cluster size
639
+ compat=<str> - Compatibility level (0.10 or 1.1)
640
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
641
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
642
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
643
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
644
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
645
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
646
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
647
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
648
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
649
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
650
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
651
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
652
+ refcount_bits=<num> - Width of a reference count entry in bits
653
+ size=<size> - Virtual disk size
654
655
Testing: convert -O qcow2 -o help,cluster_size=4k TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
656
Supported options:
657
-size Virtual disk size
658
-compat Compatibility level (0.10 or 1.1)
659
-backing_file File name of a base image
660
-backing_fmt Image format of the base image
661
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
662
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
663
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
664
-encrypt.cipher-alg Name of encryption cipher algorithm
665
-encrypt.cipher-mode Name of encryption cipher mode
666
-encrypt.ivgen-alg Name of IV generator algorithm
667
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
668
-encrypt.hash-alg Name of encryption hash algorithm
669
-encrypt.iter-time Time to spend in PBKDF in milliseconds
670
-cluster_size qcow2 cluster size
671
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
672
-lazy_refcounts Postpone refcount updates
673
-refcount_bits Width of a reference count entry in bits
674
-nocow Turn off copy-on-write (valid only on btrfs)
675
+ backing_file=<str> - File name of a base image
676
+ backing_fmt=<str> - Image format of the base image
677
+ cluster_size=<size> - qcow2 cluster size
678
+ compat=<str> - Compatibility level (0.10 or 1.1)
679
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
680
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
681
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
682
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
683
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
684
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
685
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
686
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
687
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
688
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
689
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
690
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
691
+ refcount_bits=<num> - Width of a reference count entry in bits
692
+ size=<size> - Virtual disk size
693
694
Testing: convert -O qcow2 -o ?,cluster_size=4k TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
695
Supported options:
696
-size Virtual disk size
697
-compat Compatibility level (0.10 or 1.1)
698
-backing_file File name of a base image
699
-backing_fmt Image format of the base image
700
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
701
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
702
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
703
-encrypt.cipher-alg Name of encryption cipher algorithm
704
-encrypt.cipher-mode Name of encryption cipher mode
705
-encrypt.ivgen-alg Name of IV generator algorithm
706
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
707
-encrypt.hash-alg Name of encryption hash algorithm
708
-encrypt.iter-time Time to spend in PBKDF in milliseconds
709
-cluster_size qcow2 cluster size
710
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
711
-lazy_refcounts Postpone refcount updates
712
-refcount_bits Width of a reference count entry in bits
713
-nocow Turn off copy-on-write (valid only on btrfs)
714
+ backing_file=<str> - File name of a base image
715
+ backing_fmt=<str> - Image format of the base image
716
+ cluster_size=<size> - qcow2 cluster size
717
+ compat=<str> - Compatibility level (0.10 or 1.1)
718
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
719
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
720
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
721
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
722
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
723
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
724
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
725
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
726
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
727
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
728
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
729
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
730
+ refcount_bits=<num> - Width of a reference count entry in bits
731
+ size=<size> - Virtual disk size
732
733
Testing: convert -O qcow2 -o cluster_size=4k -o help TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
734
Supported options:
735
-size Virtual disk size
736
-compat Compatibility level (0.10 or 1.1)
737
-backing_file File name of a base image
738
-backing_fmt Image format of the base image
739
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
740
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
741
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
742
-encrypt.cipher-alg Name of encryption cipher algorithm
743
-encrypt.cipher-mode Name of encryption cipher mode
744
-encrypt.ivgen-alg Name of IV generator algorithm
745
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
746
-encrypt.hash-alg Name of encryption hash algorithm
747
-encrypt.iter-time Time to spend in PBKDF in milliseconds
748
-cluster_size qcow2 cluster size
749
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
750
-lazy_refcounts Postpone refcount updates
751
-refcount_bits Width of a reference count entry in bits
752
-nocow Turn off copy-on-write (valid only on btrfs)
753
+ backing_file=<str> - File name of a base image
754
+ backing_fmt=<str> - Image format of the base image
755
+ cluster_size=<size> - qcow2 cluster size
756
+ compat=<str> - Compatibility level (0.10 or 1.1)
757
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
758
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
759
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
760
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
761
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
762
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
763
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
764
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
765
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
766
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
767
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
768
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
769
+ refcount_bits=<num> - Width of a reference count entry in bits
770
+ size=<size> - Virtual disk size
771
772
Testing: convert -O qcow2 -o cluster_size=4k -o ? TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
773
Supported options:
774
-size Virtual disk size
775
-compat Compatibility level (0.10 or 1.1)
776
-backing_file File name of a base image
777
-backing_fmt Image format of the base image
778
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
779
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
780
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
781
-encrypt.cipher-alg Name of encryption cipher algorithm
782
-encrypt.cipher-mode Name of encryption cipher mode
783
-encrypt.ivgen-alg Name of IV generator algorithm
784
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
785
-encrypt.hash-alg Name of encryption hash algorithm
786
-encrypt.iter-time Time to spend in PBKDF in milliseconds
787
-cluster_size qcow2 cluster size
788
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
789
-lazy_refcounts Postpone refcount updates
790
-refcount_bits Width of a reference count entry in bits
791
-nocow Turn off copy-on-write (valid only on btrfs)
792
+ backing_file=<str> - File name of a base image
793
+ backing_fmt=<str> - Image format of the base image
794
+ cluster_size=<size> - qcow2 cluster size
795
+ compat=<str> - Compatibility level (0.10 or 1.1)
796
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
797
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
798
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
799
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
800
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
801
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
802
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
803
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
804
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
805
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
806
+ nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
807
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
808
+ refcount_bits=<num> - Width of a reference count entry in bits
809
+ size=<size> - Virtual disk size
810
811
Testing: convert -O qcow2 -o backing_file=TEST_DIR/t.qcow2,,help TEST_DIR/t.qcow2 TEST_DIR/t.qcow2.base
812
qemu-img: Could not open 'TEST_DIR/t.qcow2.base': Could not open backing file: Could not open 'TEST_DIR/t.qcow2,help': No such file or directory
813
@@ -XXX,XX +XXX,XX @@ qemu-img: Invalid option list: ,,
814
815
Testing: convert -O qcow2 -o help
816
Supported options:
817
-size Virtual disk size
818
-compat Compatibility level (0.10 or 1.1)
819
-backing_file File name of a base image
820
-backing_fmt Image format of the base image
821
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
822
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
823
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
824
-encrypt.cipher-alg Name of encryption cipher algorithm
825
-encrypt.cipher-mode Name of encryption cipher mode
826
-encrypt.ivgen-alg Name of IV generator algorithm
827
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
828
-encrypt.hash-alg Name of encryption hash algorithm
829
-encrypt.iter-time Time to spend in PBKDF in milliseconds
830
-cluster_size qcow2 cluster size
831
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
832
-lazy_refcounts Postpone refcount updates
833
-refcount_bits Width of a reference count entry in bits
834
+ backing_file=<str> - File name of a base image
835
+ backing_fmt=<str> - Image format of the base image
836
+ cluster_size=<size> - qcow2 cluster size
837
+ compat=<str> - Compatibility level (0.10 or 1.1)
838
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
839
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
840
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
841
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
842
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
843
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
844
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
845
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
846
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
847
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
848
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
849
+ refcount_bits=<num> - Width of a reference count entry in bits
850
+ size=<size> - Virtual disk size
851
852
Testing: convert -o help
853
Supported options:
854
-size Virtual disk size
855
+ size=<size> - Virtual disk size
856
857
Testing: convert -O bochs -o help
858
qemu-img: Format driver 'bochs' does not support image creation
859
@@ -XXX,XX +XXX,XX @@ cluster_size: 65536
860
861
Testing: amend -f qcow2 -o help TEST_DIR/t.qcow2
862
Creation options for 'qcow2':
863
-size Virtual disk size
864
-compat Compatibility level (0.10 or 1.1)
865
-backing_file File name of a base image
866
-backing_fmt Image format of the base image
867
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
868
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
869
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
870
-encrypt.cipher-alg Name of encryption cipher algorithm
871
-encrypt.cipher-mode Name of encryption cipher mode
872
-encrypt.ivgen-alg Name of IV generator algorithm
873
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
874
-encrypt.hash-alg Name of encryption hash algorithm
875
-encrypt.iter-time Time to spend in PBKDF in milliseconds
876
-cluster_size qcow2 cluster size
877
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
878
-lazy_refcounts Postpone refcount updates
879
-refcount_bits Width of a reference count entry in bits
880
+ backing_file=<str> - File name of a base image
881
+ backing_fmt=<str> - Image format of the base image
882
+ cluster_size=<size> - qcow2 cluster size
883
+ compat=<str> - Compatibility level (0.10 or 1.1)
884
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
885
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
886
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
887
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
888
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
889
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
890
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
891
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
892
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
893
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
894
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
895
+ refcount_bits=<num> - Width of a reference count entry in bits
896
+ size=<size> - Virtual disk size
897
898
Note that not all of these options may be amendable.
899
900
Testing: amend -f qcow2 -o ? TEST_DIR/t.qcow2
901
Creation options for 'qcow2':
902
-size Virtual disk size
903
-compat Compatibility level (0.10 or 1.1)
904
-backing_file File name of a base image
905
-backing_fmt Image format of the base image
906
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
907
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
908
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
909
-encrypt.cipher-alg Name of encryption cipher algorithm
910
-encrypt.cipher-mode Name of encryption cipher mode
911
-encrypt.ivgen-alg Name of IV generator algorithm
912
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
913
-encrypt.hash-alg Name of encryption hash algorithm
914
-encrypt.iter-time Time to spend in PBKDF in milliseconds
915
-cluster_size qcow2 cluster size
916
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
917
-lazy_refcounts Postpone refcount updates
918
-refcount_bits Width of a reference count entry in bits
919
+ backing_file=<str> - File name of a base image
920
+ backing_fmt=<str> - Image format of the base image
921
+ cluster_size=<size> - qcow2 cluster size
922
+ compat=<str> - Compatibility level (0.10 or 1.1)
923
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
924
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
925
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
926
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
927
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
928
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
929
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
930
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
931
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
932
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
933
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
934
+ refcount_bits=<num> - Width of a reference count entry in bits
935
+ size=<size> - Virtual disk size
936
937
Note that not all of these options may be amendable.
938
939
Testing: amend -f qcow2 -o cluster_size=4k,help TEST_DIR/t.qcow2
940
Creation options for 'qcow2':
941
-size Virtual disk size
942
-compat Compatibility level (0.10 or 1.1)
943
-backing_file File name of a base image
944
-backing_fmt Image format of the base image
945
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
946
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
947
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
948
-encrypt.cipher-alg Name of encryption cipher algorithm
949
-encrypt.cipher-mode Name of encryption cipher mode
950
-encrypt.ivgen-alg Name of IV generator algorithm
951
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
952
-encrypt.hash-alg Name of encryption hash algorithm
953
-encrypt.iter-time Time to spend in PBKDF in milliseconds
954
-cluster_size qcow2 cluster size
955
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
956
-lazy_refcounts Postpone refcount updates
957
-refcount_bits Width of a reference count entry in bits
958
+ backing_file=<str> - File name of a base image
959
+ backing_fmt=<str> - Image format of the base image
960
+ cluster_size=<size> - qcow2 cluster size
961
+ compat=<str> - Compatibility level (0.10 or 1.1)
962
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
963
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
964
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
965
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
966
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
967
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
968
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
969
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
970
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
971
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
972
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
973
+ refcount_bits=<num> - Width of a reference count entry in bits
974
+ size=<size> - Virtual disk size
975
976
Note that not all of these options may be amendable.
977
978
Testing: amend -f qcow2 -o cluster_size=4k,? TEST_DIR/t.qcow2
979
Creation options for 'qcow2':
980
-size Virtual disk size
981
-compat Compatibility level (0.10 or 1.1)
982
-backing_file File name of a base image
983
-backing_fmt Image format of the base image
984
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
985
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
986
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
987
-encrypt.cipher-alg Name of encryption cipher algorithm
988
-encrypt.cipher-mode Name of encryption cipher mode
989
-encrypt.ivgen-alg Name of IV generator algorithm
990
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
991
-encrypt.hash-alg Name of encryption hash algorithm
992
-encrypt.iter-time Time to spend in PBKDF in milliseconds
993
-cluster_size qcow2 cluster size
994
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
995
-lazy_refcounts Postpone refcount updates
996
-refcount_bits Width of a reference count entry in bits
997
+ backing_file=<str> - File name of a base image
998
+ backing_fmt=<str> - Image format of the base image
999
+ cluster_size=<size> - qcow2 cluster size
1000
+ compat=<str> - Compatibility level (0.10 or 1.1)
1001
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1002
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1003
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1004
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1005
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1006
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1007
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1008
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1009
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1010
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1011
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1012
+ refcount_bits=<num> - Width of a reference count entry in bits
1013
+ size=<size> - Virtual disk size
1014
1015
Note that not all of these options may be amendable.
1016
1017
Testing: amend -f qcow2 -o help,cluster_size=4k TEST_DIR/t.qcow2
1018
Creation options for 'qcow2':
1019
-size Virtual disk size
1020
-compat Compatibility level (0.10 or 1.1)
1021
-backing_file File name of a base image
1022
-backing_fmt Image format of the base image
1023
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1024
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1025
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1026
-encrypt.cipher-alg Name of encryption cipher algorithm
1027
-encrypt.cipher-mode Name of encryption cipher mode
1028
-encrypt.ivgen-alg Name of IV generator algorithm
1029
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1030
-encrypt.hash-alg Name of encryption hash algorithm
1031
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1032
-cluster_size qcow2 cluster size
1033
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1034
-lazy_refcounts Postpone refcount updates
1035
-refcount_bits Width of a reference count entry in bits
1036
+ backing_file=<str> - File name of a base image
1037
+ backing_fmt=<str> - Image format of the base image
1038
+ cluster_size=<size> - qcow2 cluster size
1039
+ compat=<str> - Compatibility level (0.10 or 1.1)
1040
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1041
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1042
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1043
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1044
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1045
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1046
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1047
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1048
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1049
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1050
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1051
+ refcount_bits=<num> - Width of a reference count entry in bits
1052
+ size=<size> - Virtual disk size
1053
1054
Note that not all of these options may be amendable.
1055
1056
Testing: amend -f qcow2 -o ?,cluster_size=4k TEST_DIR/t.qcow2
1057
Creation options for 'qcow2':
1058
-size Virtual disk size
1059
-compat Compatibility level (0.10 or 1.1)
1060
-backing_file File name of a base image
1061
-backing_fmt Image format of the base image
1062
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1063
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1064
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1065
-encrypt.cipher-alg Name of encryption cipher algorithm
1066
-encrypt.cipher-mode Name of encryption cipher mode
1067
-encrypt.ivgen-alg Name of IV generator algorithm
1068
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1069
-encrypt.hash-alg Name of encryption hash algorithm
1070
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1071
-cluster_size qcow2 cluster size
1072
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1073
-lazy_refcounts Postpone refcount updates
1074
-refcount_bits Width of a reference count entry in bits
1075
+ backing_file=<str> - File name of a base image
1076
+ backing_fmt=<str> - Image format of the base image
1077
+ cluster_size=<size> - qcow2 cluster size
1078
+ compat=<str> - Compatibility level (0.10 or 1.1)
1079
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1080
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1081
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1082
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1083
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1084
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1085
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1086
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1087
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1088
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1089
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1090
+ refcount_bits=<num> - Width of a reference count entry in bits
1091
+ size=<size> - Virtual disk size
1092
1093
Note that not all of these options may be amendable.
1094
1095
Testing: amend -f qcow2 -o cluster_size=4k -o help TEST_DIR/t.qcow2
1096
Creation options for 'qcow2':
1097
-size Virtual disk size
1098
-compat Compatibility level (0.10 or 1.1)
1099
-backing_file File name of a base image
1100
-backing_fmt Image format of the base image
1101
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1102
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1103
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1104
-encrypt.cipher-alg Name of encryption cipher algorithm
1105
-encrypt.cipher-mode Name of encryption cipher mode
1106
-encrypt.ivgen-alg Name of IV generator algorithm
1107
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1108
-encrypt.hash-alg Name of encryption hash algorithm
1109
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1110
-cluster_size qcow2 cluster size
1111
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1112
-lazy_refcounts Postpone refcount updates
1113
-refcount_bits Width of a reference count entry in bits
1114
+ backing_file=<str> - File name of a base image
1115
+ backing_fmt=<str> - Image format of the base image
1116
+ cluster_size=<size> - qcow2 cluster size
1117
+ compat=<str> - Compatibility level (0.10 or 1.1)
1118
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1119
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1120
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1121
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1122
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1123
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1124
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1125
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1126
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1127
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1128
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1129
+ refcount_bits=<num> - Width of a reference count entry in bits
1130
+ size=<size> - Virtual disk size
1131
1132
Note that not all of these options may be amendable.
1133
1134
Testing: amend -f qcow2 -o cluster_size=4k -o ? TEST_DIR/t.qcow2
1135
Creation options for 'qcow2':
1136
-size Virtual disk size
1137
-compat Compatibility level (0.10 or 1.1)
1138
-backing_file File name of a base image
1139
-backing_fmt Image format of the base image
1140
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1141
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1142
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1143
-encrypt.cipher-alg Name of encryption cipher algorithm
1144
-encrypt.cipher-mode Name of encryption cipher mode
1145
-encrypt.ivgen-alg Name of IV generator algorithm
1146
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1147
-encrypt.hash-alg Name of encryption hash algorithm
1148
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1149
-cluster_size qcow2 cluster size
1150
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1151
-lazy_refcounts Postpone refcount updates
1152
-refcount_bits Width of a reference count entry in bits
1153
+ backing_file=<str> - File name of a base image
1154
+ backing_fmt=<str> - Image format of the base image
1155
+ cluster_size=<size> - qcow2 cluster size
1156
+ compat=<str> - Compatibility level (0.10 or 1.1)
1157
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1158
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1159
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1160
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1161
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1162
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1163
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1164
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1165
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1166
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1167
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1168
+ refcount_bits=<num> - Width of a reference count entry in bits
1169
+ size=<size> - Virtual disk size
1170
1171
Note that not all of these options may be amendable.
1172
1173
@@ -XXX,XX +XXX,XX @@ qemu-img: Invalid option list: ,,
1174
1175
Testing: amend -f qcow2 -o help
1176
Creation options for 'qcow2':
1177
-size Virtual disk size
1178
-compat Compatibility level (0.10 or 1.1)
1179
-backing_file File name of a base image
1180
-backing_fmt Image format of the base image
1181
-encryption Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1182
-encrypt.format Encrypt the image, format choices: 'aes', 'luks'
1183
-encrypt.key-secret ID of secret providing qcow AES key or LUKS passphrase
1184
-encrypt.cipher-alg Name of encryption cipher algorithm
1185
-encrypt.cipher-mode Name of encryption cipher mode
1186
-encrypt.ivgen-alg Name of IV generator algorithm
1187
-encrypt.ivgen-hash-alg Name of IV generator hash algorithm
1188
-encrypt.hash-alg Name of encryption hash algorithm
1189
-encrypt.iter-time Time to spend in PBKDF in milliseconds
1190
-cluster_size qcow2 cluster size
1191
-preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
1192
-lazy_refcounts Postpone refcount updates
1193
-refcount_bits Width of a reference count entry in bits
1194
+ backing_file=<str> - File name of a base image
1195
+ backing_fmt=<str> - Image format of the base image
1196
+ cluster_size=<size> - qcow2 cluster size
1197
+ compat=<str> - Compatibility level (0.10 or 1.1)
1198
+ encrypt.cipher-alg=<str> - Name of encryption cipher algorithm
1199
+ encrypt.cipher-mode=<str> - Name of encryption cipher mode
1200
+ encrypt.format=<str> - Encrypt the image, format choices: 'aes', 'luks'
1201
+ encrypt.hash-alg=<str> - Name of encryption hash algorithm
1202
+ encrypt.iter-time=<num> - Time to spend in PBKDF in milliseconds
1203
+ encrypt.ivgen-alg=<str> - Name of IV generator algorithm
1204
+ encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
1205
+ encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
1206
+ encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
1207
+ lazy_refcounts=<bool (on/off)> - Postpone refcount updates
1208
+ preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
1209
+ refcount_bits=<num> - Width of a reference count entry in bits
1210
+ size=<size> - Virtual disk size
1211
1212
Note that not all of these options may be amendable.
1213
1214
Testing: convert -o help
1215
Supported options:
1216
-size Virtual disk size
1217
+ size=<size> - Virtual disk size
1218
1219
Testing: amend -f bochs -o help
1220
qemu-img: Format driver 'bochs' does not support option amendment
1221
--
54
--
1222
2.19.1
55
2.29.2
1223
56
1224
57
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Markus Armbruster <armbru@redhat.com>
2
2
3
Taking the address of a field in a packed struct is a bad idea, because
3
create_dynamic_disk() takes a buffer holding the footer as first
4
it might not be actually aligned enough for that pointer type (and
4
argument. It writes out the footer (512 bytes), then reuses the
5
thus cause a crash on dereference on some host architectures). Newer
5
buffer to initialize and write out the dynamic header (1024 bytes),
6
versions of clang warn about this. Avoid the bug by not using the
6
then reuses it again to initialize and write out BAT sectors (512).
7
"modify in place" byte swapping functions.
8
7
9
There are a few places where the in-place swap function is
8
Works, because the caller passes a buffer that is large enough for all
10
used on something other than a packed struct field; we convert
9
three purposes. I hate that.
11
those anyway, for consistency.
12
10
13
This patch was produced with the following spatch script
11
Use a separate buffer for writing out BAT sectors. The next commit
14
(and hand-editing to fold a few resulting overlength lines):
12
will do the same for the dynamic header.
15
13
16
@@
14
Signed-off-by: Markus Armbruster <armbru@redhat.com>
17
expression E;
15
Message-Id: <20201217162003.1102738-3-armbru@redhat.com>
18
@@
16
Reviewed-by: Max Reitz <mreitz@redhat.com>
19
-be16_to_cpus(&E);
20
+E = be16_to_cpu(E);
21
@@
22
expression E;
23
@@
24
-be32_to_cpus(&E);
25
+E = be32_to_cpu(E);
26
@@
27
expression E;
28
@@
29
-be64_to_cpus(&E);
30
+E = be64_to_cpu(E);
31
@@
32
expression E;
33
@@
34
-cpu_to_be16s(&E);
35
+E = cpu_to_be16(E);
36
@@
37
expression E;
38
@@
39
-cpu_to_be32s(&E);
40
+E = cpu_to_be32(E);
41
@@
42
expression E;
43
@@
44
-cpu_to_be64s(&E);
45
+E = cpu_to_be64(E);
46
47
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
48
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
49
Tested-by: John Snow <jsnow@redhat.com>
50
Reviewed-by: John Snow <jsnow@redhat.com>
51
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
17
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
52
---
18
---
53
block/qcow2.c | 64 +++++++++++++++++++++++++++------------------------
19
block/vpc.c | 5 +++--
54
1 file changed, 34 insertions(+), 30 deletions(-)
20
1 file changed, 3 insertions(+), 2 deletions(-)
55
21
56
diff --git a/block/qcow2.c b/block/qcow2.c
22
diff --git a/block/vpc.c b/block/vpc.c
57
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
58
--- a/block/qcow2.c
24
--- a/block/vpc.c
59
+++ b/block/qcow2.c
25
+++ b/block/vpc.c
60
@@ -XXX,XX +XXX,XX @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
26
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
61
"pread fail from offset %" PRIu64, offset);
27
{
62
return 1;
28
VHDDynDiskHeader *dyndisk_header =
63
}
29
(VHDDynDiskHeader *) buf;
64
- be32_to_cpus(&ext.magic);
30
+ uint8_t bat_sector[512];
65
- be32_to_cpus(&ext.len);
31
size_t block_size, num_bat_entries;
66
+ ext.magic = be32_to_cpu(ext.magic);
32
int i;
67
+ ext.len = be32_to_cpu(ext.len);
33
int ret;
68
offset += sizeof(ext);
34
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
69
#ifdef DEBUG_EXT
35
/* Write the initial BAT */
70
printf("ext.magic = 0x%x\n", ext.magic);
36
offset = 3 * 512;
71
@@ -XXX,XX +XXX,XX @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
37
72
"Unable to read CRYPTO header extension");
38
- memset(buf, 0xFF, 512);
73
return ret;
39
+ memset(bat_sector, 0xFF, 512);
74
}
40
for (i = 0; i < DIV_ROUND_UP(num_bat_entries * 4, 512); i++) {
75
- be64_to_cpus(&s->crypto_header.offset);
41
- ret = blk_pwrite(blk, offset, buf, 512, 0);
76
- be64_to_cpus(&s->crypto_header.length);
42
+ ret = blk_pwrite(blk, offset, bat_sector, 512, 0);
77
+ s->crypto_header.offset = be64_to_cpu(s->crypto_header.offset);
78
+ s->crypto_header.length = be64_to_cpu(s->crypto_header.length);
79
80
if ((s->crypto_header.offset % s->cluster_size) != 0) {
81
error_setg(errp, "Encryption header offset '%" PRIu64 "' is "
82
@@ -XXX,XX +XXX,XX @@ static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
83
return -EINVAL;
84
}
85
86
- be32_to_cpus(&bitmaps_ext.nb_bitmaps);
87
- be64_to_cpus(&bitmaps_ext.bitmap_directory_size);
88
- be64_to_cpus(&bitmaps_ext.bitmap_directory_offset);
89
+ bitmaps_ext.nb_bitmaps = be32_to_cpu(bitmaps_ext.nb_bitmaps);
90
+ bitmaps_ext.bitmap_directory_size =
91
+ be64_to_cpu(bitmaps_ext.bitmap_directory_size);
92
+ bitmaps_ext.bitmap_directory_offset =
93
+ be64_to_cpu(bitmaps_ext.bitmap_directory_offset);
94
95
if (bitmaps_ext.nb_bitmaps > QCOW2_MAX_BITMAPS) {
96
error_setg(errp,
97
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
98
error_setg_errno(errp, -ret, "Could not read qcow2 header");
99
goto fail;
100
}
101
- be32_to_cpus(&header.magic);
102
- be32_to_cpus(&header.version);
103
- be64_to_cpus(&header.backing_file_offset);
104
- be32_to_cpus(&header.backing_file_size);
105
- be64_to_cpus(&header.size);
106
- be32_to_cpus(&header.cluster_bits);
107
- be32_to_cpus(&header.crypt_method);
108
- be64_to_cpus(&header.l1_table_offset);
109
- be32_to_cpus(&header.l1_size);
110
- be64_to_cpus(&header.refcount_table_offset);
111
- be32_to_cpus(&header.refcount_table_clusters);
112
- be64_to_cpus(&header.snapshots_offset);
113
- be32_to_cpus(&header.nb_snapshots);
114
+ header.magic = be32_to_cpu(header.magic);
115
+ header.version = be32_to_cpu(header.version);
116
+ header.backing_file_offset = be64_to_cpu(header.backing_file_offset);
117
+ header.backing_file_size = be32_to_cpu(header.backing_file_size);
118
+ header.size = be64_to_cpu(header.size);
119
+ header.cluster_bits = be32_to_cpu(header.cluster_bits);
120
+ header.crypt_method = be32_to_cpu(header.crypt_method);
121
+ header.l1_table_offset = be64_to_cpu(header.l1_table_offset);
122
+ header.l1_size = be32_to_cpu(header.l1_size);
123
+ header.refcount_table_offset = be64_to_cpu(header.refcount_table_offset);
124
+ header.refcount_table_clusters =
125
+ be32_to_cpu(header.refcount_table_clusters);
126
+ header.snapshots_offset = be64_to_cpu(header.snapshots_offset);
127
+ header.nb_snapshots = be32_to_cpu(header.nb_snapshots);
128
129
if (header.magic != QCOW_MAGIC) {
130
error_setg(errp, "Image is not in qcow2 format");
131
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
132
header.refcount_order = 4;
133
header.header_length = 72;
134
} else {
135
- be64_to_cpus(&header.incompatible_features);
136
- be64_to_cpus(&header.compatible_features);
137
- be64_to_cpus(&header.autoclear_features);
138
- be32_to_cpus(&header.refcount_order);
139
- be32_to_cpus(&header.header_length);
140
+ header.incompatible_features =
141
+ be64_to_cpu(header.incompatible_features);
142
+ header.compatible_features = be64_to_cpu(header.compatible_features);
143
+ header.autoclear_features = be64_to_cpu(header.autoclear_features);
144
+ header.refcount_order = be32_to_cpu(header.refcount_order);
145
+ header.header_length = be32_to_cpu(header.header_length);
146
147
if (header.header_length < 104) {
148
error_setg(errp, "qcow2 header too short");
149
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
150
goto fail;
151
}
152
for(i = 0;i < s->l1_size; i++) {
153
- be64_to_cpus(&s->l1_table[i]);
154
+ s->l1_table[i] = be64_to_cpu(s->l1_table[i]);
155
}
156
}
157
158
@@ -XXX,XX +XXX,XX @@ int qcow2_update_header(BlockDriverState *bs)
159
160
/* Full disk encryption header pointer extension */
161
if (s->crypto_header.offset != 0) {
162
- cpu_to_be64s(&s->crypto_header.offset);
163
- cpu_to_be64s(&s->crypto_header.length);
164
+ s->crypto_header.offset = cpu_to_be64(s->crypto_header.offset);
165
+ s->crypto_header.length = cpu_to_be64(s->crypto_header.length);
166
ret = header_ext_add(buf, QCOW2_EXT_MAGIC_CRYPTO_HEADER,
167
&s->crypto_header, sizeof(s->crypto_header),
168
buflen);
169
- be64_to_cpus(&s->crypto_header.offset);
170
- be64_to_cpus(&s->crypto_header.length);
171
+ s->crypto_header.offset = be64_to_cpu(s->crypto_header.offset);
172
+ s->crypto_header.length = be64_to_cpu(s->crypto_header.length);
173
if (ret < 0) {
43
if (ret < 0) {
174
goto fail;
44
goto fail;
175
}
45
}
176
--
46
--
177
2.19.1
47
2.29.2
178
48
179
49
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Markus Armbruster <armbru@redhat.com>
2
2
3
Taking the address of a field in a packed struct is a bad idea, because
3
create_dynamic_disk() takes a buffer holding the footer as first
4
it might not be actually aligned enough for that pointer type (and
4
argument. It writes out the footer (512 bytes), then reuses the
5
thus cause a crash on dereference on some host architectures). Newer
5
buffer to initialize and write out the dynamic header (1024 bytes).
6
versions of clang warn about this. Avoid the bug by not using the
7
"modify in place" byte swapping functions.
8
6
9
There are a few places where the in-place swap function is
7
Works, because the caller passes a buffer that is large enough for
10
used on something other than a packed struct field; we convert
8
both purposes. I hate that.
11
those anyway, for consistency.
12
9
13
This patch was produced with the following spatch script:
10
Use a separate buffer for the dynamic header, and adjust the caller's
11
buffer.
14
12
15
@@
13
Signed-off-by: Markus Armbruster <armbru@redhat.com>
16
expression E;
14
Message-Id: <20201217162003.1102738-4-armbru@redhat.com>
17
@@
15
Reviewed-by: Max Reitz <mreitz@redhat.com>
18
-be16_to_cpus(&E);
19
+E = be16_to_cpu(E);
20
@@
21
expression E;
22
@@
23
-be32_to_cpus(&E);
24
+E = be32_to_cpu(E);
25
@@
26
expression E;
27
@@
28
-be64_to_cpus(&E);
29
+E = be64_to_cpu(E);
30
@@
31
expression E;
32
@@
33
-cpu_to_be16s(&E);
34
+E = cpu_to_be16(E);
35
@@
36
expression E;
37
@@
38
-cpu_to_be32s(&E);
39
+E = cpu_to_be32(E);
40
@@
41
expression E;
42
@@
43
-cpu_to_be64s(&E);
44
+E = cpu_to_be64(E);
45
46
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
47
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
48
Tested-by: John Snow <jsnow@redhat.com>
49
Reviewed-by: John Snow <jsnow@redhat.com>
50
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
16
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
51
---
17
---
52
block/qcow.c | 18 +++++++++---------
18
block/vpc.c | 22 ++++++++++++----------
53
1 file changed, 9 insertions(+), 9 deletions(-)
19
1 file changed, 12 insertions(+), 10 deletions(-)
54
20
55
diff --git a/block/qcow.c b/block/qcow.c
21
diff --git a/block/vpc.c b/block/vpc.c
56
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
57
--- a/block/qcow.c
23
--- a/block/vpc.c
58
+++ b/block/qcow.c
24
+++ b/block/vpc.c
59
@@ -XXX,XX +XXX,XX @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
25
@@ -XXX,XX +XXX,XX @@ static int calculate_geometry(int64_t total_sectors, uint16_t *cyls,
26
static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
27
int64_t total_sectors)
28
{
29
+ uint8_t dyndisk_header_buf[1024];
30
VHDDynDiskHeader *dyndisk_header =
31
- (VHDDynDiskHeader *) buf;
32
+ (VHDDynDiskHeader *)dyndisk_header_buf;
33
uint8_t bat_sector[512];
34
size_t block_size, num_bat_entries;
35
int i;
36
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
37
}
38
39
/* Prepare the Dynamic Disk Header */
40
- memset(buf, 0, 1024);
41
+ memset(dyndisk_header_buf, 0, 1024);
42
43
memcpy(dyndisk_header->magic, "cxsparse", 8);
44
45
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
46
dyndisk_header->block_size = cpu_to_be32(block_size);
47
dyndisk_header->max_table_entries = cpu_to_be32(num_bat_entries);
48
49
- dyndisk_header->checksum = cpu_to_be32(vpc_checksum(buf, 1024));
50
+ dyndisk_header->checksum = cpu_to_be32(vpc_checksum(dyndisk_header_buf,
51
+ 1024));
52
53
/* Write the header */
54
offset = 512;
55
56
- ret = blk_pwrite(blk, offset, buf, 1024, 0);
57
+ ret = blk_pwrite(blk, offset, dyndisk_header_buf, 1024, 0);
60
if (ret < 0) {
58
if (ret < 0) {
61
goto fail;
59
goto fail;
62
}
60
}
63
- be32_to_cpus(&header.magic);
61
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
64
- be32_to_cpus(&header.version);
62
BlockBackend *blk = NULL;
65
- be64_to_cpus(&header.backing_file_offset);
63
BlockDriverState *bs = NULL;
66
- be32_to_cpus(&header.backing_file_size);
64
67
- be32_to_cpus(&header.mtime);
65
- uint8_t buf[1024];
68
- be64_to_cpus(&header.size);
66
- VHDFooter *footer = (VHDFooter *) buf;
69
- be32_to_cpus(&header.crypt_method);
67
+ uint8_t footer_buf[HEADER_SIZE];
70
- be64_to_cpus(&header.l1_table_offset);
68
+ VHDFooter *footer = (VHDFooter *)footer_buf;
71
+ header.magic = be32_to_cpu(header.magic);
69
uint16_t cyls = 0;
72
+ header.version = be32_to_cpu(header.version);
70
uint8_t heads = 0;
73
+ header.backing_file_offset = be64_to_cpu(header.backing_file_offset);
71
uint8_t secs_per_cyl = 0;
74
+ header.backing_file_size = be32_to_cpu(header.backing_file_size);
72
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
75
+ header.mtime = be32_to_cpu(header.mtime);
76
+ header.size = be64_to_cpu(header.size);
77
+ header.crypt_method = be32_to_cpu(header.crypt_method);
78
+ header.l1_table_offset = be64_to_cpu(header.l1_table_offset);
79
80
if (header.magic != QCOW_MAGIC) {
81
error_setg(errp, "Image not in qcow format");
82
@@ -XXX,XX +XXX,XX @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
83
}
73
}
84
74
85
for(i = 0;i < s->l1_size; i++) {
75
/* Prepare the Hard Disk Footer */
86
- be64_to_cpus(&s->l1_table[i]);
76
- memset(buf, 0, 1024);
87
+ s->l1_table[i] = be64_to_cpu(s->l1_table[i]);
77
+ memset(footer_buf, 0, HEADER_SIZE);
78
79
memcpy(footer->creator, "conectix", 8);
80
if (vpc_opts->force_size) {
81
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
82
qemu_uuid_generate(&uuid);
83
footer->uuid = uuid;
84
85
- footer->checksum = cpu_to_be32(vpc_checksum(buf, HEADER_SIZE));
86
+ footer->checksum = cpu_to_be32(vpc_checksum(footer_buf, HEADER_SIZE));
87
88
if (disk_type == VHD_DYNAMIC) {
89
- ret = create_dynamic_disk(blk, buf, total_sectors);
90
+ ret = create_dynamic_disk(blk, footer_buf, total_sectors);
91
if (ret < 0) {
92
error_setg(errp, "Unable to create or write VHD header");
93
}
94
} else {
95
- ret = create_fixed_disk(blk, buf, total_size, errp);
96
+ ret = create_fixed_disk(blk, footer_buf, total_size, errp);
88
}
97
}
89
98
90
/* alloc L2 cache (max. 64k * 16 * 8 = 8 MB) */
99
out:
91
--
100
--
92
2.19.1
101
2.29.2
93
102
94
103
diff view generated by jsdifflib
1
From: Cleber Rosa <crosa@redhat.com>
1
From: Markus Armbruster <armbru@redhat.com>
2
2
3
While testing the Python 3 changes which touch the 083 test, I noticed
3
Some of the next commits will checksum structs. Change vpc_checksum()
4
that it would fail with qcow2. Expanding the testing, I noticed it
4
to take void * instead of uint8_t, to save us pointless casts to
5
had nothing to do with the Python 3 changes, and in fact, it would not
5
uint8_t *.
6
pass on anything but raw:
7
6
8
raw: pass
7
Signed-off-by: Markus Armbruster <armbru@redhat.com>
9
bochs: not generic
8
Message-Id: <20201217162003.1102738-5-armbru@redhat.com>
10
cloop: not generic
9
Reviewed-by: Max Reitz <mreitz@redhat.com>
11
parallels: fail
12
qcow: fail
13
qcow2: fail
14
qed: fail
15
vdi: fail
16
vhdx: fail
17
vmdk: fail
18
vpc: fail
19
luks: fail
20
21
The errors are a mixture I/O and "image not in xxx format", such as:
22
23
=== Check disconnect before data ===
24
25
Unexpected end-of-file before all bytes were read
26
-read failed: Input/output error
27
+can't open device nbd+tcp://127.0.0.1:PORT/foo: Could not open 'nbd://127.0.0.1:PORT/foo': Input/output error
28
29
=== Check disconnect after data ===
30
31
-read 512/512 bytes at offset 0
32
-512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
33
+can't open device nbd+tcp://127.0.0.1:PORT/foo: Image not in qcow format
34
35
I'm not aware if there's a quick fix, so, for the time being, it looks
36
like the honest approach is to make the test known to work on raw
37
only.
38
39
Signed-off-by: Cleber Rosa <crosa@redhat.com>
40
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
41
---
11
---
42
tests/qemu-iotests/083 | 2 +-
12
block/vpc.c | 3 ++-
43
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 2 insertions(+), 1 deletion(-)
44
14
45
diff --git a/tests/qemu-iotests/083 b/tests/qemu-iotests/083
15
diff --git a/block/vpc.c b/block/vpc.c
46
index XXXXXXX..XXXXXXX 100755
16
index XXXXXXX..XXXXXXX 100644
47
--- a/tests/qemu-iotests/083
17
--- a/block/vpc.c
48
+++ b/tests/qemu-iotests/083
18
+++ b/block/vpc.c
49
@@ -XXX,XX +XXX,XX @@ trap "_cleanup; exit \$status" 0 1 2 3 15
19
@@ -XXX,XX +XXX,XX @@ static QemuOptsList vpc_runtime_opts = {
50
. ./common.rc
20
51
. ./common.filter
21
static QemuOptsList vpc_create_opts;
52
22
53
-_supported_fmt generic
23
-static uint32_t vpc_checksum(uint8_t *buf, size_t size)
54
+_supported_fmt raw
24
+static uint32_t vpc_checksum(void *p, size_t size)
55
_supported_proto nbd
25
{
56
_supported_os Linux
26
+ uint8_t *buf = p;
27
uint32_t res = 0;
28
int i;
57
29
58
--
30
--
59
2.19.1
31
2.29.2
60
32
61
33
diff view generated by jsdifflib
1
From: Stefan Weil <sw@weilnetz.de>
1
From: Markus Armbruster <armbru@redhat.com>
2
2
3
Use %zu instead of %zd for unsigned numbers.
3
Pad VHDDynDiskHeader as specified in the "Virtual Hard Disk Image
4
Format Specification" version 1.0[*]. Change dynamic disk header
5
buffers from uint8_t[1024] to VHDDynDiskHeader. Their size remains
6
the same.
4
7
5
This fixes two error messages from the LSTM static code analyzer:
8
The VHDDynDiskHeader * variables pointing to a VHDDynDiskHeader
9
variable right next to it are now silly. Eliminate them.
6
10
7
This argument should be of type 'ssize_t' but is of type 'unsigned long'
11
[*] http://download.microsoft.com/download/f/f/e/ffef50a5-07dd-4cf8-aaa3-442c0673a029/Virtual%20Hard%20Disk%20Format%20Spec_10_18_06.doc
8
12
9
Signed-off-by: Stefan Weil <sw@weilnetz.de>
13
Signed-off-by: Markus Armbruster <armbru@redhat.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-Id: <20201217162003.1102738-6-armbru@redhat.com>
15
Reviewed-by: Max Reitz <mreitz@redhat.com>
11
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
16
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
12
---
17
---
13
qemu-io-cmds.c | 4 ++--
18
block/vpc.c | 41 +++++++++++++++++++----------------------
14
1 file changed, 2 insertions(+), 2 deletions(-)
19
1 file changed, 19 insertions(+), 22 deletions(-)
15
20
16
diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c
21
diff --git a/block/vpc.c b/block/vpc.c
17
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
18
--- a/qemu-io-cmds.c
23
--- a/block/vpc.c
19
+++ b/qemu-io-cmds.c
24
+++ b/block/vpc.c
20
@@ -XXX,XX +XXX,XX @@ static int readv_f(BlockBackend *blk, int argc, char **argv)
25
@@ -XXX,XX +XXX,XX @@ typedef struct vhd_dyndisk_header {
21
memset(cmp_buf, pattern, qiov.size);
26
uint32_t reserved;
22
if (memcmp(buf, cmp_buf, qiov.size)) {
27
uint64_t data_offset;
23
printf("Pattern verification failed at offset %"
28
} parent_locator[8];
24
- PRId64 ", %zd bytes\n", offset, qiov.size);
29
+ uint8_t reserved2[256];
25
+ PRId64 ", %zu bytes\n", offset, qiov.size);
30
} QEMU_PACKED VHDDynDiskHeader;
31
32
+QEMU_BUILD_BUG_ON(sizeof(VHDDynDiskHeader) != 1024);
33
+
34
typedef struct BDRVVPCState {
35
CoMutex lock;
36
uint8_t footer_buf[HEADER_SIZE];
37
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
38
BDRVVPCState *s = bs->opaque;
39
int i;
40
VHDFooter *footer;
41
- VHDDynDiskHeader *dyndisk_header;
42
QemuOpts *opts = NULL;
43
Error *local_err = NULL;
44
bool use_chs;
45
- uint8_t dyndisk_header_buf[1024];
46
+ VHDDynDiskHeader dyndisk_header;
47
uint32_t checksum;
48
uint64_t computed_size;
49
uint64_t pagetable_size;
50
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
51
52
if (disk_type == VHD_DYNAMIC) {
53
ret = bdrv_pread(bs->file, be64_to_cpu(footer->data_offset),
54
- dyndisk_header_buf, 1024);
55
+ &dyndisk_header, 1024);
56
if (ret < 0) {
57
error_setg(errp, "Error reading dynamic VHD header");
58
goto fail;
59
}
60
61
- dyndisk_header = (VHDDynDiskHeader *)dyndisk_header_buf;
62
-
63
- if (strncmp(dyndisk_header->magic, "cxsparse", 8)) {
64
+ if (strncmp(dyndisk_header.magic, "cxsparse", 8)) {
65
error_setg(errp, "Invalid header magic");
26
ret = -EINVAL;
66
ret = -EINVAL;
67
goto fail;
27
}
68
}
28
g_free(cmp_buf);
69
29
@@ -XXX,XX +XXX,XX @@ static void aio_read_done(void *opaque, int ret)
70
- s->block_size = be32_to_cpu(dyndisk_header->block_size);
30
memset(cmp_buf, ctx->pattern, ctx->qiov.size);
71
+ s->block_size = be32_to_cpu(dyndisk_header.block_size);
31
if (memcmp(ctx->buf, cmp_buf, ctx->qiov.size)) {
72
if (!is_power_of_2(s->block_size) || s->block_size < BDRV_SECTOR_SIZE) {
32
printf("Pattern verification failed at offset %"
73
error_setg(errp, "Invalid block size %" PRIu32, s->block_size);
33
- PRId64 ", %zd bytes\n", ctx->offset, ctx->qiov.size);
74
ret = -EINVAL;
34
+ PRId64 ", %zu bytes\n", ctx->offset, ctx->qiov.size);
75
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
35
}
76
}
36
g_free(cmp_buf);
77
s->bitmap_size = ((s->block_size / (8 * 512)) + 511) & ~511;
78
79
- s->max_table_entries = be32_to_cpu(dyndisk_header->max_table_entries);
80
+ s->max_table_entries = be32_to_cpu(dyndisk_header.max_table_entries);
81
82
if ((bs->total_sectors * 512) / s->block_size > 0xffffffffU) {
83
error_setg(errp, "Too many blocks");
84
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
85
goto fail;
86
}
87
88
- s->bat_offset = be64_to_cpu(dyndisk_header->table_offset);
89
+ s->bat_offset = be64_to_cpu(dyndisk_header.table_offset);
90
91
ret = bdrv_pread(bs->file, s->bat_offset, s->pagetable,
92
pagetable_size);
93
@@ -XXX,XX +XXX,XX @@ static int calculate_geometry(int64_t total_sectors, uint16_t *cyls,
94
static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
95
int64_t total_sectors)
96
{
97
- uint8_t dyndisk_header_buf[1024];
98
- VHDDynDiskHeader *dyndisk_header =
99
- (VHDDynDiskHeader *)dyndisk_header_buf;
100
+ VHDDynDiskHeader dyndisk_header;
101
uint8_t bat_sector[512];
102
size_t block_size, num_bat_entries;
103
int i;
104
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
105
}
106
107
/* Prepare the Dynamic Disk Header */
108
- memset(dyndisk_header_buf, 0, 1024);
109
+ memset(&dyndisk_header, 0, 1024);
110
111
- memcpy(dyndisk_header->magic, "cxsparse", 8);
112
+ memcpy(dyndisk_header.magic, "cxsparse", 8);
113
114
/*
115
* Note: The spec is actually wrong here for data_offset, it says
116
* 0xFFFFFFFF, but MS tools expect all 64 bits to be set.
117
*/
118
- dyndisk_header->data_offset = cpu_to_be64(0xFFFFFFFFFFFFFFFFULL);
119
- dyndisk_header->table_offset = cpu_to_be64(3 * 512);
120
- dyndisk_header->version = cpu_to_be32(0x00010000);
121
- dyndisk_header->block_size = cpu_to_be32(block_size);
122
- dyndisk_header->max_table_entries = cpu_to_be32(num_bat_entries);
123
+ dyndisk_header.data_offset = cpu_to_be64(0xFFFFFFFFFFFFFFFFULL);
124
+ dyndisk_header.table_offset = cpu_to_be64(3 * 512);
125
+ dyndisk_header.version = cpu_to_be32(0x00010000);
126
+ dyndisk_header.block_size = cpu_to_be32(block_size);
127
+ dyndisk_header.max_table_entries = cpu_to_be32(num_bat_entries);
128
129
- dyndisk_header->checksum = cpu_to_be32(vpc_checksum(dyndisk_header_buf,
130
- 1024));
131
+ dyndisk_header.checksum = cpu_to_be32(vpc_checksum(&dyndisk_header, 1024));
132
133
/* Write the header */
134
offset = 512;
135
136
- ret = blk_pwrite(blk, offset, dyndisk_header_buf, 1024, 0);
137
+ ret = blk_pwrite(blk, offset, &dyndisk_header, 1024, 0);
138
if (ret < 0) {
139
goto fail;
37
}
140
}
38
--
141
--
39
2.19.1
142
2.29.2
40
143
41
144
diff view generated by jsdifflib
1
From: Markus Armbruster <armbru@redhat.com>
2
3
Signed-off-by: Markus Armbruster <armbru@redhat.com>
4
Message-Id: <20201217162003.1102738-7-armbru@redhat.com>
5
Reviewed-by: Max Reitz <mreitz@redhat.com>
1
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2
Reviewed-by: Alberto Garcia <berto@igalia.com>
3
---
7
---
4
block/vpc.c | 2 ++
8
block/vpc.c | 9 +++++----
5
1 file changed, 2 insertions(+)
9
1 file changed, 5 insertions(+), 4 deletions(-)
6
10
7
diff --git a/block/vpc.c b/block/vpc.c
11
diff --git a/block/vpc.c b/block/vpc.c
8
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
9
--- a/block/vpc.c
13
--- a/block/vpc.c
10
+++ b/block/vpc.c
14
+++ b/block/vpc.c
11
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
15
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
16
17
if (disk_type == VHD_DYNAMIC) {
18
ret = bdrv_pread(bs->file, be64_to_cpu(footer->data_offset),
19
- &dyndisk_header, 1024);
20
+ &dyndisk_header, sizeof(dyndisk_header));
21
if (ret < 0) {
22
error_setg(errp, "Error reading dynamic VHD header");
23
goto fail;
24
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
12
}
25
}
13
26
14
qemu_co_mutex_init(&s->lock);
27
/* Prepare the Dynamic Disk Header */
15
+ qemu_opts_del(opts);
28
- memset(&dyndisk_header, 0, 1024);
16
29
+ memset(&dyndisk_header, 0, sizeof(dyndisk_header));
17
return 0;
30
18
31
memcpy(dyndisk_header.magic, "cxsparse", 8);
19
fail:
32
20
+ qemu_opts_del(opts);
33
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
21
qemu_vfree(s->pagetable);
34
dyndisk_header.block_size = cpu_to_be32(block_size);
22
#ifdef CACHE
35
dyndisk_header.max_table_entries = cpu_to_be32(num_bat_entries);
23
g_free(s->pageentry_u8);
36
37
- dyndisk_header.checksum = cpu_to_be32(vpc_checksum(&dyndisk_header, 1024));
38
+ dyndisk_header.checksum = cpu_to_be32(
39
+ vpc_checksum(&dyndisk_header, sizeof(dyndisk_header)));
40
41
/* Write the header */
42
offset = 512;
43
44
- ret = blk_pwrite(blk, offset, &dyndisk_header, 1024, 0);
45
+ ret = blk_pwrite(blk, offset, &dyndisk_header, sizeof(dyndisk_header), 0);
46
if (ret < 0) {
47
goto fail;
48
}
24
--
49
--
25
2.19.1
50
2.29.2
26
51
27
52
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Markus Armbruster <armbru@redhat.com>
2
2
3
Taking the address of a field in a packed struct is a bad idea, because
3
Pad VHDFooter as specified in the "Virtual Hard Disk Image Format
4
it might not be actually aligned enough for that pointer type (and
4
Specification" version 1.0[*]. Change footer buffers from
5
thus cause a crash on dereference on some host architectures). Newer
5
uint8_t[HEADER_SIZE] to VHDFooter. Their size remains the same.
6
versions of clang warn about this. Avoid the bug by not using the
6
7
"modify in place" byte swapping functions.
7
The VHDFooter * variables pointing to a VHDFooter variable right next
8
8
to it are now silly. Eliminate them, and shorten the remaining
9
There are a few places where the in-place swap function is
9
variables' names.
10
used on something other than a packed struct field; we convert
10
11
those anyway, for consistency.
11
Most variables pointing to s->footer are now also silly. Eliminate
12
12
them, too.
13
This patch was produced with the following spatch script:
13
14
14
[*] http://download.microsoft.com/download/f/f/e/ffef50a5-07dd-4cf8-aaa3-442c0673a029/Virtual%20Hard%20Disk%20Format%20Spec_10_18_06.doc
15
@@
15
16
expression E;
16
Signed-off-by: Markus Armbruster <armbru@redhat.com>
17
@@
17
Message-Id: <20201217162003.1102738-8-armbru@redhat.com>
18
-be16_to_cpus(&E);
18
Reviewed-by: Max Reitz <mreitz@redhat.com>
19
+E = be16_to_cpu(E);
20
@@
21
expression E;
22
@@
23
-be32_to_cpus(&E);
24
+E = be32_to_cpu(E);
25
@@
26
expression E;
27
@@
28
-be64_to_cpus(&E);
29
+E = be64_to_cpu(E);
30
@@
31
expression E;
32
@@
33
-cpu_to_be16s(&E);
34
+E = cpu_to_be16(E);
35
@@
36
expression E;
37
@@
38
-cpu_to_be32s(&E);
39
+E = cpu_to_be32(E);
40
@@
41
expression E;
42
@@
43
-cpu_to_be64s(&E);
44
+E = cpu_to_be64(E);
45
46
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
47
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
48
Tested-by: John Snow <jsnow@redhat.com>
49
Reviewed-by: John Snow <jsnow@redhat.com>
50
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
19
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
51
---
20
---
52
block/qcow2-bitmap.c | 24 ++++++++++++------------
21
block/vpc.c | 77 +++++++++++++++++++++++++----------------------------
53
1 file changed, 12 insertions(+), 12 deletions(-)
22
1 file changed, 37 insertions(+), 40 deletions(-)
54
23
55
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
24
diff --git a/block/vpc.c b/block/vpc.c
56
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
57
--- a/block/qcow2-bitmap.c
26
--- a/block/vpc.c
58
+++ b/block/qcow2-bitmap.c
27
+++ b/block/vpc.c
59
@@ -XXX,XX +XXX,XX @@ static inline void bitmap_table_to_be(uint64_t *bitmap_table, size_t size)
28
@@ -XXX,XX +XXX,XX @@ typedef struct vhd_footer {
60
size_t i;
29
QemuUUID uuid;
61
30
62
for (i = 0; i < size; ++i) {
31
uint8_t in_saved_state;
63
- cpu_to_be64s(&bitmap_table[i]);
32
+ uint8_t reserved[427];
64
+ bitmap_table[i] = cpu_to_be64(bitmap_table[i]);
33
} QEMU_PACKED VHDFooter;
65
}
34
66
}
35
+QEMU_BUILD_BUG_ON(sizeof(VHDFooter) != 512);
67
36
+
68
@@ -XXX,XX +XXX,XX @@ static int bitmap_table_load(BlockDriverState *bs, Qcow2BitmapTable *tb,
37
typedef struct vhd_dyndisk_header {
69
}
38
char magic[8]; /* "cxsparse" */
70
39
71
for (i = 0; i < tb->size; ++i) {
40
@@ -XXX,XX +XXX,XX @@ QEMU_BUILD_BUG_ON(sizeof(VHDDynDiskHeader) != 1024);
72
- be64_to_cpus(&table[i]);
41
73
+ table[i] = be64_to_cpu(table[i]);
42
typedef struct BDRVVPCState {
74
ret = check_table_entry(table[i], s->cluster_size);
43
CoMutex lock;
44
- uint8_t footer_buf[HEADER_SIZE];
45
+ VHDFooter footer;
46
uint64_t free_data_block_offset;
47
int max_table_entries;
48
uint32_t *pagetable;
49
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
50
goto fail;
51
}
52
53
- ret = bdrv_pread(bs->file, 0, s->footer_buf, HEADER_SIZE);
54
+ ret = bdrv_pread(bs->file, 0, &s->footer, HEADER_SIZE);
55
if (ret < 0) {
56
error_setg(errp, "Unable to read VHD header");
57
goto fail;
58
}
59
60
- footer = (VHDFooter *) s->footer_buf;
61
+ footer = &s->footer;
62
if (strncmp(footer->creator, "conectix", 8)) {
63
int64_t offset = bdrv_getlength(bs->file->bs);
64
if (offset < 0) {
65
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
66
}
67
68
/* If a fixed disk, the footer is found only at the end of the file */
69
- ret = bdrv_pread(bs->file, offset-HEADER_SIZE, s->footer_buf,
70
+ ret = bdrv_pread(bs->file, offset - HEADER_SIZE, footer,
71
HEADER_SIZE);
75
if (ret < 0) {
72
if (ret < 0) {
76
goto fail;
73
goto fail;
74
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
75
76
checksum = be32_to_cpu(footer->checksum);
77
footer->checksum = 0;
78
- if (vpc_checksum(s->footer_buf, HEADER_SIZE) != checksum) {
79
+ if (vpc_checksum(footer, HEADER_SIZE) != checksum) {
80
error_setg(errp, "Incorrect header checksum");
81
ret = -EINVAL;
82
goto fail;
83
@@ -XXX,XX +XXX,XX @@ static int rewrite_footer(BlockDriverState *bs)
84
BDRVVPCState *s = bs->opaque;
85
int64_t offset = s->free_data_block_offset;
86
87
- ret = bdrv_pwrite_sync(bs->file, offset, s->footer_buf, HEADER_SIZE);
88
+ ret = bdrv_pwrite_sync(bs->file, offset, &s->footer, HEADER_SIZE);
89
if (ret < 0)
90
return ret;
91
77
@@ -XXX,XX +XXX,XX @@ fail:
92
@@ -XXX,XX +XXX,XX @@ fail:
78
93
static int vpc_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
79
static inline void bitmap_dir_entry_to_cpu(Qcow2BitmapDirEntry *entry)
80
{
94
{
81
- be64_to_cpus(&entry->bitmap_table_offset);
95
BDRVVPCState *s = (BDRVVPCState *)bs->opaque;
82
- be32_to_cpus(&entry->bitmap_table_size);
96
- VHDFooter *footer = (VHDFooter *) s->footer_buf;
83
- be32_to_cpus(&entry->flags);
97
84
- be16_to_cpus(&entry->name_size);
98
- if (be32_to_cpu(footer->type) != VHD_FIXED) {
85
- be32_to_cpus(&entry->extra_data_size);
99
+ if (be32_to_cpu(s->footer.type) != VHD_FIXED) {
86
+ entry->bitmap_table_offset = be64_to_cpu(entry->bitmap_table_offset);
100
bdi->cluster_size = s->block_size;
87
+ entry->bitmap_table_size = be32_to_cpu(entry->bitmap_table_size);
101
}
88
+ entry->flags = be32_to_cpu(entry->flags);
102
89
+ entry->name_size = be16_to_cpu(entry->name_size);
103
@@ -XXX,XX +XXX,XX @@ vpc_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
90
+ entry->extra_data_size = be32_to_cpu(entry->extra_data_size);
104
int64_t image_offset;
91
}
105
int64_t n_bytes;
92
106
int64_t bytes_done = 0;
93
static inline void bitmap_dir_entry_to_be(Qcow2BitmapDirEntry *entry)
107
- VHDFooter *footer = (VHDFooter *) s->footer_buf;
108
QEMUIOVector local_qiov;
109
110
- if (be32_to_cpu(footer->type) == VHD_FIXED) {
111
+ if (be32_to_cpu(s->footer.type) == VHD_FIXED) {
112
return bdrv_co_preadv(bs->file, offset, bytes, qiov, 0);
113
}
114
115
@@ -XXX,XX +XXX,XX @@ vpc_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
116
int64_t n_bytes;
117
int64_t bytes_done = 0;
118
int ret = 0;
119
- VHDFooter *footer = (VHDFooter *) s->footer_buf;
120
QEMUIOVector local_qiov;
121
122
- if (be32_to_cpu(footer->type) == VHD_FIXED) {
123
+ if (be32_to_cpu(s->footer.type) == VHD_FIXED) {
124
return bdrv_co_pwritev(bs->file, offset, bytes, qiov, 0);
125
}
126
127
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_block_status(BlockDriverState *bs,
128
BlockDriverState **file)
94
{
129
{
95
- cpu_to_be64s(&entry->bitmap_table_offset);
130
BDRVVPCState *s = bs->opaque;
96
- cpu_to_be32s(&entry->bitmap_table_size);
131
- VHDFooter *footer = (VHDFooter*) s->footer_buf;
97
- cpu_to_be32s(&entry->flags);
132
int64_t image_offset;
98
- cpu_to_be16s(&entry->name_size);
133
bool allocated;
99
- cpu_to_be32s(&entry->extra_data_size);
134
int ret;
100
+ entry->bitmap_table_offset = cpu_to_be64(entry->bitmap_table_offset);
135
int64_t n;
101
+ entry->bitmap_table_size = cpu_to_be32(entry->bitmap_table_size);
136
102
+ entry->flags = cpu_to_be32(entry->flags);
137
- if (be32_to_cpu(footer->type) == VHD_FIXED) {
103
+ entry->name_size = cpu_to_be16(entry->name_size);
138
+ if (be32_to_cpu(s->footer.type) == VHD_FIXED) {
104
+ entry->extra_data_size = cpu_to_be32(entry->extra_data_size);
139
*pnum = bytes;
105
}
140
*map = offset;
106
141
*file = bs->file->bs;
107
static inline int calc_dir_entry_size(size_t name_size, size_t extra_data_size)
142
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
143
BlockBackend *blk = NULL;
144
BlockDriverState *bs = NULL;
145
146
- uint8_t footer_buf[HEADER_SIZE];
147
- VHDFooter *footer = (VHDFooter *)footer_buf;
148
+ VHDFooter footer;
149
uint16_t cyls = 0;
150
uint8_t heads = 0;
151
uint8_t secs_per_cyl = 0;
152
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
153
}
154
155
/* Prepare the Hard Disk Footer */
156
- memset(footer_buf, 0, HEADER_SIZE);
157
+ memset(&footer, 0, HEADER_SIZE);
158
159
- memcpy(footer->creator, "conectix", 8);
160
+ memcpy(footer.creator, "conectix", 8);
161
if (vpc_opts->force_size) {
162
- memcpy(footer->creator_app, "qem2", 4);
163
+ memcpy(footer.creator_app, "qem2", 4);
164
} else {
165
- memcpy(footer->creator_app, "qemu", 4);
166
+ memcpy(footer.creator_app, "qemu", 4);
167
}
168
- memcpy(footer->creator_os, "Wi2k", 4);
169
+ memcpy(footer.creator_os, "Wi2k", 4);
170
171
- footer->features = cpu_to_be32(0x02);
172
- footer->version = cpu_to_be32(0x00010000);
173
+ footer.features = cpu_to_be32(0x02);
174
+ footer.version = cpu_to_be32(0x00010000);
175
if (disk_type == VHD_DYNAMIC) {
176
- footer->data_offset = cpu_to_be64(HEADER_SIZE);
177
+ footer.data_offset = cpu_to_be64(HEADER_SIZE);
178
} else {
179
- footer->data_offset = cpu_to_be64(0xFFFFFFFFFFFFFFFFULL);
180
+ footer.data_offset = cpu_to_be64(0xFFFFFFFFFFFFFFFFULL);
181
}
182
- footer->timestamp = cpu_to_be32(time(NULL) - VHD_TIMESTAMP_BASE);
183
+ footer.timestamp = cpu_to_be32(time(NULL) - VHD_TIMESTAMP_BASE);
184
185
/* Version of Virtual PC 2007 */
186
- footer->major = cpu_to_be16(0x0005);
187
- footer->minor = cpu_to_be16(0x0003);
188
- footer->orig_size = cpu_to_be64(total_size);
189
- footer->current_size = cpu_to_be64(total_size);
190
- footer->cyls = cpu_to_be16(cyls);
191
- footer->heads = heads;
192
- footer->secs_per_cyl = secs_per_cyl;
193
+ footer.major = cpu_to_be16(0x0005);
194
+ footer.minor = cpu_to_be16(0x0003);
195
+ footer.orig_size = cpu_to_be64(total_size);
196
+ footer.current_size = cpu_to_be64(total_size);
197
+ footer.cyls = cpu_to_be16(cyls);
198
+ footer.heads = heads;
199
+ footer.secs_per_cyl = secs_per_cyl;
200
201
- footer->type = cpu_to_be32(disk_type);
202
+ footer.type = cpu_to_be32(disk_type);
203
204
qemu_uuid_generate(&uuid);
205
- footer->uuid = uuid;
206
+ footer.uuid = uuid;
207
208
- footer->checksum = cpu_to_be32(vpc_checksum(footer_buf, HEADER_SIZE));
209
+ footer.checksum = cpu_to_be32(vpc_checksum(&footer, HEADER_SIZE));
210
211
if (disk_type == VHD_DYNAMIC) {
212
- ret = create_dynamic_disk(blk, footer_buf, total_sectors);
213
+ ret = create_dynamic_disk(blk, (uint8_t *)&footer, total_sectors);
214
if (ret < 0) {
215
error_setg(errp, "Unable to create or write VHD header");
216
}
217
} else {
218
- ret = create_fixed_disk(blk, footer_buf, total_size, errp);
219
+ ret = create_fixed_disk(blk, (uint8_t *)&footer, total_size, errp);
220
}
221
222
out:
223
@@ -XXX,XX +XXX,XX @@ fail:
224
static int vpc_has_zero_init(BlockDriverState *bs)
225
{
226
BDRVVPCState *s = bs->opaque;
227
- VHDFooter *footer = (VHDFooter *) s->footer_buf;
228
229
- if (be32_to_cpu(footer->type) == VHD_FIXED) {
230
+ if (be32_to_cpu(s->footer.type) == VHD_FIXED) {
231
return bdrv_has_zero_init(bs->file->bs);
232
} else {
233
return 1;
108
--
234
--
109
2.19.1
235
2.29.2
110
236
111
237
diff view generated by jsdifflib
Deleted patch
1
From: Daniel P. Berrangé <berrange@redhat.com>
2
1
3
The qcow2 block driver expects to see a valid sector size even when it
4
has opened the crypto layer with QCRYPTO_BLOCK_OPEN_NO_IO.
5
6
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
7
Reviewed-by: Alberto Garcia <berto@igalia.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
---
10
crypto/block-qcow.c | 2 ++
11
1 file changed, 2 insertions(+)
12
13
diff --git a/crypto/block-qcow.c b/crypto/block-qcow.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/crypto/block-qcow.c
16
+++ b/crypto/block-qcow.c
17
@@ -XXX,XX +XXX,XX @@ qcrypto_block_qcow_open(QCryptoBlock *block,
18
Error **errp)
19
{
20
if (flags & QCRYPTO_BLOCK_OPEN_NO_IO) {
21
+ block->sector_size = QCRYPTO_BLOCK_QCOW_SECTOR_SIZE;
22
+ block->payload_offset = 0;
23
return 0;
24
} else {
25
if (!options->u.qcow.key_secret) {
26
--
27
2.19.1
28
29
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
This doesn't have any practical effect at the moment because the
4
values of BDRV_SECTOR_SIZE, QCRYPTO_BLOCK_LUKS_SECTOR_SIZE and
5
QCRYPTO_BLOCK_QCOW_SECTOR_SIZE are all the same (512 bytes), but
6
future encryption methods could have different requirements.
7
8
Signed-off-by: Alberto Garcia <berto@igalia.com>
9
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
10
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
11
---
12
block/qcow2.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/block/qcow2.c b/block/qcow2.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/block/qcow2.c
18
+++ b/block/qcow2.c
19
@@ -XXX,XX +XXX,XX @@ static void qcow2_refresh_limits(BlockDriverState *bs, Error **errp)
20
21
if (bs->encrypted) {
22
/* Encryption works on a sector granularity */
23
- bs->bl.request_alignment = BDRV_SECTOR_SIZE;
24
+ bs->bl.request_alignment = qcrypto_block_get_sector_size(s->crypto);
25
}
26
bs->bl.pwrite_zeroes_alignment = s->cluster_size;
27
bs->bl.pdiscard_alignment = s->cluster_size;
28
--
29
2.19.1
30
31
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Markus Armbruster <armbru@redhat.com>
2
2
3
Taking the address of a field in a packed struct is a bad idea, because
3
Signed-off-by: Markus Armbruster <armbru@redhat.com>
4
it might not be actually aligned enough for that pointer type (and
4
Message-Id: <20201217162003.1102738-9-armbru@redhat.com>
5
thus cause a crash on dereference on some host architectures). Newer
5
Reviewed-by: Max Reitz <mreitz@redhat.com>
6
versions of clang warn about this. Avoid the bug by not using the
7
"modify in place" byte swapping functions.
8
9
There are a few places where the in-place swap function is
10
used on something other than a packed struct field; we convert
11
those anyway, for consistency.
12
13
Patch produced with scripts/coccinelle/inplace-byteswaps.cocci.
14
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
17
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
18
---
7
---
19
block/vhdx.h | 12 ++---
8
block/vpc.c | 14 +++++++-------
20
block/vhdx-endian.c | 118 ++++++++++++++++++++++----------------------
9
1 file changed, 7 insertions(+), 7 deletions(-)
21
block/vhdx-log.c | 4 +-
22
block/vhdx.c | 18 +++----
23
4 files changed, 76 insertions(+), 76 deletions(-)
24
10
25
diff --git a/block/vhdx.h b/block/vhdx.h
11
diff --git a/block/vpc.c b/block/vpc.c
26
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
27
--- a/block/vhdx.h
13
--- a/block/vpc.c
28
+++ b/block/vhdx.h
14
+++ b/block/vpc.c
29
@@ -XXX,XX +XXX,XX @@ int vhdx_log_write_and_flush(BlockDriverState *bs, BDRVVHDXState *s,
15
@@ -XXX,XX +XXX,XX @@ static int calculate_geometry(int64_t total_sectors, uint16_t *cyls,
30
16
return 0;
31
static inline void leguid_to_cpus(MSGUID *guid)
17
}
18
19
-static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
20
+static int create_dynamic_disk(BlockBackend *blk, VHDFooter *footer,
21
int64_t total_sectors)
32
{
22
{
33
- le32_to_cpus(&guid->data1);
23
VHDDynDiskHeader dyndisk_header;
34
- le16_to_cpus(&guid->data2);
24
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
35
- le16_to_cpus(&guid->data3);
25
block_size = 0x200000;
36
+ guid->data1 = le32_to_cpu(guid->data1);
26
num_bat_entries = DIV_ROUND_UP(total_sectors, block_size / 512);
37
+ guid->data2 = le16_to_cpu(guid->data2);
27
38
+ guid->data3 = le16_to_cpu(guid->data3);
28
- ret = blk_pwrite(blk, offset, buf, HEADER_SIZE, 0);
29
+ ret = blk_pwrite(blk, offset, footer, HEADER_SIZE, 0);
30
if (ret < 0) {
31
goto fail;
32
}
33
34
offset = 1536 + ((num_bat_entries * 4 + 511) & ~511);
35
- ret = blk_pwrite(blk, offset, buf, HEADER_SIZE, 0);
36
+ ret = blk_pwrite(blk, offset, footer, HEADER_SIZE, 0);
37
if (ret < 0) {
38
goto fail;
39
}
40
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, uint8_t *buf,
41
return ret;
39
}
42
}
40
43
41
static inline void cpu_to_leguids(MSGUID *guid)
44
-static int create_fixed_disk(BlockBackend *blk, uint8_t *buf,
45
+static int create_fixed_disk(BlockBackend *blk, VHDFooter *footer,
46
int64_t total_size, Error **errp)
42
{
47
{
43
- cpu_to_le32s(&guid->data1);
48
int ret;
44
- cpu_to_le16s(&guid->data2);
49
@@ -XXX,XX +XXX,XX @@ static int create_fixed_disk(BlockBackend *blk, uint8_t *buf,
45
- cpu_to_le16s(&guid->data3);
50
return ret;
46
+ guid->data1 = cpu_to_le32(guid->data1);
47
+ guid->data2 = cpu_to_le16(guid->data2);
48
+ guid->data3 = cpu_to_le16(guid->data3);
49
}
50
51
void vhdx_header_le_import(VHDXHeader *h);
52
diff --git a/block/vhdx-endian.c b/block/vhdx-endian.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/block/vhdx-endian.c
55
+++ b/block/vhdx-endian.c
56
@@ -XXX,XX +XXX,XX @@ void vhdx_header_le_import(VHDXHeader *h)
57
{
58
assert(h != NULL);
59
60
- le32_to_cpus(&h->signature);
61
- le32_to_cpus(&h->checksum);
62
- le64_to_cpus(&h->sequence_number);
63
+ h->signature = le32_to_cpu(h->signature);
64
+ h->checksum = le32_to_cpu(h->checksum);
65
+ h->sequence_number = le64_to_cpu(h->sequence_number);
66
67
leguid_to_cpus(&h->file_write_guid);
68
leguid_to_cpus(&h->data_write_guid);
69
leguid_to_cpus(&h->log_guid);
70
71
- le16_to_cpus(&h->log_version);
72
- le16_to_cpus(&h->version);
73
- le32_to_cpus(&h->log_length);
74
- le64_to_cpus(&h->log_offset);
75
+ h->log_version = le16_to_cpu(h->log_version);
76
+ h->version = le16_to_cpu(h->version);
77
+ h->log_length = le32_to_cpu(h->log_length);
78
+ h->log_offset = le64_to_cpu(h->log_offset);
79
}
80
81
void vhdx_header_le_export(VHDXHeader *orig_h, VHDXHeader *new_h)
82
@@ -XXX,XX +XXX,XX @@ void vhdx_log_desc_le_import(VHDXLogDescriptor *d)
83
{
84
assert(d != NULL);
85
86
- le32_to_cpus(&d->signature);
87
- le64_to_cpus(&d->file_offset);
88
- le64_to_cpus(&d->sequence_number);
89
+ d->signature = le32_to_cpu(d->signature);
90
+ d->file_offset = le64_to_cpu(d->file_offset);
91
+ d->sequence_number = le64_to_cpu(d->sequence_number);
92
}
93
94
void vhdx_log_desc_le_export(VHDXLogDescriptor *d)
95
{
96
assert(d != NULL);
97
98
- cpu_to_le32s(&d->signature);
99
- cpu_to_le32s(&d->trailing_bytes);
100
- cpu_to_le64s(&d->leading_bytes);
101
- cpu_to_le64s(&d->file_offset);
102
- cpu_to_le64s(&d->sequence_number);
103
+ d->signature = cpu_to_le32(d->signature);
104
+ d->trailing_bytes = cpu_to_le32(d->trailing_bytes);
105
+ d->leading_bytes = cpu_to_le64(d->leading_bytes);
106
+ d->file_offset = cpu_to_le64(d->file_offset);
107
+ d->sequence_number = cpu_to_le64(d->sequence_number);
108
}
109
110
void vhdx_log_data_le_import(VHDXLogDataSector *d)
111
{
112
assert(d != NULL);
113
114
- le32_to_cpus(&d->data_signature);
115
- le32_to_cpus(&d->sequence_high);
116
- le32_to_cpus(&d->sequence_low);
117
+ d->data_signature = le32_to_cpu(d->data_signature);
118
+ d->sequence_high = le32_to_cpu(d->sequence_high);
119
+ d->sequence_low = le32_to_cpu(d->sequence_low);
120
}
121
122
void vhdx_log_data_le_export(VHDXLogDataSector *d)
123
{
124
assert(d != NULL);
125
126
- cpu_to_le32s(&d->data_signature);
127
- cpu_to_le32s(&d->sequence_high);
128
- cpu_to_le32s(&d->sequence_low);
129
+ d->data_signature = cpu_to_le32(d->data_signature);
130
+ d->sequence_high = cpu_to_le32(d->sequence_high);
131
+ d->sequence_low = cpu_to_le32(d->sequence_low);
132
}
133
134
void vhdx_log_entry_hdr_le_import(VHDXLogEntryHeader *hdr)
135
{
136
assert(hdr != NULL);
137
138
- le32_to_cpus(&hdr->signature);
139
- le32_to_cpus(&hdr->checksum);
140
- le32_to_cpus(&hdr->entry_length);
141
- le32_to_cpus(&hdr->tail);
142
- le64_to_cpus(&hdr->sequence_number);
143
- le32_to_cpus(&hdr->descriptor_count);
144
+ hdr->signature = le32_to_cpu(hdr->signature);
145
+ hdr->checksum = le32_to_cpu(hdr->checksum);
146
+ hdr->entry_length = le32_to_cpu(hdr->entry_length);
147
+ hdr->tail = le32_to_cpu(hdr->tail);
148
+ hdr->sequence_number = le64_to_cpu(hdr->sequence_number);
149
+ hdr->descriptor_count = le32_to_cpu(hdr->descriptor_count);
150
leguid_to_cpus(&hdr->log_guid);
151
- le64_to_cpus(&hdr->flushed_file_offset);
152
- le64_to_cpus(&hdr->last_file_offset);
153
+ hdr->flushed_file_offset = le64_to_cpu(hdr->flushed_file_offset);
154
+ hdr->last_file_offset = le64_to_cpu(hdr->last_file_offset);
155
}
156
157
void vhdx_log_entry_hdr_le_export(VHDXLogEntryHeader *hdr)
158
{
159
assert(hdr != NULL);
160
161
- cpu_to_le32s(&hdr->signature);
162
- cpu_to_le32s(&hdr->checksum);
163
- cpu_to_le32s(&hdr->entry_length);
164
- cpu_to_le32s(&hdr->tail);
165
- cpu_to_le64s(&hdr->sequence_number);
166
- cpu_to_le32s(&hdr->descriptor_count);
167
+ hdr->signature = cpu_to_le32(hdr->signature);
168
+ hdr->checksum = cpu_to_le32(hdr->checksum);
169
+ hdr->entry_length = cpu_to_le32(hdr->entry_length);
170
+ hdr->tail = cpu_to_le32(hdr->tail);
171
+ hdr->sequence_number = cpu_to_le64(hdr->sequence_number);
172
+ hdr->descriptor_count = cpu_to_le32(hdr->descriptor_count);
173
cpu_to_leguids(&hdr->log_guid);
174
- cpu_to_le64s(&hdr->flushed_file_offset);
175
- cpu_to_le64s(&hdr->last_file_offset);
176
+ hdr->flushed_file_offset = cpu_to_le64(hdr->flushed_file_offset);
177
+ hdr->last_file_offset = cpu_to_le64(hdr->last_file_offset);
178
}
179
180
181
@@ -XXX,XX +XXX,XX @@ void vhdx_region_header_le_import(VHDXRegionTableHeader *hdr)
182
{
183
assert(hdr != NULL);
184
185
- le32_to_cpus(&hdr->signature);
186
- le32_to_cpus(&hdr->checksum);
187
- le32_to_cpus(&hdr->entry_count);
188
+ hdr->signature = le32_to_cpu(hdr->signature);
189
+ hdr->checksum = le32_to_cpu(hdr->checksum);
190
+ hdr->entry_count = le32_to_cpu(hdr->entry_count);
191
}
192
193
void vhdx_region_header_le_export(VHDXRegionTableHeader *hdr)
194
{
195
assert(hdr != NULL);
196
197
- cpu_to_le32s(&hdr->signature);
198
- cpu_to_le32s(&hdr->checksum);
199
- cpu_to_le32s(&hdr->entry_count);
200
+ hdr->signature = cpu_to_le32(hdr->signature);
201
+ hdr->checksum = cpu_to_le32(hdr->checksum);
202
+ hdr->entry_count = cpu_to_le32(hdr->entry_count);
203
}
204
205
void vhdx_region_entry_le_import(VHDXRegionTableEntry *e)
206
@@ -XXX,XX +XXX,XX @@ void vhdx_region_entry_le_import(VHDXRegionTableEntry *e)
207
assert(e != NULL);
208
209
leguid_to_cpus(&e->guid);
210
- le64_to_cpus(&e->file_offset);
211
- le32_to_cpus(&e->length);
212
- le32_to_cpus(&e->data_bits);
213
+ e->file_offset = le64_to_cpu(e->file_offset);
214
+ e->length = le32_to_cpu(e->length);
215
+ e->data_bits = le32_to_cpu(e->data_bits);
216
}
217
218
void vhdx_region_entry_le_export(VHDXRegionTableEntry *e)
219
@@ -XXX,XX +XXX,XX @@ void vhdx_region_entry_le_export(VHDXRegionTableEntry *e)
220
assert(e != NULL);
221
222
cpu_to_leguids(&e->guid);
223
- cpu_to_le64s(&e->file_offset);
224
- cpu_to_le32s(&e->length);
225
- cpu_to_le32s(&e->data_bits);
226
+ e->file_offset = cpu_to_le64(e->file_offset);
227
+ e->length = cpu_to_le32(e->length);
228
+ e->data_bits = cpu_to_le32(e->data_bits);
229
}
230
231
232
@@ -XXX,XX +XXX,XX @@ void vhdx_metadata_header_le_import(VHDXMetadataTableHeader *hdr)
233
{
234
assert(hdr != NULL);
235
236
- le64_to_cpus(&hdr->signature);
237
- le16_to_cpus(&hdr->entry_count);
238
+ hdr->signature = le64_to_cpu(hdr->signature);
239
+ hdr->entry_count = le16_to_cpu(hdr->entry_count);
240
}
241
242
void vhdx_metadata_header_le_export(VHDXMetadataTableHeader *hdr)
243
{
244
assert(hdr != NULL);
245
246
- cpu_to_le64s(&hdr->signature);
247
- cpu_to_le16s(&hdr->entry_count);
248
+ hdr->signature = cpu_to_le64(hdr->signature);
249
+ hdr->entry_count = cpu_to_le16(hdr->entry_count);
250
}
251
252
void vhdx_metadata_entry_le_import(VHDXMetadataTableEntry *e)
253
@@ -XXX,XX +XXX,XX @@ void vhdx_metadata_entry_le_import(VHDXMetadataTableEntry *e)
254
assert(e != NULL);
255
256
leguid_to_cpus(&e->item_id);
257
- le32_to_cpus(&e->offset);
258
- le32_to_cpus(&e->length);
259
- le32_to_cpus(&e->data_bits);
260
+ e->offset = le32_to_cpu(e->offset);
261
+ e->length = le32_to_cpu(e->length);
262
+ e->data_bits = le32_to_cpu(e->data_bits);
263
}
264
void vhdx_metadata_entry_le_export(VHDXMetadataTableEntry *e)
265
{
266
assert(e != NULL);
267
268
cpu_to_leguids(&e->item_id);
269
- cpu_to_le32s(&e->offset);
270
- cpu_to_le32s(&e->length);
271
- cpu_to_le32s(&e->data_bits);
272
+ e->offset = cpu_to_le32(e->offset);
273
+ e->length = cpu_to_le32(e->length);
274
+ e->data_bits = cpu_to_le32(e->data_bits);
275
}
276
diff --git a/block/vhdx-log.c b/block/vhdx-log.c
277
index XXXXXXX..XXXXXXX 100644
278
--- a/block/vhdx-log.c
279
+++ b/block/vhdx-log.c
280
@@ -XXX,XX +XXX,XX @@ static void vhdx_log_raw_to_le_sector(VHDXLogDescriptor *desc,
281
/* 8 + 4084 + 4 = 4096, 1 log sector */
282
memcpy(&desc->leading_bytes, data, 8);
283
data += 8;
284
- cpu_to_le64s(&desc->leading_bytes);
285
+ desc->leading_bytes = cpu_to_le64(desc->leading_bytes);
286
memcpy(sector->data, data, 4084);
287
data += 4084;
288
memcpy(&desc->trailing_bytes, data, 4);
289
- cpu_to_le32s(&desc->trailing_bytes);
290
+ desc->trailing_bytes = cpu_to_le32(desc->trailing_bytes);
291
data += 4;
292
293
sector->sequence_high = (uint32_t) (seq >> 32);
294
diff --git a/block/vhdx.c b/block/vhdx.c
295
index XXXXXXX..XXXXXXX 100644
296
--- a/block/vhdx.c
297
+++ b/block/vhdx.c
298
@@ -XXX,XX +XXX,XX @@ uint32_t vhdx_update_checksum(uint8_t *buf, size_t size, int crc_offset)
299
300
memset(buf + crc_offset, 0, sizeof(crc));
301
crc = crc32c(0xffffffff, buf, size);
302
- cpu_to_le32s(&crc);
303
+ crc = cpu_to_le32(crc);
304
memcpy(buf + crc_offset, &crc, sizeof(crc));
305
306
return crc;
307
@@ -XXX,XX +XXX,XX @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
308
goto exit;
309
}
51
}
310
52
311
- le32_to_cpus(&s->params.block_size);
53
- ret = blk_pwrite(blk, total_size - HEADER_SIZE, buf, HEADER_SIZE, 0);
312
- le32_to_cpus(&s->params.data_bits);
54
+ ret = blk_pwrite(blk, total_size - HEADER_SIZE, footer, HEADER_SIZE, 0);
313
+ s->params.block_size = le32_to_cpu(s->params.block_size);
55
if (ret < 0) {
314
+ s->params.data_bits = le32_to_cpu(s->params.data_bits);
56
error_setg_errno(errp, -ret, "Unable to write VHD header");
315
57
return ret;
316
58
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
317
/* We now have the file parameters, so we can tell if this is a
59
footer.checksum = cpu_to_be32(vpc_checksum(&footer, HEADER_SIZE));
318
@@ -XXX,XX +XXX,XX @@ static int vhdx_parse_metadata(BlockDriverState *bs, BDRVVHDXState *s)
60
319
goto exit;
61
if (disk_type == VHD_DYNAMIC) {
62
- ret = create_dynamic_disk(blk, (uint8_t *)&footer, total_sectors);
63
+ ret = create_dynamic_disk(blk, &footer, total_sectors);
64
if (ret < 0) {
65
error_setg(errp, "Unable to create or write VHD header");
66
}
67
} else {
68
- ret = create_fixed_disk(blk, (uint8_t *)&footer, total_size, errp);
69
+ ret = create_fixed_disk(blk, &footer, total_size, errp);
320
}
70
}
321
71
322
- le64_to_cpus(&s->virtual_disk_size);
72
out:
323
- le32_to_cpus(&s->logical_sector_size);
324
- le32_to_cpus(&s->physical_sector_size);
325
+ s->virtual_disk_size = le64_to_cpu(s->virtual_disk_size);
326
+ s->logical_sector_size = le32_to_cpu(s->logical_sector_size);
327
+ s->physical_sector_size = le32_to_cpu(s->physical_sector_size);
328
329
if (s->params.block_size < VHDX_BLOCK_SIZE_MIN ||
330
s->params.block_size > VHDX_BLOCK_SIZE_MAX) {
331
@@ -XXX,XX +XXX,XX @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
332
/* endian convert, and verify populated BAT field file offsets against
333
* region table and log entries */
334
for (i = 0; i < s->bat_entries; i++) {
335
- le64_to_cpus(&s->bat[i]);
336
+ s->bat[i] = le64_to_cpu(s->bat[i]);
337
if (payblocks--) {
338
/* payload bat entries */
339
if ((s->bat[i] & VHDX_BAT_STATE_BIT_MASK) ==
340
@@ -XXX,XX +XXX,XX @@ static int vhdx_create_new_metadata(BlockBackend *blk,
341
mt_file_params->block_size = cpu_to_le32(block_size);
342
if (type == VHDX_TYPE_FIXED) {
343
mt_file_params->data_bits |= VHDX_PARAMS_LEAVE_BLOCKS_ALLOCED;
344
- cpu_to_le32s(&mt_file_params->data_bits);
345
+ mt_file_params->data_bits = cpu_to_le32(mt_file_params->data_bits);
346
}
347
348
vhdx_guid_generate(&mt_page83->page_83_data);
349
@@ -XXX,XX +XXX,XX @@ static int vhdx_create_bat(BlockBackend *blk, BDRVVHDXState *s,
350
sinfo.file_offset = ROUND_UP(sinfo.file_offset, MiB);
351
vhdx_update_bat_table_entry(blk_bs(blk), s, &sinfo, &unused, &unused,
352
block_state);
353
- cpu_to_le64s(&s->bat[sinfo.bat_idx]);
354
+ s->bat[sinfo.bat_idx] = cpu_to_le64(s->bat[sinfo.bat_idx]);
355
sector_num += s->sectors_per_block;
356
}
357
ret = blk_pwrite(blk, file_offset, s->bat, length, 0);
358
--
73
--
359
2.19.1
74
2.29.2
360
75
361
76
diff view generated by jsdifflib
Deleted patch
1
From: Peter Maydell <peter.maydell@linaro.org>
2
1
3
Taking the address of a field in a packed struct is a bad idea, because
4
it might not be actually aligned enough for that pointer type (and
5
thus cause a crash on dereference on some host architectures). Newer
6
versions of clang warn about this. Avoid the bug by not using the
7
"modify in place" byte swapping functions.
8
9
There are a few places where the in-place swap function is
10
used on something other than a packed struct field; we convert
11
those anyway, for consistency.
12
13
Patch produced with scripts/coccinelle/inplace-byteswaps.cocci.
14
15
There are other places where we take the address of a packed member
16
in this file for other purposes than passing it to a byteswap
17
function (all the calls to qemu_uuid_*()); we leave those for now.
18
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
21
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
22
---
23
block/vdi.c | 64 ++++++++++++++++++++++++++---------------------------
24
1 file changed, 32 insertions(+), 32 deletions(-)
25
26
diff --git a/block/vdi.c b/block/vdi.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/block/vdi.c
29
+++ b/block/vdi.c
30
@@ -XXX,XX +XXX,XX @@ typedef struct {
31
32
static void vdi_header_to_cpu(VdiHeader *header)
33
{
34
- le32_to_cpus(&header->signature);
35
- le32_to_cpus(&header->version);
36
- le32_to_cpus(&header->header_size);
37
- le32_to_cpus(&header->image_type);
38
- le32_to_cpus(&header->image_flags);
39
- le32_to_cpus(&header->offset_bmap);
40
- le32_to_cpus(&header->offset_data);
41
- le32_to_cpus(&header->cylinders);
42
- le32_to_cpus(&header->heads);
43
- le32_to_cpus(&header->sectors);
44
- le32_to_cpus(&header->sector_size);
45
- le64_to_cpus(&header->disk_size);
46
- le32_to_cpus(&header->block_size);
47
- le32_to_cpus(&header->block_extra);
48
- le32_to_cpus(&header->blocks_in_image);
49
- le32_to_cpus(&header->blocks_allocated);
50
+ header->signature = le32_to_cpu(header->signature);
51
+ header->version = le32_to_cpu(header->version);
52
+ header->header_size = le32_to_cpu(header->header_size);
53
+ header->image_type = le32_to_cpu(header->image_type);
54
+ header->image_flags = le32_to_cpu(header->image_flags);
55
+ header->offset_bmap = le32_to_cpu(header->offset_bmap);
56
+ header->offset_data = le32_to_cpu(header->offset_data);
57
+ header->cylinders = le32_to_cpu(header->cylinders);
58
+ header->heads = le32_to_cpu(header->heads);
59
+ header->sectors = le32_to_cpu(header->sectors);
60
+ header->sector_size = le32_to_cpu(header->sector_size);
61
+ header->disk_size = le64_to_cpu(header->disk_size);
62
+ header->block_size = le32_to_cpu(header->block_size);
63
+ header->block_extra = le32_to_cpu(header->block_extra);
64
+ header->blocks_in_image = le32_to_cpu(header->blocks_in_image);
65
+ header->blocks_allocated = le32_to_cpu(header->blocks_allocated);
66
qemu_uuid_bswap(&header->uuid_image);
67
qemu_uuid_bswap(&header->uuid_last_snap);
68
qemu_uuid_bswap(&header->uuid_link);
69
@@ -XXX,XX +XXX,XX @@ static void vdi_header_to_cpu(VdiHeader *header)
70
71
static void vdi_header_to_le(VdiHeader *header)
72
{
73
- cpu_to_le32s(&header->signature);
74
- cpu_to_le32s(&header->version);
75
- cpu_to_le32s(&header->header_size);
76
- cpu_to_le32s(&header->image_type);
77
- cpu_to_le32s(&header->image_flags);
78
- cpu_to_le32s(&header->offset_bmap);
79
- cpu_to_le32s(&header->offset_data);
80
- cpu_to_le32s(&header->cylinders);
81
- cpu_to_le32s(&header->heads);
82
- cpu_to_le32s(&header->sectors);
83
- cpu_to_le32s(&header->sector_size);
84
- cpu_to_le64s(&header->disk_size);
85
- cpu_to_le32s(&header->block_size);
86
- cpu_to_le32s(&header->block_extra);
87
- cpu_to_le32s(&header->blocks_in_image);
88
- cpu_to_le32s(&header->blocks_allocated);
89
+ header->signature = cpu_to_le32(header->signature);
90
+ header->version = cpu_to_le32(header->version);
91
+ header->header_size = cpu_to_le32(header->header_size);
92
+ header->image_type = cpu_to_le32(header->image_type);
93
+ header->image_flags = cpu_to_le32(header->image_flags);
94
+ header->offset_bmap = cpu_to_le32(header->offset_bmap);
95
+ header->offset_data = cpu_to_le32(header->offset_data);
96
+ header->cylinders = cpu_to_le32(header->cylinders);
97
+ header->heads = cpu_to_le32(header->heads);
98
+ header->sectors = cpu_to_le32(header->sectors);
99
+ header->sector_size = cpu_to_le32(header->sector_size);
100
+ header->disk_size = cpu_to_le64(header->disk_size);
101
+ header->block_size = cpu_to_le32(header->block_size);
102
+ header->block_extra = cpu_to_le32(header->block_extra);
103
+ header->blocks_in_image = cpu_to_le32(header->blocks_in_image);
104
+ header->blocks_allocated = cpu_to_le32(header->blocks_allocated);
105
qemu_uuid_bswap(&header->uuid_image);
106
qemu_uuid_bswap(&header->uuid_last_snap);
107
qemu_uuid_bswap(&header->uuid_link);
108
--
109
2.19.1
110
111
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
This is a static function with only one caller, so there's no need to
4
keep it. Inlining the code in quorum_compare() makes it much simpler.
5
6
Signed-off-by: Alberto Garcia <berto@igalia.com>
7
Reported-by: Markus Armbruster <armbru@redhat.com>
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
---
10
block/quorum.c | 24 +++++-------------------
11
1 file changed, 5 insertions(+), 19 deletions(-)
12
13
diff --git a/block/quorum.c b/block/quorum.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/block/quorum.c
16
+++ b/block/quorum.c
17
@@ -XXX,XX +XXX,XX @@ static bool quorum_iovec_compare(QEMUIOVector *a, QEMUIOVector *b)
18
return true;
19
}
20
21
-static void GCC_FMT_ATTR(2, 3) quorum_err(QuorumAIOCB *acb,
22
- const char *fmt, ...)
23
-{
24
- va_list ap;
25
-
26
- va_start(ap, fmt);
27
- fprintf(stderr, "quorum: offset=%" PRIu64 " bytes=%" PRIu64 " ",
28
- acb->offset, acb->bytes);
29
- vfprintf(stderr, fmt, ap);
30
- fprintf(stderr, "\n");
31
- va_end(ap);
32
- exit(1);
33
-}
34
-
35
-static bool quorum_compare(QuorumAIOCB *acb,
36
- QEMUIOVector *a,
37
- QEMUIOVector *b)
38
+static bool quorum_compare(QuorumAIOCB *acb, QEMUIOVector *a, QEMUIOVector *b)
39
{
40
BDRVQuorumState *s = acb->bs->opaque;
41
ssize_t offset;
42
@@ -XXX,XX +XXX,XX @@ static bool quorum_compare(QuorumAIOCB *acb,
43
if (s->is_blkverify) {
44
offset = qemu_iovec_compare(a, b);
45
if (offset != -1) {
46
- quorum_err(acb, "contents mismatch at offset %" PRIu64,
47
- acb->offset + offset);
48
+ fprintf(stderr, "quorum: offset=%" PRIu64 " bytes=%" PRIu64
49
+ " contents mismatch at offset %" PRIu64 "\n",
50
+ acb->offset, acb->bytes, acb->offset + offset);
51
+ exit(1);
52
}
53
return true;
54
}
55
--
56
2.19.1
57
58
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
The blkverify mode of Quorum can only be enabled if the number of
4
children is exactly two and the value of vote-threshold is also two.
5
6
If the user tries to enable it but the other settings are incorrect
7
then QEMU simply prints an error message to stderr and carries on
8
disabling the blkverify setting.
9
10
This patch makes quorum_open() fail and return an error in this case.
11
12
Signed-off-by: Alberto Garcia <berto@igalia.com>
13
Reported-by: Markus Armbruster <armbru@redhat.com>
14
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
15
---
16
block/quorum.c | 13 ++++++-------
17
1 file changed, 6 insertions(+), 7 deletions(-)
18
19
diff --git a/block/quorum.c b/block/quorum.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/block/quorum.c
22
+++ b/block/quorum.c
23
@@ -XXX,XX +XXX,XX @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
24
s->read_pattern = ret;
25
26
if (s->read_pattern == QUORUM_READ_PATTERN_QUORUM) {
27
- /* is the driver in blkverify mode */
28
- if (qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false) &&
29
- s->num_children == 2 && s->threshold == 2) {
30
- s->is_blkverify = true;
31
- } else if (qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false)) {
32
- fprintf(stderr, "blkverify mode is set by setting blkverify=on "
33
- "and using two files with vote_threshold=2\n");
34
+ s->is_blkverify = qemu_opt_get_bool(opts, QUORUM_OPT_BLKVERIFY, false);
35
+ if (s->is_blkverify && (s->num_children != 2 || s->threshold != 2)) {
36
+ error_setg(&local_err, "blkverify=on can only be set if there are "
37
+ "exactly two files and vote-threshold is 2");
38
+ ret = -EINVAL;
39
+ goto exit;
40
}
41
42
s->rewrite_corrupted = qemu_opt_get_bool(opts, QUORUM_OPT_REWRITE,
43
--
44
2.19.1
45
46
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
Signed-off-by: Alberto Garcia <berto@igalia.com>
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
5
---
6
tests/qemu-iotests/081 | 30 ++++++++++++++++++++++++++++++
7
tests/qemu-iotests/081.out | 16 ++++++++++++++++
8
2 files changed, 46 insertions(+)
9
10
diff --git a/tests/qemu-iotests/081 b/tests/qemu-iotests/081
11
index XXXXXXX..XXXXXXX 100755
12
--- a/tests/qemu-iotests/081
13
+++ b/tests/qemu-iotests/081
14
@@ -XXX,XX +XXX,XX @@ echo "== checking that quorum is broken =="
15
16
$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io
17
18
+echo
19
+echo "== checking the blkverify mode with broken content =="
20
+
21
+quorum="driver=raw,file.driver=quorum,file.vote-threshold=2,file.blkverify=on"
22
+quorum="$quorum,file.children.0.file.filename=$TEST_DIR/1.raw"
23
+quorum="$quorum,file.children.1.file.filename=$TEST_DIR/2.raw"
24
+quorum="$quorum,file.children.0.driver=raw"
25
+quorum="$quorum,file.children.1.driver=raw"
26
+
27
+$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io
28
+
29
+echo
30
+echo "== writing the same data to both files =="
31
+
32
+$QEMU_IO -c "write -P 0x32 0 $size" "$TEST_DIR/1.raw" | _filter_qemu_io
33
+$QEMU_IO -c "write -P 0x32 0 $size" "$TEST_DIR/2.raw" | _filter_qemu_io
34
+
35
+echo
36
+echo "== checking the blkverify mode with valid content =="
37
+
38
+$QEMU_IO -c "open -o $quorum" -c "read -P 0x32 0 $size" | _filter_qemu_io
39
+
40
+echo
41
+echo "== checking the blkverify mode with invalid settings =="
42
+
43
+quorum="$quorum,file.children.2.file.filename=$TEST_DIR/3.raw"
44
+quorum="$quorum,file.children.2.driver=raw"
45
+
46
+$QEMU_IO -c "open -o $quorum" | _filter_qemu_io
47
+
48
# success, all done
49
echo "*** done"
50
rm -f $seq.full
51
diff --git a/tests/qemu-iotests/081.out b/tests/qemu-iotests/081.out
52
index XXXXXXX..XXXXXXX 100644
53
--- a/tests/qemu-iotests/081.out
54
+++ b/tests/qemu-iotests/081.out
55
@@ -XXX,XX +XXX,XX @@ wrote 10485760/10485760 bytes at offset 0
56
57
== checking that quorum is broken ==
58
read failed: Input/output error
59
+
60
+== checking the blkverify mode with broken content ==
61
+quorum: offset=0 bytes=10485760 contents mismatch at offset 0
62
+
63
+== writing the same data to both files ==
64
+wrote 10485760/10485760 bytes at offset 0
65
+10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
66
+wrote 10485760/10485760 bytes at offset 0
67
+10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
68
+
69
+== checking the blkverify mode with valid content ==
70
+read 10485760/10485760 bytes at offset 0
71
+10 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
72
+
73
+== checking the blkverify mode with invalid settings ==
74
+can't open: blkverify=on can only be set if there are exactly two files and vote-threshold is 2
75
*** done
76
--
77
2.19.1
78
79
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
The blkverify mode of Quorum only works when the number of children is
4
exactly two, so any attempt to add a new one must return an error.
5
6
quorum_del_child() on the other hand doesn't need any additional check
7
because decreasing the number of children would make it go under the
8
vote threshold.
9
10
Signed-off-by: Alberto Garcia <berto@igalia.com>
11
Reported-by: Kevin Wolf <kwolf@redhat.com>
12
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
13
---
14
block/quorum.c | 8 ++++++++
15
1 file changed, 8 insertions(+)
16
17
diff --git a/block/quorum.c b/block/quorum.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/block/quorum.c
20
+++ b/block/quorum.c
21
@@ -XXX,XX +XXX,XX @@ static void quorum_add_child(BlockDriverState *bs, BlockDriverState *child_bs,
22
char indexstr[32];
23
int ret;
24
25
+ if (s->is_blkverify) {
26
+ error_setg(errp, "Cannot add a child to a quorum in blkverify mode");
27
+ return;
28
+ }
29
+
30
assert(s->num_children <= INT_MAX / sizeof(BdrvChild *));
31
if (s->num_children == INT_MAX / sizeof(BdrvChild *) ||
32
s->next_child_index == UINT_MAX) {
33
@@ -XXX,XX +XXX,XX @@ static void quorum_del_child(BlockDriverState *bs, BdrvChild *child,
34
return;
35
}
36
37
+ /* We know now that num_children > threshold, so blkverify must be false */
38
+ assert(!s->is_blkverify);
39
+
40
bdrv_drained_begin(bs);
41
42
/* We can safely remove this child now */
43
--
44
2.19.1
45
46
diff view generated by jsdifflib
Deleted patch
1
From: Alberto Garcia <berto@igalia.com>
2
1
3
This patch tests that you can add and remove drives from a Quorum
4
using the x-blockdev-change command.
5
6
Signed-off-by: Alberto Garcia <berto@igalia.com>
7
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
8
---
9
tests/qemu-iotests/081 | 86 ++++++++++++++++++++++++++++++++++++++
10
tests/qemu-iotests/081.out | 54 ++++++++++++++++++++++++
11
2 files changed, 140 insertions(+)
12
13
diff --git a/tests/qemu-iotests/081 b/tests/qemu-iotests/081
14
index XXXXXXX..XXXXXXX 100755
15
--- a/tests/qemu-iotests/081
16
+++ b/tests/qemu-iotests/081
17
@@ -XXX,XX +XXX,XX @@ quorum="$quorum,file.children.2.driver=raw"
18
19
$QEMU_IO -c "open -o $quorum" | _filter_qemu_io
20
21
+echo
22
+echo "== dynamically adding a child to a quorum =="
23
+
24
+for verify in false true; do
25
+ run_qemu <<EOF
26
+ { "execute": "qmp_capabilities" }
27
+ { "execute": "blockdev-add",
28
+ "arguments": {
29
+ "driver": "quorum",
30
+ "node-name": "drive0-quorum",
31
+ "vote-threshold": 2,
32
+ "blkverify": ${verify},
33
+ "children": [
34
+ {
35
+ "driver": "$IMGFMT",
36
+ "file": {
37
+ "driver": "file",
38
+ "filename": "$TEST_DIR/1.raw"
39
+ }
40
+ },
41
+ {
42
+ "driver": "$IMGFMT",
43
+ "file": {
44
+ "driver": "file",
45
+ "filename": "$TEST_DIR/2.raw"
46
+ }
47
+ }
48
+ ]
49
+ }
50
+ }
51
+ { "execute": "blockdev-add",
52
+ "arguments": {
53
+ "node-name": "drive3",
54
+ "driver": "$IMGFMT",
55
+ "file": {
56
+ "driver": "file",
57
+ "filename": "$TEST_DIR/2.raw"
58
+ }
59
+ }
60
+ }
61
+ { "execute": "x-blockdev-change",
62
+ "arguments": { "parent": "drive0-quorum",
63
+ "node": "drive3" } }
64
+ { "execute": "quit" }
65
+EOF
66
+done
67
+
68
+echo
69
+echo "== dynamically removing a child from a quorum =="
70
+
71
+for verify in false true; do
72
+ for vote_threshold in 1 2; do
73
+ run_qemu <<EOF
74
+ { "execute": "qmp_capabilities" }
75
+ { "execute": "blockdev-add",
76
+ "arguments": {
77
+ "driver": "quorum",
78
+ "node-name": "drive0-quorum",
79
+ "vote-threshold": ${vote_threshold},
80
+ "blkverify": ${verify},
81
+ "children": [
82
+ {
83
+ "driver": "$IMGFMT",
84
+ "file": {
85
+ "driver": "file",
86
+ "filename": "$TEST_DIR/1.raw"
87
+ }
88
+ },
89
+ {
90
+ "driver": "$IMGFMT",
91
+ "file": {
92
+ "driver": "file",
93
+ "filename": "$TEST_DIR/2.raw"
94
+ }
95
+ }
96
+ ]
97
+ }
98
+ }
99
+ { "execute": "x-blockdev-change",
100
+ "arguments": { "parent": "drive0-quorum",
101
+ "child": "children.1" } }
102
+ { "execute": "quit" }
103
+EOF
104
+ done
105
+done
106
+
107
# success, all done
108
echo "*** done"
109
rm -f $seq.full
110
diff --git a/tests/qemu-iotests/081.out b/tests/qemu-iotests/081.out
111
index XXXXXXX..XXXXXXX 100644
112
--- a/tests/qemu-iotests/081.out
113
+++ b/tests/qemu-iotests/081.out
114
@@ -XXX,XX +XXX,XX @@ read 10485760/10485760 bytes at offset 0
115
116
== checking the blkverify mode with invalid settings ==
117
can't open: blkverify=on can only be set if there are exactly two files and vote-threshold is 2
118
+
119
+== dynamically adding a child to a quorum ==
120
+Testing:
121
+QMP_VERSION
122
+{"return": {}}
123
+{"return": {}}
124
+{"return": {}}
125
+{"return": {}}
126
+{"return": {}}
127
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
128
+
129
+Testing:
130
+QMP_VERSION
131
+{"return": {}}
132
+{"return": {}}
133
+{"return": {}}
134
+{"error": {"class": "GenericError", "desc": "Cannot add a child to a quorum in blkverify mode"}}
135
+{"return": {}}
136
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
137
+
138
+
139
+== dynamically removing a child from a quorum ==
140
+Testing:
141
+QMP_VERSION
142
+{"return": {}}
143
+{"return": {}}
144
+{"return": {}}
145
+{"return": {}}
146
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
147
+
148
+Testing:
149
+QMP_VERSION
150
+{"return": {}}
151
+{"return": {}}
152
+{"error": {"class": "GenericError", "desc": "The number of children cannot be lower than the vote threshold 2"}}
153
+{"return": {}}
154
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
155
+
156
+Testing:
157
+QMP_VERSION
158
+{"return": {}}
159
+{"error": {"class": "GenericError", "desc": "blkverify=on can only be set if there are exactly two files and vote-threshold is 2"}}
160
+{"error": {"class": "GenericError", "desc": "Cannot find device=drive0-quorum nor node_name=drive0-quorum"}}
161
+{"return": {}}
162
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
163
+
164
+Testing:
165
+QMP_VERSION
166
+{"return": {}}
167
+{"return": {}}
168
+{"error": {"class": "GenericError", "desc": "The number of children cannot be lower than the vote threshold 2"}}
169
+{"return": {}}
170
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
171
+
172
*** done
173
--
174
2.19.1
175
176
diff view generated by jsdifflib
Deleted patch
1
To fully change the read-only state of a node, we must not only change
2
bs->read_only, but also update bs->open_flags.
3
1
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
5
Reviewed-by: Eric Blake <eblake@redhat.com>
6
Reviewed-by: Alberto Garcia <berto@igalia.com>
7
---
8
block.c | 7 +++++++
9
1 file changed, 7 insertions(+)
10
11
diff --git a/block.c b/block.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block.c
14
+++ b/block.c
15
@@ -XXX,XX +XXX,XX @@ int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
16
}
17
18
bs->read_only = read_only;
19
+
20
+ if (read_only) {
21
+ bs->open_flags &= ~BDRV_O_RDWR;
22
+ } else {
23
+ bs->open_flags |= BDRV_O_RDWR;
24
+ }
25
+
26
return 0;
27
}
28
29
--
30
2.19.1
31
32
diff view generated by jsdifflib
Deleted patch
1
If a management application builds the block graph node by node, the
2
protocol layer doesn't inherit its read-only option from the format
3
layer any more, so it must be set explicitly.
4
1
5
Backing files should work on read-only storage, but at the same time, a
6
block job like commit should be able to reopen them read-write if they
7
are on read-write storage. However, without option inheritance, reopen
8
only changes the read-only option for the root node (typically the
9
format layer), but not the protocol layer, so reopening fails (the
10
format layer wants to get write permissions, but the protocol layer is
11
still read-only).
12
13
A simple workaround for the problem in the management tool would be to
14
open the protocol layer always read-write and to make only the format
15
layer read-only for backing files. However, sometimes the file is
16
actually stored on read-only storage and we don't know whether the image
17
can be opened read-write (for example, for NBD it depends on the server
18
we're trying to connect to). This adds an option that makes QEMU try to
19
open the image read-write, but allows it to degrade to a read-only mode
20
without returning an error.
21
22
The documentation for this option is consciously phrased in a way that
23
allows QEMU to switch to a better model eventually: Instead of trying
24
when the image is first opened, making the read-only flag dynamic and
25
changing it automatically whenever the first BLK_PERM_WRITE user is
26
attached or the last one is detached would be much more useful
27
behaviour.
28
29
Unfortunately, this more useful behaviour is also a lot harder to
30
implement, and libvirt needs a solution now before it can switch to
31
-blockdev, so let's start with this easier approach for now.
32
33
Instead of adding a new auto-read-only option, turning the existing
34
read-only into an enum (with a bool alternate for compatibility) was
35
considered, but it complicated the implementation to the point that it
36
didn't seem to be worth it.
37
38
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
39
Reviewed-by: Eric Blake <eblake@redhat.com>
40
---
41
qapi/block-core.json | 7 +++++++
42
include/block/block.h | 2 ++
43
block.c | 17 +++++++++++++++++
44
block/vvfat.c | 1 +
45
blockdev.c | 2 +-
46
5 files changed, 28 insertions(+), 1 deletion(-)
47
48
diff --git a/qapi/block-core.json b/qapi/block-core.json
49
index XXXXXXX..XXXXXXX 100644
50
--- a/qapi/block-core.json
51
+++ b/qapi/block-core.json
52
@@ -XXX,XX +XXX,XX @@
53
# either generally or in certain configurations. In this case,
54
# the default value does not work and the option must be
55
# specified explicitly.
56
+# @auto-read-only: if true and @read-only is false, QEMU may automatically
57
+# decide not to open the image read-write as requested, but
58
+# fall back to read-only instead (and switch between the modes
59
+# later), e.g. depending on whether the image file is writable
60
+# or whether a writing user is attached to the node
61
+# (default: false, since 3.1)
62
# @detect-zeroes: detect and optimize zero writes (Since 2.1)
63
# (default: off)
64
# @force-share: force share all permission on added nodes.
65
@@ -XXX,XX +XXX,XX @@
66
'*discard': 'BlockdevDiscardOptions',
67
'*cache': 'BlockdevCacheOptions',
68
'*read-only': 'bool',
69
+ '*auto-read-only': 'bool',
70
'*force-share': 'bool',
71
'*detect-zeroes': 'BlockdevDetectZeroesOptions' },
72
'discriminator': 'driver',
73
diff --git a/include/block/block.h b/include/block/block.h
74
index XXXXXXX..XXXXXXX 100644
75
--- a/include/block/block.h
76
+++ b/include/block/block.h
77
@@ -XXX,XX +XXX,XX @@ typedef struct HDGeometry {
78
select an appropriate protocol driver,
79
ignoring the format layer */
80
#define BDRV_O_NO_IO 0x10000 /* don't initialize for I/O */
81
+#define BDRV_O_AUTO_RDONLY 0x20000 /* degrade to read-only if opening read-write fails */
82
83
#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_NO_FLUSH)
84
85
@@ -XXX,XX +XXX,XX @@ typedef struct HDGeometry {
86
#define BDRV_OPT_CACHE_DIRECT "cache.direct"
87
#define BDRV_OPT_CACHE_NO_FLUSH "cache.no-flush"
88
#define BDRV_OPT_READ_ONLY "read-only"
89
+#define BDRV_OPT_AUTO_READ_ONLY "auto-read-only"
90
#define BDRV_OPT_DISCARD "discard"
91
#define BDRV_OPT_FORCE_SHARE "force-share"
92
93
diff --git a/block.c b/block.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/block.c
96
+++ b/block.c
97
@@ -XXX,XX +XXX,XX @@ static void bdrv_inherited_options(int *child_flags, QDict *child_options,
98
99
/* Inherit the read-only option from the parent if it's not set */
100
qdict_copy_default(child_options, parent_options, BDRV_OPT_READ_ONLY);
101
+ qdict_copy_default(child_options, parent_options, BDRV_OPT_AUTO_READ_ONLY);
102
103
/* Our block drivers take care to send flushes and respect unmap policy,
104
* so we can default to enable both on lower layers regardless of the
105
@@ -XXX,XX +XXX,XX @@ static void bdrv_backing_options(int *child_flags, QDict *child_options,
106
107
/* backing files always opened read-only */
108
qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "on");
109
+ qdict_set_default_str(child_options, BDRV_OPT_AUTO_READ_ONLY, "off");
110
flags &= ~BDRV_O_COPY_ON_READ;
111
112
/* snapshot=on is handled on the top layer */
113
@@ -XXX,XX +XXX,XX @@ static void update_flags_from_options(int *flags, QemuOpts *opts)
114
*flags |= BDRV_O_RDWR;
115
}
116
117
+ assert(qemu_opt_find(opts, BDRV_OPT_AUTO_READ_ONLY));
118
+ if (qemu_opt_get_bool_del(opts, BDRV_OPT_AUTO_READ_ONLY, false)) {
119
+ *flags |= BDRV_O_AUTO_RDONLY;
120
+ }
121
}
122
123
static void update_options_from_flags(QDict *options, int flags)
124
@@ -XXX,XX +XXX,XX @@ static void update_options_from_flags(QDict *options, int flags)
125
if (!qdict_haskey(options, BDRV_OPT_READ_ONLY)) {
126
qdict_put_bool(options, BDRV_OPT_READ_ONLY, !(flags & BDRV_O_RDWR));
127
}
128
+ if (!qdict_haskey(options, BDRV_OPT_AUTO_READ_ONLY)) {
129
+ qdict_put_bool(options, BDRV_OPT_AUTO_READ_ONLY,
130
+ flags & BDRV_O_AUTO_RDONLY);
131
+ }
132
}
133
134
static void bdrv_assign_node_name(BlockDriverState *bs,
135
@@ -XXX,XX +XXX,XX @@ QemuOptsList bdrv_runtime_opts = {
136
.type = QEMU_OPT_BOOL,
137
.help = "Node is opened in read-only mode",
138
},
139
+ {
140
+ .name = BDRV_OPT_AUTO_READ_ONLY,
141
+ .type = QEMU_OPT_BOOL,
142
+ .help = "Node can become read-only if opening read-write fails",
143
+ },
144
{
145
.name = "detect-zeroes",
146
.type = QEMU_OPT_STRING,
147
@@ -XXX,XX +XXX,XX @@ BlockDriverState *bdrv_open_blockdev_ref(BlockdevRef *ref, Error **errp)
148
qdict_set_default_str(qdict, BDRV_OPT_CACHE_DIRECT, "off");
149
qdict_set_default_str(qdict, BDRV_OPT_CACHE_NO_FLUSH, "off");
150
qdict_set_default_str(qdict, BDRV_OPT_READ_ONLY, "off");
151
+ qdict_set_default_str(qdict, BDRV_OPT_AUTO_READ_ONLY, "off");
152
+
153
}
154
155
bs = bdrv_open_inherit(NULL, reference, qdict, 0, NULL, NULL, errp);
156
diff --git a/block/vvfat.c b/block/vvfat.c
157
index XXXXXXX..XXXXXXX 100644
158
--- a/block/vvfat.c
159
+++ b/block/vvfat.c
160
@@ -XXX,XX +XXX,XX @@ static void vvfat_qcow_options(int *child_flags, QDict *child_options,
161
int parent_flags, QDict *parent_options)
162
{
163
qdict_set_default_str(child_options, BDRV_OPT_READ_ONLY, "off");
164
+ qdict_set_default_str(child_options, BDRV_OPT_AUTO_READ_ONLY, "off");
165
qdict_set_default_str(child_options, BDRV_OPT_CACHE_NO_FLUSH, "on");
166
}
167
168
diff --git a/blockdev.c b/blockdev.c
169
index XXXXXXX..XXXXXXX 100644
170
--- a/blockdev.c
171
+++ b/blockdev.c
172
@@ -XXX,XX +XXX,XX @@ void qmp_blockdev_change_medium(bool has_device, const char *device,
173
174
bdrv_flags = blk_get_open_flags_from_root_state(blk);
175
bdrv_flags &= ~(BDRV_O_TEMPORARY | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING |
176
- BDRV_O_PROTOCOL);
177
+ BDRV_O_PROTOCOL | BDRV_O_AUTO_RDONLY);
178
179
if (!has_read_only) {
180
read_only = BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN;
181
--
182
2.19.1
183
184
diff view generated by jsdifflib
Deleted patch
1
Commit e2b8247a322 introduced an error path in qemu_rbd_open() after
2
calling rbd_open(), but neglected to close the image again in this error
3
path. The error path should contain everything that the regular close
4
function qemu_rbd_close() contains.
5
1
6
This adds the missing rbd_close() call.
7
8
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9
Reviewed-by: Eric Blake <eblake@redhat.com>
10
---
11
block/rbd.c | 1 +
12
1 file changed, 1 insertion(+)
13
14
diff --git a/block/rbd.c b/block/rbd.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/block/rbd.c
17
+++ b/block/rbd.c
18
@@ -XXX,XX +XXX,XX @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
19
"automatically marking the image read-only.");
20
r = bdrv_set_read_only(bs, true, &local_err);
21
if (r < 0) {
22
+ rbd_close(s->image);
23
error_propagate(errp, local_err);
24
goto failed_open;
25
}
26
--
27
2.19.1
28
29
diff view generated by jsdifflib
1
Some block drivers have traditionally changed their node to read-only
1
From: Markus Armbruster <armbru@redhat.com>
2
mode without asking the user. This behaviour has been marked deprecated
3
since 2.11, expecting users to provide an explicit read-only=on option.
4
2
5
Now that we have auto-read-only=on, enable these drivers to make use of
3
Signed-off-by: Markus Armbruster <armbru@redhat.com>
6
the option.
4
Message-Id: <20201217162003.1102738-10-armbru@redhat.com>
5
Reviewed-by: Max Reitz <mreitz@redhat.com>
6
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
7
---
8
block/vpc.c | 29 ++++++++++++++---------------
9
1 file changed, 14 insertions(+), 15 deletions(-)
7
10
8
This is the only use of bdrv_set_read_only(), so we can make it a bit
11
diff --git a/block/vpc.c b/block/vpc.c
9
more specific and turn it into a bdrv_apply_auto_read_only() that is
10
more convenient for drivers to use.
11
12
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
13
Reviewed-by: Eric Blake <eblake@redhat.com>
14
---
15
include/block/block.h | 3 ++-
16
block.c | 42 +++++++++++++++++++++++++++---------------
17
block/bochs.c | 17 ++++++-----------
18
block/cloop.c | 16 +++++-----------
19
block/dmg.c | 16 +++++-----------
20
block/rbd.c | 15 ++++-----------
21
block/vvfat.c | 10 ++--------
22
7 files changed, 51 insertions(+), 68 deletions(-)
23
24
diff --git a/include/block/block.h b/include/block/block.h
25
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
26
--- a/include/block/block.h
13
--- a/block/vpc.c
27
+++ b/include/block/block.h
14
+++ b/block/vpc.c
28
@@ -XXX,XX +XXX,XX @@ int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base,
15
@@ -XXX,XX +XXX,XX @@
29
bool bdrv_is_read_only(BlockDriverState *bs);
16
30
int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
17
/**************************************************************/
31
bool ignore_allow_rdw, Error **errp);
18
32
-int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp);
19
-#define HEADER_SIZE 512
33
+int bdrv_apply_auto_read_only(BlockDriverState *bs, const char *errmsg,
20
-
34
+ Error **errp);
21
//#define CACHE
35
bool bdrv_is_writable(BlockDriverState *bs);
22
36
bool bdrv_is_sg(BlockDriverState *bs);
23
enum vhd_type {
37
bool bdrv_is_inserted(BlockDriverState *bs);
24
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
38
diff --git a/block.c b/block.c
25
goto fail;
39
index XXXXXXX..XXXXXXX 100644
40
--- a/block.c
41
+++ b/block.c
42
@@ -XXX,XX +XXX,XX @@ int bdrv_can_set_read_only(BlockDriverState *bs, bool read_only,
43
return 0;
44
}
45
46
-/* TODO Remove (deprecated since 2.11)
47
- * Block drivers are not supposed to automatically change bs->read_only.
48
- * Instead, they should just check whether they can provide what the user
49
- * explicitly requested and error out if read-write is requested, but they can
50
- * only provide read-only access. */
51
-int bdrv_set_read_only(BlockDriverState *bs, bool read_only, Error **errp)
52
+/*
53
+ * Called by a driver that can only provide a read-only image.
54
+ *
55
+ * Returns 0 if the node is already read-only or it could switch the node to
56
+ * read-only because BDRV_O_AUTO_RDONLY is set.
57
+ *
58
+ * Returns -EACCES if the node is read-write and BDRV_O_AUTO_RDONLY is not set
59
+ * or bdrv_can_set_read_only() forbids making the node read-only. If @errmsg
60
+ * is not NULL, it is used as the error message for the Error object.
61
+ */
62
+int bdrv_apply_auto_read_only(BlockDriverState *bs, const char *errmsg,
63
+ Error **errp)
64
{
65
int ret = 0;
66
67
- ret = bdrv_can_set_read_only(bs, read_only, false, errp);
68
- if (ret < 0) {
69
- return ret;
70
+ if (!(bs->open_flags & BDRV_O_RDWR)) {
71
+ return 0;
72
+ }
73
+ if (!(bs->open_flags & BDRV_O_AUTO_RDONLY)) {
74
+ goto fail;
75
}
26
}
76
27
77
- bs->read_only = read_only;
28
- ret = bdrv_pread(bs->file, 0, &s->footer, HEADER_SIZE);
78
-
29
+ ret = bdrv_pread(bs->file, 0, &s->footer, sizeof(s->footer));
79
- if (read_only) {
30
if (ret < 0) {
80
- bs->open_flags &= ~BDRV_O_RDWR;
31
error_setg(errp, "Unable to read VHD header");
81
- } else {
32
goto fail;
82
- bs->open_flags |= BDRV_O_RDWR;
33
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
83
+ ret = bdrv_can_set_read_only(bs, true, false, NULL);
34
ret = offset;
84
+ if (ret < 0) {
35
error_setg(errp, "Invalid file size");
85
+ goto fail;
36
goto fail;
37
- } else if (offset < HEADER_SIZE) {
38
+ } else if (offset < sizeof(*footer)) {
39
ret = -EINVAL;
40
error_setg(errp, "File too small for a VHD header");
41
goto fail;
42
}
43
44
/* If a fixed disk, the footer is found only at the end of the file */
45
- ret = bdrv_pread(bs->file, offset - HEADER_SIZE, footer,
46
- HEADER_SIZE);
47
+ ret = bdrv_pread(bs->file, offset - sizeof(*footer),
48
+ footer, sizeof(*footer));
49
if (ret < 0) {
50
goto fail;
51
}
52
@@ -XXX,XX +XXX,XX @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
53
54
checksum = be32_to_cpu(footer->checksum);
55
footer->checksum = 0;
56
- if (vpc_checksum(footer, HEADER_SIZE) != checksum) {
57
+ if (vpc_checksum(footer, sizeof(*footer)) != checksum) {
58
error_setg(errp, "Incorrect header checksum");
59
ret = -EINVAL;
60
goto fail;
61
@@ -XXX,XX +XXX,XX @@ static int rewrite_footer(BlockDriverState *bs)
62
BDRVVPCState *s = bs->opaque;
63
int64_t offset = s->free_data_block_offset;
64
65
- ret = bdrv_pwrite_sync(bs->file, offset, &s->footer, HEADER_SIZE);
66
+ ret = bdrv_pwrite_sync(bs->file, offset, &s->footer, sizeof(s->footer));
67
if (ret < 0)
68
return ret;
69
70
@@ -XXX,XX +XXX,XX @@ static int create_dynamic_disk(BlockBackend *blk, VHDFooter *footer,
71
block_size = 0x200000;
72
num_bat_entries = DIV_ROUND_UP(total_sectors, block_size / 512);
73
74
- ret = blk_pwrite(blk, offset, footer, HEADER_SIZE, 0);
75
+ ret = blk_pwrite(blk, offset, footer, sizeof(*footer), 0);
76
if (ret < 0) {
77
goto fail;
86
}
78
}
87
79
88
+ bs->read_only = true;
80
offset = 1536 + ((num_bat_entries * 4 + 511) & ~511);
89
+ bs->open_flags &= ~BDRV_O_RDWR;
81
- ret = blk_pwrite(blk, offset, footer, HEADER_SIZE, 0);
90
+
82
+ ret = blk_pwrite(blk, offset, footer, sizeof(*footer), 0);
91
return 0;
83
if (ret < 0) {
92
+
84
goto fail;
93
+fail:
85
}
94
+ error_setg(errp, "%s", errmsg ?: "Image is read-only");
86
@@ -XXX,XX +XXX,XX @@ static int create_fixed_disk(BlockBackend *blk, VHDFooter *footer,
95
+ return -EACCES;
96
}
97
98
void bdrv_get_full_backing_filename_from_filename(const char *backed,
99
diff --git a/block/bochs.c b/block/bochs.c
100
index XXXXXXX..XXXXXXX 100644
101
--- a/block/bochs.c
102
+++ b/block/bochs.c
103
@@ -XXX,XX +XXX,XX @@ static int bochs_open(BlockDriverState *bs, QDict *options, int flags,
104
struct bochs_header bochs;
105
int ret;
87
int ret;
106
88
107
+ /* No write support yet */
89
/* Add footer to total size */
108
+ ret = bdrv_apply_auto_read_only(bs, NULL, errp);
90
- total_size += HEADER_SIZE;
109
+ if (ret < 0) {
91
+ total_size += sizeof(*footer);
110
+ return ret;
92
111
+ }
93
ret = blk_truncate(blk, total_size, false, PREALLOC_MODE_OFF, 0, errp);
112
+
113
bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
114
false, errp);
115
if (!bs->file) {
116
return -EINVAL;
117
}
118
119
- if (!bdrv_is_read_only(bs)) {
120
- error_report("Opening bochs images without an explicit read-only=on "
121
- "option is deprecated. Future versions will refuse to "
122
- "open the image instead of automatically marking the "
123
- "image read-only.");
124
- ret = bdrv_set_read_only(bs, true, errp); /* no write support yet */
125
- if (ret < 0) {
126
- return ret;
127
- }
128
- }
129
-
130
ret = bdrv_pread(bs->file, 0, &bochs, sizeof(bochs));
131
if (ret < 0) {
94
if (ret < 0) {
132
return ret;
95
return ret;
133
diff --git a/block/cloop.c b/block/cloop.c
134
index XXXXXXX..XXXXXXX 100644
135
--- a/block/cloop.c
136
+++ b/block/cloop.c
137
@@ -XXX,XX +XXX,XX @@ static int cloop_open(BlockDriverState *bs, QDict *options, int flags,
138
uint32_t offsets_size, max_compressed_block_size = 1, i;
139
int ret;
140
141
+ ret = bdrv_apply_auto_read_only(bs, NULL, errp);
142
+ if (ret < 0) {
143
+ return ret;
144
+ }
145
+
146
bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
147
false, errp);
148
if (!bs->file) {
149
return -EINVAL;
150
}
96
}
151
97
152
- if (!bdrv_is_read_only(bs)) {
98
- ret = blk_pwrite(blk, total_size - HEADER_SIZE, footer, HEADER_SIZE, 0);
153
- error_report("Opening cloop images without an explicit read-only=on "
99
+ ret = blk_pwrite(blk, total_size - sizeof(*footer),
154
- "option is deprecated. Future versions will refuse to "
100
+ footer, sizeof(*footer), 0);
155
- "open the image instead of automatically marking the "
156
- "image read-only.");
157
- ret = bdrv_set_read_only(bs, true, errp);
158
- if (ret < 0) {
159
- return ret;
160
- }
161
- }
162
-
163
/* read header */
164
ret = bdrv_pread(bs->file, 128, &s->block_size, 4);
165
if (ret < 0) {
101
if (ret < 0) {
166
diff --git a/block/dmg.c b/block/dmg.c
102
error_setg_errno(errp, -ret, "Unable to write VHD header");
167
index XXXXXXX..XXXXXXX 100644
103
return ret;
168
--- a/block/dmg.c
104
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
169
+++ b/block/dmg.c
170
@@ -XXX,XX +XXX,XX @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
171
int64_t offset;
172
int ret;
173
174
+ ret = bdrv_apply_auto_read_only(bs, NULL, errp);
175
+ if (ret < 0) {
176
+ return ret;
177
+ }
178
+
179
bs->file = bdrv_open_child(NULL, options, "file", bs, &child_file,
180
false, errp);
181
if (!bs->file) {
182
return -EINVAL;
183
}
105
}
184
106
185
- if (!bdrv_is_read_only(bs)) {
107
/* Prepare the Hard Disk Footer */
186
- error_report("Opening dmg images without an explicit read-only=on "
108
- memset(&footer, 0, HEADER_SIZE);
187
- "option is deprecated. Future versions will refuse to "
109
+ memset(&footer, 0, sizeof(footer));
188
- "open the image instead of automatically marking the "
110
189
- "image read-only.");
111
memcpy(footer.creator, "conectix", 8);
190
- ret = bdrv_set_read_only(bs, true, errp);
112
if (vpc_opts->force_size) {
191
- if (ret < 0) {
113
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
192
- return ret;
114
footer.features = cpu_to_be32(0x02);
193
- }
115
footer.version = cpu_to_be32(0x00010000);
194
- }
116
if (disk_type == VHD_DYNAMIC) {
195
-
117
- footer.data_offset = cpu_to_be64(HEADER_SIZE);
196
block_module_load_one("dmg-bz2");
118
+ footer.data_offset = cpu_to_be64(sizeof(footer));
197
119
} else {
198
s->n_chunks = 0;
120
footer.data_offset = cpu_to_be64(0xFFFFFFFFFFFFFFFFULL);
199
diff --git a/block/rbd.c b/block/rbd.c
200
index XXXXXXX..XXXXXXX 100644
201
--- a/block/rbd.c
202
+++ b/block/rbd.c
203
@@ -XXX,XX +XXX,XX @@ static int qemu_rbd_open(BlockDriverState *bs, QDict *options, int flags,
204
/* If we are using an rbd snapshot, we must be r/o, otherwise
205
* leave as-is */
206
if (s->snap != NULL) {
207
- if (!bdrv_is_read_only(bs)) {
208
- error_report("Opening rbd snapshots without an explicit "
209
- "read-only=on option is deprecated. Future versions "
210
- "will refuse to open the image instead of "
211
- "automatically marking the image read-only.");
212
- r = bdrv_set_read_only(bs, true, &local_err);
213
- if (r < 0) {
214
- rbd_close(s->image);
215
- error_propagate(errp, local_err);
216
- goto failed_open;
217
- }
218
+ r = bdrv_apply_auto_read_only(bs, "rbd snapshots are read-only", errp);
219
+ if (r < 0) {
220
+ rbd_close(s->image);
221
+ goto failed_open;
222
}
223
}
121
}
224
122
@@ -XXX,XX +XXX,XX @@ static int coroutine_fn vpc_co_create(BlockdevCreateOptions *opts,
225
diff --git a/block/vvfat.c b/block/vvfat.c
123
qemu_uuid_generate(&uuid);
226
index XXXXXXX..XXXXXXX 100644
124
footer.uuid = uuid;
227
--- a/block/vvfat.c
125
228
+++ b/block/vvfat.c
126
- footer.checksum = cpu_to_be32(vpc_checksum(&footer, HEADER_SIZE));
229
@@ -XXX,XX +XXX,XX @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
127
+ footer.checksum = cpu_to_be32(vpc_checksum(&footer, sizeof(footer)));
230
"Unable to set VVFAT to 'rw' when drive is read-only");
128
231
goto fail;
129
if (disk_type == VHD_DYNAMIC) {
232
}
130
ret = create_dynamic_disk(blk, &footer, total_sectors);
233
- } else if (!bdrv_is_read_only(bs)) {
234
- error_report("Opening non-rw vvfat images without an explicit "
235
- "read-only=on option is deprecated. Future versions "
236
- "will refuse to open the image instead of "
237
- "automatically marking the image read-only.");
238
- /* read only is the default for safety */
239
- ret = bdrv_set_read_only(bs, true, &local_err);
240
+ } else {
241
+ ret = bdrv_apply_auto_read_only(bs, NULL, errp);
242
if (ret < 0) {
243
- error_propagate(errp, local_err);
244
goto fail;
245
}
246
}
247
--
131
--
248
2.19.1
132
2.29.2
249
133
250
134
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, open a read-write NBD
2
connection if the server provides a read-write export, but instead of
3
erroring out for read-only exports, just degrade to read-only.
4
1
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Reviewed-by: Eric Blake <eblake@redhat.com>
7
---
8
block/nbd-client.c | 10 +++++-----
9
1 file changed, 5 insertions(+), 5 deletions(-)
10
11
diff --git a/block/nbd-client.c b/block/nbd-client.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block/nbd-client.c
14
+++ b/block/nbd-client.c
15
@@ -XXX,XX +XXX,XX @@ int nbd_client_init(BlockDriverState *bs,
16
logout("Failed to negotiate with the NBD server\n");
17
return ret;
18
}
19
- if (client->info.flags & NBD_FLAG_READ_ONLY &&
20
- !bdrv_is_read_only(bs)) {
21
- error_setg(errp,
22
- "request for write access conflicts with read-only export");
23
- return -EACCES;
24
+ if (client->info.flags & NBD_FLAG_READ_ONLY) {
25
+ ret = bdrv_apply_auto_read_only(bs, "NBD export is read-only", errp);
26
+ if (ret < 0) {
27
+ return ret;
28
+ }
29
}
30
if (client->info.flags & NBD_FLAG_SEND_FUA) {
31
bs->supported_write_flags = BDRV_REQ_FUA;
32
--
33
2.19.1
34
35
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, open the file
2
read-write if we have the permissions, but instead of erroring out for
3
read-only files, just degrade to read-only.
4
1
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Reviewed-by: Eric Blake <eblake@redhat.com>
7
---
8
block/file-posix.c | 19 ++++++++++++++++---
9
1 file changed, 16 insertions(+), 3 deletions(-)
10
11
diff --git a/block/file-posix.c b/block/file-posix.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block/file-posix.c
14
+++ b/block/file-posix.c
15
@@ -XXX,XX +XXX,XX @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
16
17
s->fd = -1;
18
fd = qemu_open(filename, s->open_flags, 0644);
19
- if (fd < 0) {
20
- ret = -errno;
21
- error_setg_errno(errp, errno, "Could not open '%s'", filename);
22
+ ret = fd < 0 ? -errno : 0;
23
+
24
+ if (ret == -EACCES || ret == -EROFS) {
25
+ /* Try to degrade to read-only, but if it doesn't work, still use the
26
+ * normal error message. */
27
+ if (bdrv_apply_auto_read_only(bs, NULL, NULL) == 0) {
28
+ bdrv_flags &= ~BDRV_O_RDWR;
29
+ raw_parse_flags(bdrv_flags, &s->open_flags);
30
+ assert(!(s->open_flags & O_CREAT));
31
+ fd = qemu_open(filename, s->open_flags);
32
+ ret = fd < 0 ? -errno : 0;
33
+ }
34
+ }
35
+
36
+ if (ret < 0) {
37
+ error_setg_errno(errp, -ret, "Could not open '%s'", filename);
38
if (ret == -EROFS) {
39
ret = -EACCES;
40
}
41
--
42
2.19.1
43
44
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, just degrade to
2
read-only.
3
1
4
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
5
Reviewed-by: Eric Blake <eblake@redhat.com>
6
---
7
block/curl.c | 8 ++++----
8
1 file changed, 4 insertions(+), 4 deletions(-)
9
10
diff --git a/block/curl.c b/block/curl.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/block/curl.c
13
+++ b/block/curl.c
14
@@ -XXX,XX +XXX,XX @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
15
const char *protocol_delimiter;
16
int ret;
17
18
-
19
- if (flags & BDRV_O_RDWR) {
20
- error_setg(errp, "curl block device does not support writes");
21
- return -EROFS;
22
+ ret = bdrv_apply_auto_read_only(bs, "curl driver does not support writes",
23
+ errp);
24
+ if (ret < 0) {
25
+ return ret;
26
}
27
28
if (!libcurl_initialized) {
29
--
30
2.19.1
31
32
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, open the file
2
read-write if we have the permissions, but instead of erroring out for
3
read-only files, just degrade to read-only.
4
1
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Reviewed-by: Niels de Vos <ndevos@redhat.com>
7
---
8
block/gluster.c | 12 ++++++++++--
9
1 file changed, 10 insertions(+), 2 deletions(-)
10
11
diff --git a/block/gluster.c b/block/gluster.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block/gluster.c
14
+++ b/block/gluster.c
15
@@ -XXX,XX +XXX,XX @@ static int qemu_gluster_open(BlockDriverState *bs, QDict *options,
16
qemu_gluster_parse_flags(bdrv_flags, &open_flags);
17
18
s->fd = glfs_open(s->glfs, gconf->path, open_flags);
19
- if (!s->fd) {
20
- ret = -errno;
21
+ ret = s->fd ? 0 : -errno;
22
+
23
+ if (ret == -EACCES || ret == -EROFS) {
24
+ /* Try to degrade to read-only, but if it doesn't work, still use the
25
+ * normal error message. */
26
+ if (bdrv_apply_auto_read_only(bs, NULL, NULL) == 0) {
27
+ open_flags = (open_flags & ~O_RDWR) | O_RDONLY;
28
+ s->fd = glfs_open(s->glfs, gconf->path, open_flags);
29
+ ret = s->fd ? 0 : -errno;
30
+ }
31
}
32
33
s->supports_seek_data = qemu_gluster_test_seek(s->fd);
34
--
35
2.19.1
36
37
diff view generated by jsdifflib
Deleted patch
1
If read-only=off, but auto-read-only=on is given, open the volume
2
read-write if we have the permissions, but instead of erroring out for
3
read-only volumes, just degrade to read-only.
4
1
5
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
6
Reviewed-by: Eric Blake <eblake@redhat.com>
7
---
8
block/iscsi.c | 8 +++++---
9
1 file changed, 5 insertions(+), 3 deletions(-)
10
11
diff --git a/block/iscsi.c b/block/iscsi.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/block/iscsi.c
14
+++ b/block/iscsi.c
15
@@ -XXX,XX +XXX,XX @@ static int iscsi_open(BlockDriverState *bs, QDict *options, int flags,
16
/* Check the write protect flag of the LUN if we want to write */
17
if (iscsilun->type == TYPE_DISK && (flags & BDRV_O_RDWR) &&
18
iscsilun->write_protected) {
19
- error_setg(errp, "Cannot open a write protected LUN as read-write");
20
- ret = -EACCES;
21
- goto out;
22
+ ret = bdrv_apply_auto_read_only(bs, "LUN is write protected", errp);
23
+ if (ret < 0) {
24
+ goto out;
25
+ }
26
+ flags &= ~BDRV_O_RDWR;
27
}
28
29
iscsi_readcapacity_sync(iscsilun, &local_err);
30
--
31
2.19.1
32
33
diff view generated by jsdifflib
Deleted patch
1
While we want machine interfaces like -blockdev and QMP blockdev-add to
2
add as little auto-detection as possible so that management tools are
3
explicit about their needs, -drive is a convenience option for human
4
users. Enabling auto-read-only=on by default there enables users to use
5
read-only images for read-only guest devices without having to specify
6
read-only=on explicitly. If they try to attach the image to a read-write
7
device, they will still get an error message.
8
1
9
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
10
Reviewed-by: Eric Blake <eblake@redhat.com>
11
---
12
blockdev.c | 1 +
13
1 file changed, 1 insertion(+)
14
15
diff --git a/blockdev.c b/blockdev.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/blockdev.c
18
+++ b/blockdev.c
19
@@ -XXX,XX +XXX,XX @@ static BlockBackend *blockdev_init(const char *file, QDict *bs_opts,
20
qdict_set_default_str(bs_opts, BDRV_OPT_CACHE_NO_FLUSH, "off");
21
qdict_set_default_str(bs_opts, BDRV_OPT_READ_ONLY,
22
read_only ? "on" : "off");
23
+ qdict_set_default_str(bs_opts, BDRV_OPT_AUTO_READ_ONLY, "on");
24
assert((bdrv_flags & BDRV_O_CACHE_MASK) == 0);
25
26
if (runstate_check(RUN_STATE_INMIGRATE)) {
27
--
28
2.19.1
29
30
diff view generated by jsdifflib