mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 19:33:39 +08:00
Block patches:
- Add "toolsversion" creation option for vmdk images - iotest fix (297, the linting test) - Added sanity check when opening vpc images - Doc fix -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEy2LXoO44KeRfAE00ofpA0JgBnN8FAmGBR9wSHGhyZWl0ekBy ZWRoYXQuY29tAAoJEKH6QNCYAZzfxX8QAIrL4nvxZ0Mf26scVn+g82NlbSS7O1vb 4bkbXOq0NJegBJxc0wq7nk+mkwoe7WE7Zx+cu70B6uRs4i1ZGzODEzF1J0g82wKT 4Yi3TQOlWFvkrmiSYjQeMr/bxBG0278zfQtGOFX3XxlBtqoznIOJ4yUV0W140N0I qWNbfrtGC5c4ESEdpo47mg5Vkfi6rgpLGTfyMz5F9j4lbpze1ALgxd44eLOTh6m0 kGXJ98Oz07MerM/ZctxTlrBiF6hI+3cNhFws9RK2TMLrJnrqYGd7HJa0yAvxUaIk QxBgSc849j7rHJRSJLquS8laQFojN8apFDMRNj89gJ5Wqk2DMAbkMYcx5vFgoSq4 ka9212yKW+LHIjiRsU59mJA9mIZtD8elbYBE0P1TNDRvF2OU5J5QOiualK1BKki9 eqzly6ItVa4xC633hsdKvcdN/b2Ck1lL8iJdKI31nFIU5MxmP9VIPBodcy71w7V9 Gt/6nD3fNq5upfOiXsarLxcbnc9/mNcZr119Tp+WvqJvxTqJZ+nbXauyCqZYTKV4 ASpUe8QXA2ha+VBL1gnaHEeuiueql3r9TdY/b9bKRruCCkLcE+zeLbofX8EYxl+2 fdR2QPlKFCY1i2ipzvVTbddsD/EokdyEffvjzFDnCFJsFY9zeer82kvFDrECIEYr WrKzCxF7CHxS =YxMl -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/XanClic/tags/pull-block-2021-11-02' into staging Block patches: - Add "toolsversion" creation option for vmdk images - iotest fix (297, the linting test) - Added sanity check when opening vpc images - Doc fix # gpg: Signature made Tue 02 Nov 2021 10:14:52 AM EDT # gpg: using RSA key CB62D7A0EE3829E45F004D34A1FA40D098019CDF # gpg: issuer "hreitz@redhat.com" # gpg: Good signature from "Hanna Reitz <hreitz@redhat.com>" [marginal] # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: CB62 D7A0 EE38 29E4 5F00 4D34 A1FA 40D0 9801 9CDF * remotes/XanClic/tags/pull-block-2021-11-02: block/vpc: Add a sanity check that fixed-size images have the right type vmdk: allow specification of tools version pylint: fix errors and warnings generated by tests/qemu-iotests/297 qemu-img: Consistent docs for convert -F Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
22d5760cb4
24
block/vmdk.c
24
block/vmdk.c
@ -60,6 +60,7 @@
|
||||
#define VMDK_ZEROED (-3)
|
||||
|
||||
#define BLOCK_OPT_ZEROED_GRAIN "zeroed_grain"
|
||||
#define BLOCK_OPT_TOOLSVERSION "toolsversion"
|
||||
|
||||
typedef struct {
|
||||
uint32_t version;
|
||||
@ -2344,6 +2345,7 @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
|
||||
BlockdevVmdkAdapterType adapter_type,
|
||||
const char *backing_file,
|
||||
const char *hw_version,
|
||||
const char *toolsversion,
|
||||
bool compat6,
|
||||
bool zeroed_grain,
|
||||
vmdk_create_extent_fn extent_fn,
|
||||
@ -2384,7 +2386,8 @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
|
||||
"ddb.geometry.cylinders = \"%" PRId64 "\"\n"
|
||||
"ddb.geometry.heads = \"%" PRIu32 "\"\n"
|
||||
"ddb.geometry.sectors = \"63\"\n"
|
||||
"ddb.adapterType = \"%s\"\n";
|
||||
"ddb.adapterType = \"%s\"\n"
|
||||
"ddb.toolsVersion = \"%s\"\n";
|
||||
|
||||
ext_desc_lines = g_string_new(NULL);
|
||||
|
||||
@ -2401,6 +2404,9 @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
|
||||
if (!hw_version) {
|
||||
hw_version = "4";
|
||||
}
|
||||
if (!toolsversion) {
|
||||
toolsversion = "2147483647";
|
||||
}
|
||||
|
||||
if (adapter_type != BLOCKDEV_VMDK_ADAPTER_TYPE_IDE) {
|
||||
/* that's the number of heads with which vmware operates when
|
||||
@ -2525,7 +2531,8 @@ static int coroutine_fn vmdk_co_do_create(int64_t size,
|
||||
size /
|
||||
(int64_t)(63 * number_heads * BDRV_SECTOR_SIZE),
|
||||
number_heads,
|
||||
BlockdevVmdkAdapterType_str(adapter_type));
|
||||
BlockdevVmdkAdapterType_str(adapter_type),
|
||||
toolsversion);
|
||||
desc_len = strlen(desc);
|
||||
/* the descriptor offset = 0x200 */
|
||||
if (!split && !flat) {
|
||||
@ -2617,6 +2624,7 @@ static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
|
||||
BlockdevVmdkAdapterType adapter_type_enum;
|
||||
char *backing_file = NULL;
|
||||
char *hw_version = NULL;
|
||||
char *toolsversion = NULL;
|
||||
char *fmt = NULL;
|
||||
BlockdevVmdkSubformat subformat;
|
||||
int ret = 0;
|
||||
@ -2649,6 +2657,7 @@ static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
|
||||
adapter_type = qemu_opt_get_del(opts, BLOCK_OPT_ADAPTER_TYPE);
|
||||
backing_file = qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE);
|
||||
hw_version = qemu_opt_get_del(opts, BLOCK_OPT_HWVERSION);
|
||||
toolsversion = qemu_opt_get_del(opts, BLOCK_OPT_TOOLSVERSION);
|
||||
compat6 = qemu_opt_get_bool_del(opts, BLOCK_OPT_COMPAT6, false);
|
||||
if (strcmp(hw_version, "undefined") == 0) {
|
||||
g_free(hw_version);
|
||||
@ -2692,14 +2701,15 @@ static int coroutine_fn vmdk_co_create_opts(BlockDriver *drv,
|
||||
.opts = opts,
|
||||
};
|
||||
ret = vmdk_co_do_create(total_size, subformat, adapter_type_enum,
|
||||
backing_file, hw_version, compat6, zeroed_grain,
|
||||
vmdk_co_create_opts_cb, &data, errp);
|
||||
backing_file, hw_version, toolsversion, compat6,
|
||||
zeroed_grain, vmdk_co_create_opts_cb, &data, errp);
|
||||
|
||||
exit:
|
||||
g_free(backing_fmt);
|
||||
g_free(adapter_type);
|
||||
g_free(backing_file);
|
||||
g_free(hw_version);
|
||||
g_free(toolsversion);
|
||||
g_free(fmt);
|
||||
g_free(desc);
|
||||
g_free(path);
|
||||
@ -2782,6 +2792,7 @@ static int coroutine_fn vmdk_co_create(BlockdevCreateOptions *create_options,
|
||||
opts->adapter_type,
|
||||
opts->backing_file,
|
||||
opts->hwversion,
|
||||
opts->toolsversion,
|
||||
false,
|
||||
opts->zeroed_grain,
|
||||
vmdk_co_create_cb,
|
||||
@ -3031,6 +3042,11 @@ static QemuOptsList vmdk_create_opts = {
|
||||
.help = "VMDK hardware version",
|
||||
.def_value_str = "undefined"
|
||||
},
|
||||
{
|
||||
.name = BLOCK_OPT_TOOLSVERSION,
|
||||
.type = QEMU_OPT_STRING,
|
||||
.help = "VMware guest tools version",
|
||||
},
|
||||
{
|
||||
.name = BLOCK_OPT_SUBFMT,
|
||||
.type = QEMU_OPT_STRING,
|
||||
|
@ -276,7 +276,8 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
if (ret < 0) {
|
||||
goto fail;
|
||||
}
|
||||
if (strncmp(footer->creator, "conectix", 8)) {
|
||||
if (strncmp(footer->creator, "conectix", 8) ||
|
||||
be32_to_cpu(footer->type) != VHD_FIXED) {
|
||||
error_setg(errp, "invalid VPC image");
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
|
@ -415,7 +415,7 @@ Command description:
|
||||
4
|
||||
Error on reading data
|
||||
|
||||
.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps [--skip-broken-bitmaps]] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE [-F backing_fmt]] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME
|
||||
.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps [--skip-broken-bitmaps]] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE [-F BACKING_FMT]] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME
|
||||
|
||||
Convert the disk image *FILENAME* or a snapshot *SNAPSHOT_PARAM*
|
||||
to disk image *OUTPUT_FILENAME* using format *OUTPUT_FMT*. It can
|
||||
|
@ -4691,6 +4691,8 @@
|
||||
# @adapter-type: The adapter type used to fill in the descriptor. Default: ide.
|
||||
# @hwversion: Hardware version. The meaningful options are "4" or "6".
|
||||
# Default: "4".
|
||||
# @toolsversion: VMware guest tools version.
|
||||
# Default: "2147483647" (Since 6.2)
|
||||
# @zeroed-grain: Whether to enable zeroed-grain feature for sparse subformats.
|
||||
# Default: false.
|
||||
#
|
||||
@ -4704,6 +4706,7 @@
|
||||
'*backing-file': 'str',
|
||||
'*adapter-type': 'BlockdevVmdkAdapterType',
|
||||
'*hwversion': 'str',
|
||||
'*toolsversion': 'str',
|
||||
'*zeroed-grain': 'bool' } }
|
||||
|
||||
|
||||
|
@ -48,7 +48,7 @@ ERST
|
||||
DEF("convert", img_convert,
|
||||
"convert [--object objectdef] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps] [-U] [-C] [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-B backing_file [-F backing_fmt]] [-o options] [-l snapshot_param] [-S sparse_size] [-r rate_limit] [-m num_coroutines] [-W] [--salvage] filename [filename2 [...]] output_filename")
|
||||
SRST
|
||||
.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] [--salvage] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME
|
||||
.. option:: convert [--object OBJECTDEF] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps] [-U] [-C] [-c] [-p] [-q] [-n] [-f FMT] [-t CACHE] [-T SRC_CACHE] [-O OUTPUT_FMT] [-B BACKING_FILE [-F BACKING_FMT]] [-o OPTIONS] [-l SNAPSHOT_PARAM] [-S SPARSE_SIZE] [-r RATE_LIMIT] [-m NUM_COROUTINES] [-W] [--salvage] FILENAME [FILENAME2 [...]] OUTPUT_FILENAME
|
||||
ERST
|
||||
|
||||
DEF("create", img_create,
|
||||
|
@ -77,8 +77,8 @@ class TestStopWithBlockJob(iotests.QMPTestCase):
|
||||
self.do_test_stop("drive-backup", device="drive0",
|
||||
target=self.target_img, format=iotests.imgfmt,
|
||||
sync="full",
|
||||
x_perf={ 'max-chunk': 65536,
|
||||
'max-workers': 8 })
|
||||
x_perf={'max-chunk': 65536,
|
||||
'max-workers': 8})
|
||||
|
||||
def test_block_commit(self):
|
||||
# Add overlay above the source node so that we actually use a
|
||||
@ -88,13 +88,13 @@ class TestStopWithBlockJob(iotests.QMPTestCase):
|
||||
'1G')
|
||||
|
||||
result = self.vm.qmp('blockdev-add', **{
|
||||
'node-name': 'overlay',
|
||||
'driver': iotests.imgfmt,
|
||||
'file': {
|
||||
'driver': 'file',
|
||||
'filename': self.overlay_img
|
||||
}
|
||||
})
|
||||
'node-name': 'overlay',
|
||||
'driver': iotests.imgfmt,
|
||||
'file': {
|
||||
'driver': 'file',
|
||||
'filename': self.overlay_img
|
||||
}
|
||||
})
|
||||
self.assert_qmp(result, 'return', {})
|
||||
|
||||
result = self.vm.qmp('blockdev-snapshot',
|
||||
|
@ -48,11 +48,11 @@ with iotests.FilePath('base.img') as base_img_path, \
|
||||
assert qemu_io_silent(base_img_path, '-c', 'write -P 1 3M 1M') == 0
|
||||
assert qemu_img('create', '-f', iotests.imgfmt, '-b', base_img_path,
|
||||
'-F', iotests.imgfmt, mid_img_path) == 0
|
||||
assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 2M 1M') == 0
|
||||
assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 4M 1M') == 0
|
||||
assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 2M 1M') == 0
|
||||
assert qemu_io_silent(mid_img_path, '-c', 'write -P 3 4M 1M') == 0
|
||||
assert qemu_img('create', '-f', iotests.imgfmt, '-b', mid_img_path,
|
||||
'-F', iotests.imgfmt, top_img_path) == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'write -P 2 1M 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'write -P 2 1M 1M') == 0
|
||||
|
||||
# 0 1 2 3 4
|
||||
# top 2
|
||||
@ -108,10 +108,10 @@ with iotests.FilePath('base.img') as base_img_path, \
|
||||
assert qemu_img('rebase', '-u', '-b', '', '-f', iotests.imgfmt,
|
||||
top_img_path) == 0
|
||||
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 0 0 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 2 1M 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 3 2M 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 0 3M 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 3 4M 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 0 0 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 2 1M 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 3 2M 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 0 3M 1M') == 0
|
||||
assert qemu_io_silent(top_img_path, '-c', 'read -P 3 4M 1M') == 0
|
||||
|
||||
log('Done')
|
||||
|
@ -37,13 +37,14 @@ def make_argparser() -> argparse.ArgumentParser:
|
||||
|
||||
p.add_argument('-d', dest='debug', action='store_true', help='debug')
|
||||
p.add_argument('-p', dest='print', action='store_true',
|
||||
help='redirects qemu\'s stdout and stderr to the test output')
|
||||
help='redirects qemu\'s stdout and stderr to '
|
||||
'the test output')
|
||||
p.add_argument('-gdb', action='store_true',
|
||||
help="start gdbserver with $GDB_OPTIONS options \
|
||||
('localhost:12345' if $GDB_OPTIONS is empty)")
|
||||
help="start gdbserver with $GDB_OPTIONS options "
|
||||
"('localhost:12345' if $GDB_OPTIONS is empty)")
|
||||
p.add_argument('-valgrind', action='store_true',
|
||||
help='use valgrind, sets VALGRIND_QEMU environment '
|
||||
'variable')
|
||||
help='use valgrind, sets VALGRIND_QEMU environment '
|
||||
'variable')
|
||||
|
||||
p.add_argument('-misalign', action='store_true',
|
||||
help='misalign memory allocations')
|
||||
|
@ -621,7 +621,7 @@ class VM(qtest.QEMUQtestMachine):
|
||||
super()._post_shutdown()
|
||||
if not qemu_valgrind or not self._popen:
|
||||
return
|
||||
valgrind_filename = f"{test_dir}/{self._popen.pid}.valgrind"
|
||||
valgrind_filename = f"{test_dir}/{self._popen.pid}.valgrind"
|
||||
if self.exitcode() == 99:
|
||||
with open(valgrind_filename, encoding='utf-8') as f:
|
||||
print(f.read())
|
||||
@ -1363,8 +1363,9 @@ class ReproducibleStreamWrapper:
|
||||
|
||||
class ReproducibleTestRunner(unittest.TextTestRunner):
|
||||
def __init__(self, stream: Optional[TextIO] = None,
|
||||
resultclass: Type[unittest.TestResult] = ReproducibleTestResult,
|
||||
**kwargs: Any) -> None:
|
||||
resultclass: Type[unittest.TestResult] =
|
||||
ReproducibleTestResult,
|
||||
**kwargs: Any) -> None:
|
||||
rstream = ReproducibleStreamWrapper(stream or sys.stdout)
|
||||
super().__init__(stream=rstream, # type: ignore
|
||||
descriptions=True,
|
||||
|
@ -115,8 +115,8 @@ def do_test(use_cbw, base_img_path, fleece_img_path, nbd_sock_path, vm):
|
||||
|
||||
nbd_uri = 'nbd+unix:///%s?socket=%s' % (tmp_node, nbd_sock_path)
|
||||
log(vm.qmp('nbd-server-start',
|
||||
{'addr': { 'type': 'unix',
|
||||
'data': { 'path': nbd_sock_path } } }))
|
||||
{'addr': {'type': 'unix',
|
||||
'data': {'path': nbd_sock_path}}}))
|
||||
|
||||
log(vm.qmp('nbd-server-add', device=tmp_node))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user