Block patches:
- qemu-io now accepts a file to read a write pattern from - Ensure that raw files have their first block allocated so we can probe the O_DIRECT alignment if necessary - Various fixes -----BEGIN PGP SIGNATURE----- iQFGBAABCAAwFiEEkb62CjDbPohX0Rgp9AfbAGHVz0AFAl1uY5ESHG1yZWl0ekBy ZWRoYXQuY29tAAoJEPQH2wBh1c9AWiQH/2EY0dgpvMGy6Qu7S+TtD+OfZ5P3OB7y 5N62Lv6N6QUIubCtG5QtBxUpKk7MIZlKV8RzOaItyC9IkMy8Pu2tggQx6xjU/Gr0 bAx8R28I8moyoCjmgbzwATNQ6kfqBR58tuWEfm+Ee0Ws2gGGlebx2lSFvVWoIZ5+ PnGojkn0y35n+2gF51L/GaP4DAjR25DiViROc+DVomqloK+lA8WTUCQAbrA4AiXD KYFHH5wUvc4JHMKzOhnT6RolQXSgMa6sUB/ykWJii4ZXLFiRUx74Tkg3D+NUztvB mExwMMy84lZBsq5plfAZTT42mU6ZzRvfLlYZuM6ujAiIHq2bD9Sb8Fk= =/bzB -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/maxreitz/tags/pull-block-2019-09-03' into staging Block patches: - qemu-io now accepts a file to read a write pattern from - Ensure that raw files have their first block allocated so we can probe the O_DIRECT alignment if necessary - Various fixes # gpg: Signature made Tue 03 Sep 2019 13:58:57 BST # gpg: using RSA key 91BEB60A30DB3E8857D11829F407DB0061D5CF40 # gpg: issuer "mreitz@redhat.com" # gpg: Good signature from "Max Reitz <mreitz@redhat.com>" [full] # Primary key fingerprint: 91BE B60A 30DB 3E88 57D1 1829 F407 DB00 61D5 CF40 * remotes/maxreitz/tags/pull-block-2019-09-03: iotests: Unify cache mode quoting tests/check-block: Skip iotests when sanitizers are enabled iotests: Check for enabled drivers before testing them iotests: Add -display none to the qemu options file-posix: fix request_alignment typo iotests: Disable 126 for flat vmdk subformats iotests: Disable 110 for vmdk.twoGbMaxExtentSparse iotests: Disable broken streamOptimized tests vmdk: Reject invalid compressed writes iotests: Keep testing broken relative extent paths vmdk: Use bdrv_dirname() for relative extent paths iotests: Fix _filter_img_create() iotests: Test allocate_first_block() with O_DIRECT block: posix: Always allocate the first block block: fix permission update in bdrv_replace_node qemu-io: add pattern file for write command Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
6b422e5f58
5
block.c
5
block.c
@ -4165,7 +4165,6 @@ void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
|
||||
{
|
||||
BdrvChild *c, *next;
|
||||
GSList *list = NULL, *p;
|
||||
uint64_t old_perm, old_shared;
|
||||
uint64_t perm = 0, shared = BLK_PERM_ALL;
|
||||
int ret;
|
||||
|
||||
@ -4211,8 +4210,8 @@ void bdrv_replace_node(BlockDriverState *from, BlockDriverState *to,
|
||||
bdrv_unref(from);
|
||||
}
|
||||
|
||||
bdrv_get_cumulative_perm(to, &old_perm, &old_shared);
|
||||
bdrv_set_perm(to, old_perm | perm, old_shared | shared);
|
||||
bdrv_get_cumulative_perm(to, &perm, &shared);
|
||||
bdrv_set_perm(to, perm, shared);
|
||||
|
||||
out:
|
||||
g_slist_free(list);
|
||||
|
@ -380,7 +380,7 @@ static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
|
||||
for (i = 0; i < ARRAY_SIZE(alignments); i++) {
|
||||
align = alignments[i];
|
||||
if (raw_is_io_aligned(fd, buf + align, max_align)) {
|
||||
/* Fallback to request_aligment. */
|
||||
/* Fallback to request_alignment. */
|
||||
s->buf_align = (align != 1) ? align : bs->bl.request_alignment;
|
||||
break;
|
||||
}
|
||||
@ -1749,6 +1749,43 @@ static int handle_aiocb_discard(void *opaque)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Help alignment probing by allocating the first block.
|
||||
*
|
||||
* When reading with direct I/O from unallocated area on Gluster backed by XFS,
|
||||
* reading succeeds regardless of request length. In this case we fallback to
|
||||
* safe alignment which is not optimal. Allocating the first block avoids this
|
||||
* fallback.
|
||||
*
|
||||
* fd may be opened with O_DIRECT, but we don't know the buffer alignment or
|
||||
* request alignment, so we use safe values.
|
||||
*
|
||||
* Returns: 0 on success, -errno on failure. Since this is an optimization,
|
||||
* caller may ignore failures.
|
||||
*/
|
||||
static int allocate_first_block(int fd, size_t max_size)
|
||||
{
|
||||
size_t write_size = (max_size < MAX_BLOCKSIZE)
|
||||
? BDRV_SECTOR_SIZE
|
||||
: MAX_BLOCKSIZE;
|
||||
size_t max_align = MAX(MAX_BLOCKSIZE, getpagesize());
|
||||
void *buf;
|
||||
ssize_t n;
|
||||
int ret;
|
||||
|
||||
buf = qemu_memalign(max_align, write_size);
|
||||
memset(buf, 0, write_size);
|
||||
|
||||
do {
|
||||
n = pwrite(fd, buf, write_size, 0);
|
||||
} while (n == -1 && errno == EINTR);
|
||||
|
||||
ret = (n == -1) ? -errno : 0;
|
||||
|
||||
qemu_vfree(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int handle_aiocb_truncate(void *opaque)
|
||||
{
|
||||
RawPosixAIOData *aiocb = opaque;
|
||||
@ -1788,6 +1825,17 @@ static int handle_aiocb_truncate(void *opaque)
|
||||
/* posix_fallocate() doesn't set errno. */
|
||||
error_setg_errno(errp, -result,
|
||||
"Could not preallocate new data");
|
||||
} else if (current_length == 0) {
|
||||
/*
|
||||
* posix_fallocate() uses fallocate() if the filesystem
|
||||
* supports it, or fallback to manually writing zeroes. If
|
||||
* fallocate() was used, unaligned reads from the fallocated
|
||||
* area in raw_probe_alignment() will succeed, hence we need to
|
||||
* allocate the first block.
|
||||
*
|
||||
* Optimize future alignment probing; ignore failures.
|
||||
*/
|
||||
allocate_first_block(fd, offset);
|
||||
}
|
||||
} else {
|
||||
result = 0;
|
||||
@ -1849,6 +1897,9 @@ static int handle_aiocb_truncate(void *opaque)
|
||||
if (ftruncate(fd, offset) != 0) {
|
||||
result = -errno;
|
||||
error_setg_errno(errp, -result, "Could not resize file");
|
||||
} else if (current_length == 0 && offset > current_length) {
|
||||
/* Optimize future alignment probing; ignore failures. */
|
||||
allocate_first_block(fd, offset);
|
||||
}
|
||||
return result;
|
||||
default:
|
||||
|
64
block/vmdk.c
64
block/vmdk.c
@ -1076,8 +1076,7 @@ static const char *next_line(const char *s)
|
||||
}
|
||||
|
||||
static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||
const char *desc_file_path, QDict *options,
|
||||
Error **errp)
|
||||
QDict *options, Error **errp)
|
||||
{
|
||||
int ret;
|
||||
int matches;
|
||||
@ -1087,6 +1086,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||
const char *p, *np;
|
||||
int64_t sectors = 0;
|
||||
int64_t flat_offset;
|
||||
char *desc_file_dir = NULL;
|
||||
char *extent_path;
|
||||
BdrvChild *extent_file;
|
||||
BDRVVmdkState *s = bs->opaque;
|
||||
@ -1130,16 +1130,23 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!path_is_absolute(fname) && !path_has_protocol(fname) &&
|
||||
!desc_file_path[0])
|
||||
{
|
||||
bdrv_refresh_filename(bs->file->bs);
|
||||
error_setg(errp, "Cannot use relative extent paths with VMDK "
|
||||
"descriptor file '%s'", bs->file->bs->filename);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (path_is_absolute(fname)) {
|
||||
extent_path = g_strdup(fname);
|
||||
} else {
|
||||
if (!desc_file_dir) {
|
||||
desc_file_dir = bdrv_dirname(bs->file->bs, errp);
|
||||
if (!desc_file_dir) {
|
||||
bdrv_refresh_filename(bs->file->bs);
|
||||
error_prepend(errp, "Cannot use relative paths with VMDK "
|
||||
"descriptor file '%s': ",
|
||||
bs->file->bs->filename);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
extent_path = path_combine(desc_file_path, fname);
|
||||
extent_path = g_strconcat(desc_file_dir, fname, NULL);
|
||||
}
|
||||
|
||||
ret = snprintf(extent_opt_prefix, 32, "extents.%d", s->num_extents);
|
||||
assert(ret < 32);
|
||||
@ -1149,7 +1156,8 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||
g_free(extent_path);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* save to extents array */
|
||||
@ -1160,7 +1168,7 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||
0, 0, 0, 0, 0, &extent, errp);
|
||||
if (ret < 0) {
|
||||
bdrv_unref_child(bs, extent_file);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
extent->flat_start_offset = flat_offset << 9;
|
||||
} else if (!strcmp(type, "SPARSE") || !strcmp(type, "VMFSSPARSE")) {
|
||||
@ -1175,24 +1183,27 @@ static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
|
||||
g_free(buf);
|
||||
if (ret) {
|
||||
bdrv_unref_child(bs, extent_file);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
extent = &s->extents[s->num_extents - 1];
|
||||
} else if (!strcmp(type, "SESPARSE")) {
|
||||
ret = vmdk_open_se_sparse(bs, extent_file, bs->open_flags, errp);
|
||||
if (ret) {
|
||||
bdrv_unref_child(bs, extent_file);
|
||||
return ret;
|
||||
goto out;
|
||||
}
|
||||
extent = &s->extents[s->num_extents - 1];
|
||||
} else {
|
||||
error_setg(errp, "Unsupported extent type '%s'", type);
|
||||
bdrv_unref_child(bs, extent_file);
|
||||
return -ENOTSUP;
|
||||
ret = -ENOTSUP;
|
||||
goto out;
|
||||
}
|
||||
extent->type = g_strdup(type);
|
||||
}
|
||||
return 0;
|
||||
|
||||
ret = 0;
|
||||
goto out;
|
||||
|
||||
invalid:
|
||||
np = next_line(p);
|
||||
@ -1201,7 +1212,11 @@ invalid:
|
||||
np--;
|
||||
}
|
||||
error_setg(errp, "Invalid extent line: %.*s", (int)(np - p), p);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
|
||||
out:
|
||||
g_free(desc_file_dir);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int vmdk_open_desc_file(BlockDriverState *bs, int flags, char *buf,
|
||||
@ -1228,8 +1243,7 @@ static int vmdk_open_desc_file(BlockDriverState *bs, int flags, char *buf,
|
||||
}
|
||||
s->create_type = g_strdup(ct);
|
||||
s->desc_offset = 0;
|
||||
ret = vmdk_parse_extents(buf, bs, bs->file->bs->exact_filename, options,
|
||||
errp);
|
||||
ret = vmdk_parse_extents(buf, bs, options, errp);
|
||||
exit:
|
||||
return ret;
|
||||
}
|
||||
@ -1720,6 +1734,16 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset,
|
||||
if (extent->compressed) {
|
||||
void *compressed_data;
|
||||
|
||||
/* Only whole clusters */
|
||||
if (offset_in_cluster ||
|
||||
n_bytes > (extent->cluster_sectors * SECTOR_SIZE) ||
|
||||
(n_bytes < (extent->cluster_sectors * SECTOR_SIZE) &&
|
||||
offset + n_bytes != extent->end_sector * SECTOR_SIZE))
|
||||
{
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!extent->has_marker) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
|
@ -350,6 +350,79 @@ static void qemu_io_free(void *p)
|
||||
qemu_vfree(p);
|
||||
}
|
||||
|
||||
/*
|
||||
* qemu_io_alloc_from_file()
|
||||
*
|
||||
* Allocates the buffer and populates it with the content of the given file
|
||||
* up to @len bytes. If the file length is less than @len, then the buffer
|
||||
* is populated with the file content cyclically.
|
||||
*
|
||||
* @blk - the block backend where the buffer content is going to be written to
|
||||
* @len - the buffer length
|
||||
* @file_name - the file to read the content from
|
||||
*
|
||||
* Returns: the buffer pointer on success
|
||||
* NULL on error
|
||||
*/
|
||||
static void *qemu_io_alloc_from_file(BlockBackend *blk, size_t len,
|
||||
const char *file_name)
|
||||
{
|
||||
char *buf, *buf_origin;
|
||||
FILE *f = fopen(file_name, "r");
|
||||
int pattern_len;
|
||||
|
||||
if (!f) {
|
||||
perror(file_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (qemuio_misalign) {
|
||||
len += MISALIGN_OFFSET;
|
||||
}
|
||||
|
||||
buf_origin = buf = blk_blockalign(blk, len);
|
||||
|
||||
if (qemuio_misalign) {
|
||||
buf_origin += MISALIGN_OFFSET;
|
||||
buf += MISALIGN_OFFSET;
|
||||
len -= MISALIGN_OFFSET;
|
||||
}
|
||||
|
||||
pattern_len = fread(buf_origin, 1, len, f);
|
||||
|
||||
if (ferror(f)) {
|
||||
perror(file_name);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (pattern_len == 0) {
|
||||
fprintf(stderr, "%s: file is empty\n", file_name);
|
||||
goto error;
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
|
||||
if (len > pattern_len) {
|
||||
len -= pattern_len;
|
||||
buf += pattern_len;
|
||||
|
||||
while (len > 0) {
|
||||
size_t len_to_copy = MIN(pattern_len, len);
|
||||
|
||||
memcpy(buf, buf_origin, len_to_copy);
|
||||
|
||||
len -= len_to_copy;
|
||||
buf += len_to_copy;
|
||||
}
|
||||
}
|
||||
|
||||
return buf_origin;
|
||||
|
||||
error:
|
||||
qemu_io_free(buf_origin);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void dump_buffer(const void *buffer, int64_t offset, int64_t len)
|
||||
{
|
||||
uint64_t i;
|
||||
@ -948,6 +1021,7 @@ static void write_help(void)
|
||||
" -n, -- with -z, don't allow slow fallback\n"
|
||||
" -p, -- ignored for backwards compatibility\n"
|
||||
" -P, -- use different pattern to fill file\n"
|
||||
" -s, -- use a pattern file to fill the write buffer\n"
|
||||
" -C, -- report statistics in a machine parsable format\n"
|
||||
" -q, -- quiet mode, do not show I/O statistics\n"
|
||||
" -u, -- with -z, allow unmapping\n"
|
||||
@ -964,7 +1038,7 @@ static const cmdinfo_t write_cmd = {
|
||||
.perm = BLK_PERM_WRITE,
|
||||
.argmin = 2,
|
||||
.argmax = -1,
|
||||
.args = "[-bcCfnquz] [-P pattern] off len",
|
||||
.args = "[-bcCfnquz] [-P pattern | -s source_file] off len",
|
||||
.oneline = "writes a number of bytes at a specified offset",
|
||||
.help = write_help,
|
||||
};
|
||||
@ -973,7 +1047,7 @@ static int write_f(BlockBackend *blk, int argc, char **argv)
|
||||
{
|
||||
struct timespec t1, t2;
|
||||
bool Cflag = false, qflag = false, bflag = false;
|
||||
bool Pflag = false, zflag = false, cflag = false;
|
||||
bool Pflag = false, zflag = false, cflag = false, sflag = false;
|
||||
int flags = 0;
|
||||
int c, cnt, ret;
|
||||
char *buf = NULL;
|
||||
@ -982,8 +1056,9 @@ static int write_f(BlockBackend *blk, int argc, char **argv)
|
||||
/* Some compilers get confused and warn if this is not initialized. */
|
||||
int64_t total = 0;
|
||||
int pattern = 0xcd;
|
||||
const char *file_name = NULL;
|
||||
|
||||
while ((c = getopt(argc, argv, "bcCfnpP:quz")) != -1) {
|
||||
while ((c = getopt(argc, argv, "bcCfnpP:qs:uz")) != -1) {
|
||||
switch (c) {
|
||||
case 'b':
|
||||
bflag = true;
|
||||
@ -1013,6 +1088,10 @@ static int write_f(BlockBackend *blk, int argc, char **argv)
|
||||
case 'q':
|
||||
qflag = true;
|
||||
break;
|
||||
case 's':
|
||||
sflag = true;
|
||||
file_name = optarg;
|
||||
break;
|
||||
case 'u':
|
||||
flags |= BDRV_REQ_MAY_UNMAP;
|
||||
break;
|
||||
@ -1050,8 +1129,9 @@ static int write_f(BlockBackend *blk, int argc, char **argv)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (zflag && Pflag) {
|
||||
printf("-z and -P cannot be specified at the same time\n");
|
||||
if (zflag + Pflag + sflag > 1) {
|
||||
printf("Only one of -z, -P, and -s "
|
||||
"can be specified at the same time\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1087,7 +1167,14 @@ static int write_f(BlockBackend *blk, int argc, char **argv)
|
||||
}
|
||||
|
||||
if (!zflag) {
|
||||
buf = qemu_io_alloc(blk, count, pattern);
|
||||
if (sflag) {
|
||||
buf = qemu_io_alloc_from_file(blk, count, file_name);
|
||||
if (!buf) {
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
buf = qemu_io_alloc(blk, count, pattern);
|
||||
}
|
||||
}
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &t1);
|
||||
|
@ -21,6 +21,11 @@ if grep -q "TARGET_GPROF=y" *-softmmu/config-target.mak 2>/dev/null ; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if grep -q "CFLAGS.*-fsanitize" config-host.mak 2>/dev/null ; then
|
||||
echo "Sanitizers are enabled ==> Not running the qemu-iotests."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ -z "$(find . -name 'qemu-system-*' -print)" ]; then
|
||||
echo "No qemu-system binary available ==> Not running the qemu-iotests."
|
||||
exit 0
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt generic
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
|
||||
size=128M
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt generic
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
size=128M
|
||||
offset=67M
|
||||
|
@ -43,7 +43,8 @@ _supported_fmt generic
|
||||
_supported_proto generic
|
||||
_supported_os Linux
|
||||
_unsupported_imgopts "subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
"subformat=twoGbMaxExtentSparse" \
|
||||
"subformat=streamOptimized"
|
||||
|
||||
# vpc is limited to 127GB, so we can't test it here
|
||||
if [ "$IMGFMT" = "vpc" ]; then
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt generic
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
|
||||
size=6G
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt generic
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
|
||||
size=6G
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt generic
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
|
||||
size=6G
|
||||
|
@ -41,7 +41,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt qcow qcow2 vmdk qed
|
||||
_supported_proto generic
|
||||
_unsupported_proto vxhs
|
||||
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat"
|
||||
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=streamOptimized"
|
||||
|
||||
TEST_OFFSETS="0 4294967296"
|
||||
|
||||
|
@ -41,7 +41,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt qcow qcow2 vmdk qed
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat"
|
||||
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat" \
|
||||
"streamOptimized"
|
||||
|
||||
TEST_OFFSETS="0 4294967296"
|
||||
|
||||
|
@ -47,7 +47,8 @@ _supported_proto file
|
||||
_supported_os Linux
|
||||
_unsupported_imgopts "subformat=monolithicFlat" \
|
||||
"subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
"subformat=twoGbMaxExtentSparse" \
|
||||
"subformat=streamOptimized"
|
||||
|
||||
TEST_OFFSETS="0 4294967296"
|
||||
CLUSTER_SIZE=65536
|
||||
|
@ -44,7 +44,8 @@ _supported_fmt qcow qcow2 vmdk qed
|
||||
_supported_proto file
|
||||
_unsupported_imgopts "subformat=monolithicFlat" \
|
||||
"subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
"subformat=twoGbMaxExtentSparse" \
|
||||
"subformat=streamOptimized"
|
||||
|
||||
TEST_OFFSETS="0 4294967296"
|
||||
|
||||
|
@ -41,8 +41,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
# Currently only qcow2 supports rebasing
|
||||
_supported_fmt qcow2
|
||||
_supported_proto file
|
||||
_default_cache_mode "writethrough"
|
||||
_supported_cache_modes "writethrough" "none"
|
||||
_default_cache_mode writethrough
|
||||
_supported_cache_modes writethrough none
|
||||
# The refcount table tests expect a certain minimum width for refcount entries
|
||||
# (so that the refcount table actually needs to grow); that minimum is 16 bits,
|
||||
# being the default refcount entry width.
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt vmdk qcow qcow2 qed
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
|
||||
size=128M
|
||||
|
@ -42,6 +42,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
# This works for any image format (though unlikely to segfault for raw)
|
||||
_supported_fmt generic
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
echo
|
||||
echo === Prepare image ===
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt generic
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
|
||||
size=128M
|
||||
|
@ -41,7 +41,8 @@ _supported_proto file
|
||||
_supported_os Linux
|
||||
_unsupported_imgopts "subformat=monolithicFlat" \
|
||||
"subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
"subformat=twoGbMaxExtentSparse" \
|
||||
"subformat=streamOptimized"
|
||||
|
||||
CLUSTER_SIZE=4k
|
||||
size=128M
|
||||
|
@ -40,7 +40,8 @@ _supported_fmt qcow qcow2 vmdk qed
|
||||
_supported_proto file
|
||||
_unsupported_imgopts "subformat=monolithicFlat" \
|
||||
"subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
"subformat=twoGbMaxExtentSparse" \
|
||||
"subformat=streamOptimized"
|
||||
|
||||
CLUSTER_SIZE=4k
|
||||
size=128M
|
||||
|
@ -42,8 +42,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt qcow2
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
_default_cache_mode "writethrough"
|
||||
_supported_cache_modes "writethrough"
|
||||
_default_cache_mode writethrough
|
||||
_supported_cache_modes writethrough
|
||||
|
||||
size=128M
|
||||
|
||||
|
@ -40,7 +40,7 @@ _supported_fmt generic
|
||||
_supported_proto file
|
||||
|
||||
# Don't do O_DIRECT on tmpfs
|
||||
_supported_cache_modes "writeback" "writethrough" "unsafe"
|
||||
_supported_cache_modes writeback writethrough unsafe
|
||||
|
||||
size=128M
|
||||
_make_test_img $size
|
||||
|
@ -114,11 +114,41 @@ $QEMU_IMG convert -f qcow2 -O vmdk -o subformat=streamOptimized "$TEST_IMG.qcow2
|
||||
|
||||
echo
|
||||
echo "=== Testing monolithicFlat with internally generated JSON file name ==="
|
||||
|
||||
echo '--- blkdebug ---'
|
||||
# Should work, because bdrv_dirname() works fine with blkdebug
|
||||
IMGOPTS="subformat=monolithicFlat" _make_test_img 64M
|
||||
$QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.image.filename=$TEST_IMG,file.inject-error.0.event=read_aio" 2>&1 \
|
||||
| _filter_testdir | _filter_imgfmt
|
||||
$QEMU_IO -c "open -o driver=$IMGFMT,file.driver=blkdebug,file.image.filename=$TEST_IMG,file.inject-error.0.event=read_aio" \
|
||||
-c info \
|
||||
2>&1 \
|
||||
| _filter_testdir | _filter_imgfmt | _filter_img_info
|
||||
_cleanup_test_img
|
||||
|
||||
echo '--- quorum ---'
|
||||
# Should not work, because bdrv_dirname() does not work with quorum
|
||||
IMGOPTS="subformat=monolithicFlat" _make_test_img 64M
|
||||
cp "$TEST_IMG" "$TEST_IMG.orig"
|
||||
|
||||
filename="json:{
|
||||
\"driver\": \"$IMGFMT\",
|
||||
\"file\": {
|
||||
\"driver\": \"quorum\",
|
||||
\"children\": [ {
|
||||
\"driver\": \"file\",
|
||||
\"filename\": \"$TEST_IMG\"
|
||||
}, {
|
||||
\"driver\": \"file\",
|
||||
\"filename\": \"$TEST_IMG.orig\"
|
||||
} ],
|
||||
\"vote-threshold\": 1
|
||||
} }"
|
||||
|
||||
filename=$(echo "$filename" | tr '\n' ' ' | sed -e 's/\s\+/ /g')
|
||||
$QEMU_IMG info "$filename" 2>&1 \
|
||||
| sed -e "s/'json:[^']*'/\$QUORUM_FILE/g" \
|
||||
| _filter_testdir | _filter_imgfmt | _filter_img_info
|
||||
|
||||
|
||||
echo
|
||||
echo "=== Testing version 3 ==="
|
||||
_use_sample_img iotest-version3.vmdk.bz2
|
||||
|
@ -13,21 +13,21 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||
qemu-io: can't open device TEST_DIR/t.vmdk: L1 size too big
|
||||
|
||||
=== Testing monolithicFlat creation and opening ===
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2147483648 subformat=monolithicFlat
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2147483648
|
||||
image: TEST_DIR/t.IMGFMT
|
||||
file format: IMGFMT
|
||||
virtual size: 2 GiB (2147483648 bytes)
|
||||
|
||||
=== Testing monolithicFlat with zeroed_grain ===
|
||||
qemu-img: TEST_DIR/t.IMGFMT: Flat image can't enable zeroed grain
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2147483648 subformat=monolithicFlat
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=2147483648
|
||||
|
||||
=== Testing big twoGbMaxExtentFlat ===
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824000 subformat=twoGbMaxExtentFlat
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1073741824000
|
||||
image: TEST_DIR/t.vmdk
|
||||
file format: vmdk
|
||||
virtual size: 0.977 TiB (1073741824000 bytes)
|
||||
disk size: 16 KiB
|
||||
disk size: 1.97 MiB
|
||||
Format specific information:
|
||||
cid: XXXXXXXX
|
||||
parent cid: XXXXXXXX
|
||||
@ -2038,7 +2038,7 @@ Format specific information:
|
||||
qemu-img: Could not open 'TEST_DIR/t.IMGFMT': Invalid extent line: RW 12582912 VMFS "dummy.IMGFMT" 1
|
||||
|
||||
=== Testing truncated sparse ===
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=107374182400 subformat=monolithicSparse
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=107374182400
|
||||
qemu-img: Could not open 'TEST_DIR/t.IMGFMT': File truncated, expecting at least 13172736 bytes
|
||||
|
||||
=== Converting to streamOptimized from image with small cluster size===
|
||||
@ -2049,8 +2049,14 @@ wrote 512/512 bytes at offset 10240
|
||||
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
|
||||
=== Testing monolithicFlat with internally generated JSON file name ===
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864 subformat=monolithicFlat
|
||||
qemu-io: can't open: Cannot use relative extent paths with VMDK descriptor file 'json:{"image": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "driver": "blkdebug", "inject-error.0.event": "read_aio"}'
|
||||
--- blkdebug ---
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||
format name: IMGFMT
|
||||
cluster size: 0 bytes
|
||||
vm state offset: 0 bytes
|
||||
--- quorum ---
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=67108864
|
||||
qemu-img: Could not open $QUORUM_FILE: Cannot use relative paths with VMDK descriptor file $QUORUM_FILE: Cannot generate a base directory for quorum nodes
|
||||
|
||||
=== Testing version 3 ===
|
||||
image: TEST_DIR/iotest-version3.IMGFMT
|
||||
@ -2259,7 +2265,7 @@ read 512/512 bytes at offset 64931328
|
||||
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
|
||||
=== Testing 4TB monolithicFlat creation and IO ===
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4398046511104 subformat=monolithicFlat
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=4398046511104
|
||||
image: TEST_DIR/t.IMGFMT
|
||||
file format: IMGFMT
|
||||
virtual size: 4 TiB (4398046511104 bytes)
|
||||
@ -2333,7 +2339,7 @@ read 1024/1024 bytes at offset 966367641600
|
||||
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
|
||||
=== Testing qemu-img map on extents ===
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33285996544 subformat=monolithicSparse
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33285996544
|
||||
wrote 1024/1024 bytes at offset 65024
|
||||
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
wrote 1024/1024 bytes at offset 2147483136
|
||||
@ -2344,7 +2350,7 @@ Offset Length Mapped to File
|
||||
0 0x20000 0x3f0000 TEST_DIR/t.vmdk
|
||||
0x7fff0000 0x20000 0x410000 TEST_DIR/t.vmdk
|
||||
0x140000000 0x10000 0x430000 TEST_DIR/t.vmdk
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33285996544 subformat=twoGbMaxExtentSparse
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=33285996544
|
||||
wrote 1024/1024 bytes at offset 65024
|
||||
1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
wrote 1024/1024 bytes at offset 2147483136
|
||||
|
@ -43,7 +43,8 @@ _supported_fmt qcow qcow2 vmdk qed raw
|
||||
_supported_proto file
|
||||
_unsupported_imgopts "subformat=monolithicFlat" \
|
||||
"subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
"subformat=twoGbMaxExtentSparse" \
|
||||
"subformat=streamOptimized"
|
||||
|
||||
_make_test_img 4M
|
||||
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt qcow2
|
||||
_supported_proto file
|
||||
_require_drivers blkdebug blkverify
|
||||
|
||||
do_run_qemu()
|
||||
{
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt vpc vmdk vhdx vdi qed qcow2 qcow
|
||||
_supported_proto file
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
IMG_SIZE=64M
|
||||
|
||||
|
@ -41,6 +41,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt raw
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
_require_drivers quorum
|
||||
|
||||
do_run_qemu()
|
||||
{
|
||||
@ -55,9 +56,6 @@ run_qemu()
|
||||
| _filter_qemu_io | _filter_generated_node_ids
|
||||
}
|
||||
|
||||
test_quorum=$($QEMU_IMG --help|grep quorum)
|
||||
[ "$test_quorum" = "" ] && _supported_fmt quorum
|
||||
|
||||
quorum="driver=raw,file.driver=quorum,file.vote-threshold=2"
|
||||
quorum="$quorum,file.children.0.file.filename=$TEST_DIR/1.raw"
|
||||
quorum="$quorum,file.children.1.file.filename=$TEST_DIR/2.raw"
|
||||
|
@ -46,8 +46,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt qcow2
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
_default_cache_mode "none"
|
||||
_supported_cache_modes "writethrough" "none" "writeback"
|
||||
_default_cache_mode none
|
||||
_supported_cache_modes writethrough none writeback
|
||||
|
||||
size=1G
|
||||
|
||||
|
@ -42,6 +42,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt qcow qcow2 qed vdi vhdx vmdk vpc
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
_require_drivers blkdebug blkverify
|
||||
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
|
||||
|
@ -39,7 +39,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt qcow2 vmdk vhdx qed
|
||||
_supported_proto generic
|
||||
_unsupported_imgopts "subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
"subformat=twoGbMaxExtentSparse" \
|
||||
"subformat=streamOptimized"
|
||||
|
||||
echo
|
||||
echo "creating large image"
|
||||
|
@ -40,7 +40,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
# Any format supporting backing files
|
||||
_supported_fmt qed qcow qcow2 vmdk
|
||||
_supported_proto file
|
||||
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat"
|
||||
_unsupported_imgopts "subformat=monolithicFlat" "subformat=twoGbMaxExtentFlat" \
|
||||
"subformat=twoGbMaxExtentSparse"
|
||||
|
||||
TEST_IMG_REL=$(basename "$TEST_IMG")
|
||||
|
||||
|
@ -40,6 +40,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt generic
|
||||
_supported_proto file
|
||||
_unsupported_fmt luks
|
||||
_require_drivers raw
|
||||
|
||||
_make_test_img 64M
|
||||
|
||||
|
@ -33,6 +33,8 @@ status=1 # failure is the default!
|
||||
|
||||
# Needs backing file support
|
||||
_supported_fmt qcow qcow2 qed vmdk
|
||||
_unsupported_imgopts "subformat=monolithicFlat" \
|
||||
"subformat=twoGbMaxExtentFlat"
|
||||
# This is the default protocol (and we want to test the difference between
|
||||
# colons which separate a protocol prefix from the rest and colons which are
|
||||
# just part of the filename, so we cannot test protocols which require a prefix)
|
||||
|
12
tests/qemu-iotests/150.out.raw
Normal file
12
tests/qemu-iotests/150.out.raw
Normal file
@ -0,0 +1,12 @@
|
||||
QA output created by 150
|
||||
|
||||
=== Mapping sparse conversion ===
|
||||
|
||||
Offset Length File
|
||||
0 0x1000 TEST_DIR/t.IMGFMT
|
||||
|
||||
=== Mapping non-sparse conversion ===
|
||||
|
||||
Offset Length File
|
||||
0 0x100000 TEST_DIR/t.IMGFMT
|
||||
*** done
|
@ -39,9 +39,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
. ./common.filter
|
||||
|
||||
_supported_fmt generic
|
||||
|
||||
test_ssh=$($QEMU_IMG --help | grep '^Supported formats:.* ssh\( \|$\)')
|
||||
[ "$test_ssh" = "" ] && _notrun "ssh support required"
|
||||
_require_drivers ssh
|
||||
|
||||
echo
|
||||
echo '=== NBD ==='
|
||||
|
@ -37,14 +37,33 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
# the file size. This function hides the resulting difference in the
|
||||
# stat -c '%b' output.
|
||||
# Parameter 1: Number of blocks an empty file occupies
|
||||
# Parameter 2: Image size in bytes
|
||||
# Parameter 2: Minimal number of blocks in an image
|
||||
# Parameter 3: Image size in bytes
|
||||
_filter_blocks()
|
||||
{
|
||||
extra_blocks=$1
|
||||
img_size=$2
|
||||
min_blocks=$2
|
||||
img_size=$3
|
||||
|
||||
sed -e "s/blocks=$extra_blocks\\(\$\\|[^0-9]\\)/nothing allocated/" \
|
||||
-e "s/blocks=$((extra_blocks + img_size / 512))\\(\$\\|[^0-9]\\)/everything allocated/"
|
||||
sed -e "s/blocks=$min_blocks\\(\$\\|[^0-9]\\)/min allocation/" \
|
||||
-e "s/blocks=$((extra_blocks + img_size / 512))\\(\$\\|[^0-9]\\)/max allocation/"
|
||||
}
|
||||
|
||||
# Resize image using block_resize.
|
||||
# Parameter 1: image path
|
||||
# Parameter 2: new size
|
||||
_block_resize()
|
||||
{
|
||||
local path=$1
|
||||
local size=$2
|
||||
|
||||
$QEMU -qmp stdio -nographic -nodefaults \
|
||||
-blockdev file,node-name=file,filename=$path,cache.direct=on \
|
||||
<<EOF
|
||||
{'execute': 'qmp_capabilities'}
|
||||
{'execute': 'block_resize', 'arguments': {'node-name': 'file', 'size': $size}}
|
||||
{'execute': 'quit'}
|
||||
EOF
|
||||
}
|
||||
|
||||
# get standard environment, filters and checks
|
||||
@ -55,21 +74,37 @@ _supported_fmt raw
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
|
||||
_default_cache_mode none
|
||||
_supported_cache_modes none directsync
|
||||
|
||||
size=$((1 * 1024 * 1024))
|
||||
|
||||
touch "$TEST_DIR/empty"
|
||||
extra_blocks=$(stat -c '%b' "$TEST_DIR/empty")
|
||||
|
||||
# We always write the first byte; check how many blocks this filesystem
|
||||
# allocates to match empty image alloation.
|
||||
printf "\0" > "$TEST_DIR/empty"
|
||||
min_blocks=$(stat -c '%b' "$TEST_DIR/empty")
|
||||
|
||||
echo
|
||||
echo "== creating image with default preallocation =="
|
||||
_make_test_img $size | _filter_imgfmt
|
||||
stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $size
|
||||
stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size
|
||||
|
||||
for mode in off full falloc; do
|
||||
echo
|
||||
echo "== creating image with preallocation $mode =="
|
||||
IMGOPTS=preallocation=$mode _make_test_img $size | _filter_imgfmt
|
||||
stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $size
|
||||
stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $size
|
||||
done
|
||||
|
||||
for new_size in 4096 1048576; do
|
||||
echo
|
||||
echo "== resize empty image with block_resize =="
|
||||
_make_test_img 0 | _filter_imgfmt
|
||||
_block_resize $TEST_IMG $new_size >/dev/null
|
||||
stat -c "size=%s, blocks=%b" $TEST_IMG | _filter_blocks $extra_blocks $min_blocks $new_size
|
||||
done
|
||||
|
||||
# success, all done
|
||||
|
@ -2,17 +2,25 @@ QA output created by 175
|
||||
|
||||
== creating image with default preallocation ==
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576
|
||||
size=1048576, nothing allocated
|
||||
size=1048576, min allocation
|
||||
|
||||
== creating image with preallocation off ==
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 preallocation=off
|
||||
size=1048576, nothing allocated
|
||||
size=1048576, min allocation
|
||||
|
||||
== creating image with preallocation full ==
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 preallocation=full
|
||||
size=1048576, everything allocated
|
||||
size=1048576, max allocation
|
||||
|
||||
== creating image with preallocation falloc ==
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048576 preallocation=falloc
|
||||
size=1048576, everything allocated
|
||||
size=1048576, max allocation
|
||||
|
||||
== resize empty image with block_resize ==
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=0
|
||||
size=4096, min allocation
|
||||
|
||||
== resize empty image with block_resize ==
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=0
|
||||
size=1048576, min allocation
|
||||
*** done
|
||||
|
@ -101,7 +101,7 @@ converted image file size in bytes: 196608
|
||||
== raw input image with data (human) ==
|
||||
|
||||
Formatting 'TEST_DIR/t.qcow2', fmt=IMGFMT size=1073741824
|
||||
required size: 393216
|
||||
required size: 458752
|
||||
fully allocated size: 1074135040
|
||||
wrote 512/512 bytes at offset 512
|
||||
512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
@ -257,7 +257,7 @@ converted image file size in bytes: 196608
|
||||
|
||||
Formatting 'TEST_DIR/t.qcow2', fmt=IMGFMT size=1073741824
|
||||
{
|
||||
"required": 393216,
|
||||
"required": 458752,
|
||||
"fully-allocated": 1074135040
|
||||
}
|
||||
wrote 512/512 bytes at offset 512
|
||||
|
@ -33,6 +33,7 @@ trap "exit \$status" 0 1 2 3 15
|
||||
. ./common.filter
|
||||
|
||||
_supported_os Linux
|
||||
_require_drivers throttle
|
||||
|
||||
do_run_qemu()
|
||||
{
|
||||
|
@ -38,6 +38,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
|
||||
_supported_fmt qcow2
|
||||
_supported_proto file
|
||||
_require_drivers null-co
|
||||
|
||||
if [ "$QEMU_DEFAULT_MACHINE" != "pc" ]; then
|
||||
_notrun "Requires a PC machine"
|
||||
|
@ -53,6 +53,7 @@ _supported_fmt generic
|
||||
_supported_proto generic
|
||||
# LUKS support may be possible, but it complicates things.
|
||||
_unsupported_fmt luks
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
echo
|
||||
echo '=== Copy-on-read ==='
|
||||
|
@ -50,6 +50,7 @@ _supported_fmt generic
|
||||
_supported_proto generic
|
||||
# LUKS support may be possible, but it complicates things.
|
||||
_unsupported_fmt luks
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
echo
|
||||
echo '=== Copy-on-read ==='
|
||||
|
@ -3,14 +3,18 @@ QA output created by 221
|
||||
=== Check mapping of unaligned raw image ===
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=65537
|
||||
[{ "start": 0, "length": 66048, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
[{ "start": 0, "length": 66048, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 4096, "length": 61952, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 4096, "length": 61952, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
wrote 1/1 bytes at offset 65536
|
||||
1 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
[{ "start": 0, "length": 65536, "depth": 0, "zero": true, "data": false, "offset": OFFSET},
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 4096, "length": 61440, "depth": 0, "zero": true, "data": false, "offset": OFFSET},
|
||||
{ "start": 65536, "length": 1, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 65537, "length": 511, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
[{ "start": 0, "length": 65536, "depth": 0, "zero": true, "data": false, "offset": OFFSET},
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 4096, "length": 61440, "depth": 0, "zero": true, "data": false, "offset": OFFSET},
|
||||
{ "start": 65536, "length": 1, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 65537, "length": 511, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
*** done
|
||||
|
@ -40,6 +40,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
|
||||
_supported_fmt generic
|
||||
_supported_proto file
|
||||
_supported_os Linux
|
||||
_unsupported_imgopts "subformat=streamOptimized"
|
||||
|
||||
if [ "$IMGOPTSSYNTAX" = "true" ]; then
|
||||
# We use json:{} filenames here, so we cannot work with additional options.
|
||||
|
@ -3,12 +3,16 @@ QA output created by 253
|
||||
=== Check mapping of unaligned raw image ===
|
||||
|
||||
Formatting 'TEST_DIR/t.IMGFMT', fmt=IMGFMT size=1048575
|
||||
[{ "start": 0, "length": 1048576, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
[{ "start": 0, "length": 1048576, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 4096, "length": 1044480, "depth": 0, "zero": true, "data": false, "offset": OFFSET}]
|
||||
wrote 65535/65535 bytes at offset 983040
|
||||
63.999 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
|
||||
[{ "start": 0, "length": 983040, "depth": 0, "zero": true, "data": false, "offset": OFFSET},
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 4096, "length": 978944, "depth": 0, "zero": true, "data": false, "offset": OFFSET},
|
||||
{ "start": 983040, "length": 65536, "depth": 0, "zero": false, "data": true, "offset": OFFSET}]
|
||||
[{ "start": 0, "length": 983040, "depth": 0, "zero": true, "data": false, "offset": OFFSET},
|
||||
[{ "start": 0, "length": 4096, "depth": 0, "zero": false, "data": true, "offset": OFFSET},
|
||||
{ "start": 4096, "length": 978944, "depth": 0, "zero": true, "data": false, "offset": OFFSET},
|
||||
{ "start": 983040, "length": 65536, "depth": 0, "zero": false, "data": true, "offset": OFFSET}]
|
||||
*** done
|
||||
|
@ -581,13 +581,13 @@ export QEMU_PROG="$(type -p "$QEMU_PROG")"
|
||||
|
||||
case "$QEMU_PROG" in
|
||||
*qemu-system-arm|*qemu-system-aarch64)
|
||||
export QEMU_OPTIONS="-nodefaults -machine virt,accel=qtest"
|
||||
export QEMU_OPTIONS="-nodefaults -display none -machine virt,accel=qtest"
|
||||
;;
|
||||
*qemu-system-tricore)
|
||||
export QEMU_OPTIONS="-nodefaults -machine tricore_testboard,accel=qtest"
|
||||
export QEMU_OPTIONS="-nodefaults -display none -machine tricore_testboard,accel=qtest"
|
||||
;;
|
||||
*)
|
||||
export QEMU_OPTIONS="-nodefaults -machine accel=qtest"
|
||||
export QEMU_OPTIONS="-nodefaults -display none -machine accel=qtest"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@ -130,8 +130,8 @@ _filter_img_create()
|
||||
-e "s# compat6=\\(on\\|off\\)##g" \
|
||||
-e "s# static=\\(on\\|off\\)##g" \
|
||||
-e "s# zeroed_grain=\\(on\\|off\\)##g" \
|
||||
-e "s# subformat='[^']*'##g" \
|
||||
-e "s# adapter_type='[^']*'##g" \
|
||||
-e "s# subformat=[^ ]*##g" \
|
||||
-e "s# adapter_type=[^ ]*##g" \
|
||||
-e "s# hwversion=[^ ]*##g" \
|
||||
-e "s# lazy_refcounts=\\(on\\|off\\)##g" \
|
||||
-e "s# block_size=[0-9]\\+##g" \
|
||||
|
@ -520,5 +520,19 @@ _require_command()
|
||||
[ -x "$c" ] || _notrun "$1 utility required, skipped this test"
|
||||
}
|
||||
|
||||
# Check that a set of drivers has been whitelisted in the QEMU binary
|
||||
#
|
||||
_require_drivers()
|
||||
{
|
||||
available=$($QEMU -drive format=help | \
|
||||
sed -e '/Supported formats:/!d' -e 's/Supported formats://')
|
||||
for driver
|
||||
do
|
||||
if ! echo "$available" | grep -q " $driver\( \|$\)"; then
|
||||
_notrun "$driver not available"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# make sure this script returns success
|
||||
true
|
||||
|
Loading…
Reference in New Issue
Block a user