import qemu-kvm-4.2.0-52.module+el8.5.0+11386+ef5875dd
This commit is contained in:
parent
63c0d3bd35
commit
b8d4c1fef6
@ -0,0 +1,76 @@
|
||||
From 8c339c3535728179acc94deb5b922aebcfac9ab6 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Huth <thuth@redhat.com>
|
||||
Date: Thu, 3 Jun 2021 16:13:34 -0400
|
||||
Subject: [PATCH 2/4] block/file-posix: Fix problem with fallocate(PUNCH_HOLE)
|
||||
on GPFS
|
||||
|
||||
RH-Author: Thomas Huth <thuth@redhat.com>
|
||||
Message-id: <20210603161334.607005-2-thuth@redhat.com>
|
||||
Patchwork-id: 101673
|
||||
O-Subject: [RHEL-8.5.0 qemu-kvm PATCH 1/1] block/file-posix: Fix problem with fallocate(PUNCH_HOLE) on GPFS
|
||||
Bugzilla: 1944861
|
||||
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
||||
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
||||
|
||||
A customer reported that running
|
||||
|
||||
qemu-img convert -t none -O qcow2 -f qcow2 input.qcow2 output.qcow2
|
||||
|
||||
fails for them with the following error message when the images are
|
||||
stored on a GPFS file system :
|
||||
|
||||
qemu-img: error while writing sector 0: Invalid argument
|
||||
|
||||
After analyzing the strace output, it seems like the problem is in
|
||||
handle_aiocb_write_zeroes(): The call to fallocate(FALLOC_FL_PUNCH_HOLE)
|
||||
returns EINVAL, which can apparently happen if the file system has
|
||||
a different idea of the granularity of the operation. It's arguably
|
||||
a bug in GPFS, since the PUNCH_HOLE mode should not result in EINVAL
|
||||
according to the man-page of fallocate(), but the file system is out
|
||||
there in production and so we have to deal with it. In commit 294682cc3a
|
||||
("block: workaround for unaligned byte range in fallocate()") we also
|
||||
already applied the a work-around for the same problem to the earlier
|
||||
fallocate(FALLOC_FL_ZERO_RANGE) call, so do it now similar with the
|
||||
PUNCH_HOLE call. But instead of silently catching and returning
|
||||
-ENOTSUP (which causes the caller to fall back to writing zeroes),
|
||||
let's rather inform the user once about the buggy file system and
|
||||
try the other fallback instead.
|
||||
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Message-Id: <20210527172020.847617-2-thuth@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit 73ebf29729d1a40feaa9f8ab8951b6ee6dbfbede)
|
||||
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1944861
|
||||
Signed-off-by: Thomas Huth <thuth@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 11 +++++++++++
|
||||
1 file changed, 11 insertions(+)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 62a463229f..371572f1b0 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -1587,6 +1587,17 @@ static int handle_aiocb_write_zeroes(void *opaque)
|
||||
return ret;
|
||||
}
|
||||
s->has_fallocate = false;
|
||||
+ } else if (ret == -EINVAL) {
|
||||
+ /*
|
||||
+ * Some file systems like older versions of GPFS do not like un-
|
||||
+ * aligned byte ranges, and return EINVAL in such a case, though
|
||||
+ * they should not do it according to the man-page of fallocate().
|
||||
+ * Warn about the bad filesystem and try the final fallback instead.
|
||||
+ */
|
||||
+ warn_report_once("Your file system is misbehaving: "
|
||||
+ "fallocate(FALLOC_FL_PUNCH_HOLE) returned EINVAL. "
|
||||
+ "Please report this bug to your file sytem "
|
||||
+ "vendor.");
|
||||
} else if (ret != -ENOTSUP) {
|
||||
return ret;
|
||||
} else {
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,466 @@
|
||||
From 7ee01b5ccb7fc660dafaf3fdb1578649d17fbddf Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Wolf <kwolf@redhat.com>
|
||||
Date: Wed, 26 May 2021 09:05:52 -0400
|
||||
Subject: [PATCH 1/4] file-posix: Mitigate file fragmentation with extent size
|
||||
hints
|
||||
|
||||
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-id: <20210526090552.155820-2-kwolf@redhat.com>
|
||||
Patchwork-id: 101638
|
||||
O-Subject: [RHEL-8.5.0 qemu-kvm PATCH 1/1] file-posix: Mitigate file fragmentation with extent size hints
|
||||
Bugzilla: 1877163
|
||||
RH-Acked-by: Sergio Lopez Pascual <slp@redhat.com>
|
||||
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
||||
|
||||
Especially when O_DIRECT is used with image files so that the page cache
|
||||
indirection can't cause a merge of allocating requests, the file will
|
||||
fragment on the file system layer, with a potentially very small
|
||||
fragment size (this depends on the requests the guest sent).
|
||||
|
||||
On Linux, fragmentation can be reduced by setting an extent size hint
|
||||
when creating the file (at least on XFS, it can't be set any more after
|
||||
the first extent has been allocated), basically giving raw files a
|
||||
"cluster size" for allocation.
|
||||
|
||||
This adds a create option to set the extent size hint, and changes the
|
||||
default from not setting a hint to setting it to 1 MB. The main reason
|
||||
why qcow2 defaults to smaller cluster sizes is that COW becomes more
|
||||
expensive, which is not an issue with raw files, so we can choose a
|
||||
larger size. The tradeoff here is only potentially wasted disk space.
|
||||
|
||||
For qcow2 (or other image formats) over file-posix, the advantage should
|
||||
even be greater because they grow sequentially without leaving holes, so
|
||||
there won't be wasted space. Setting even larger extent size hints for
|
||||
such images may make sense. This can be done with the new option, but
|
||||
let's keep the default conservative for now.
|
||||
|
||||
The effect is very visible with a test that intentionally creates a
|
||||
badly fragmented file with qemu-img bench (the time difference while
|
||||
creating the file is already remarkable) and then looks at the number of
|
||||
extents and the time a simple "qemu-img map" takes.
|
||||
|
||||
Without an extent size hint:
|
||||
|
||||
$ ./qemu-img create -f raw -o extent_size_hint=0 ~/tmp/test.raw 10G
|
||||
Formatting '/home/kwolf/tmp/test.raw', fmt=raw size=10737418240 extent_size_hint=0
|
||||
$ ./qemu-img bench -f raw -t none -n -w ~/tmp/test.raw -c 1000000 -S 8192 -o 0
|
||||
Sending 1000000 write requests, 4096 bytes each, 64 in parallel (starting at offset 0, step size 8192)
|
||||
Run completed in 25.848 seconds.
|
||||
$ ./qemu-img bench -f raw -t none -n -w ~/tmp/test.raw -c 1000000 -S 8192 -o 4096
|
||||
Sending 1000000 write requests, 4096 bytes each, 64 in parallel (starting at offset 4096, step size 8192)
|
||||
Run completed in 19.616 seconds.
|
||||
$ filefrag ~/tmp/test.raw
|
||||
/home/kwolf/tmp/test.raw: 2000000 extents found
|
||||
$ time ./qemu-img map ~/tmp/test.raw
|
||||
Offset Length Mapped to File
|
||||
0 0x1e8480000 0 /home/kwolf/tmp/test.raw
|
||||
|
||||
real 0m1,279s
|
||||
user 0m0,043s
|
||||
sys 0m1,226s
|
||||
|
||||
With the new default extent size hint of 1 MB:
|
||||
|
||||
$ ./qemu-img create -f raw -o extent_size_hint=1M ~/tmp/test.raw 10G
|
||||
Formatting '/home/kwolf/tmp/test.raw', fmt=raw size=10737418240 extent_size_hint=1048576
|
||||
$ ./qemu-img bench -f raw -t none -n -w ~/tmp/test.raw -c 1000000 -S 8192 -o 0
|
||||
Sending 1000000 write requests, 4096 bytes each, 64 in parallel (starting at offset 0, step size 8192)
|
||||
Run completed in 11.833 seconds.
|
||||
$ ./qemu-img bench -f raw -t none -n -w ~/tmp/test.raw -c 1000000 -S 8192 -o 4096
|
||||
Sending 1000000 write requests, 4096 bytes each, 64 in parallel (starting at offset 4096, step size 8192)
|
||||
Run completed in 10.155 seconds.
|
||||
$ filefrag ~/tmp/test.raw
|
||||
/home/kwolf/tmp/test.raw: 178 extents found
|
||||
$ time ./qemu-img map ~/tmp/test.raw
|
||||
Offset Length Mapped to File
|
||||
0 0x1e8480000 0 /home/kwolf/tmp/test.raw
|
||||
|
||||
real 0m0,061s
|
||||
user 0m0,040s
|
||||
sys 0m0,014s
|
||||
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Message-Id: <20200707142329.48303-1-kwolf@redhat.com>
|
||||
Reviewed-by: Eric Blake <eblake@redhat.com>
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
(cherry picked from commit ffa244c84a1a30dff69ecc80b0137a2b6d428ecb)
|
||||
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
block/file-posix.c | 44 ++++++++++++++++++++++++++++++++
|
||||
include/block/block_int.h | 1 +
|
||||
qapi/block-core.json | 11 +++++---
|
||||
tests/qemu-iotests/082.out | 16 ++++++++++++
|
||||
tests/qemu-iotests/106 | 7 +++--
|
||||
tests/qemu-iotests/175 | 6 ++---
|
||||
tests/qemu-iotests/243 | 6 ++---
|
||||
tests/qemu-iotests/common.filter | 1 +
|
||||
8 files changed, 80 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/block/file-posix.c b/block/file-posix.c
|
||||
index 2d834fbdf6..62a463229f 100644
|
||||
--- a/block/file-posix.c
|
||||
+++ b/block/file-posix.c
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "block/block_int.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/option.h"
|
||||
+#include "qemu/units.h"
|
||||
#include "trace.h"
|
||||
#include "block/thread-pool.h"
|
||||
#include "qemu/iov.h"
|
||||
@@ -2289,6 +2290,14 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
if (!file_opts->has_preallocation) {
|
||||
file_opts->preallocation = PREALLOC_MODE_OFF;
|
||||
}
|
||||
+ if (!file_opts->has_extent_size_hint) {
|
||||
+ file_opts->extent_size_hint = 1 * MiB;
|
||||
+ }
|
||||
+ if (file_opts->extent_size_hint > UINT32_MAX) {
|
||||
+ result = -EINVAL;
|
||||
+ error_setg(errp, "Extent size hint is too large");
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
/* Create file */
|
||||
fd = qemu_open(file_opts->filename, O_RDWR | O_CREAT | O_BINARY, 0644);
|
||||
@@ -2346,6 +2355,27 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
+#ifdef FS_IOC_FSSETXATTR
|
||||
+ /*
|
||||
+ * Try to set the extent size hint. Failure is not fatal, and a warning is
|
||||
+ * only printed if the option was explicitly specified.
|
||||
+ */
|
||||
+ {
|
||||
+ struct fsxattr attr;
|
||||
+ result = ioctl(fd, FS_IOC_FSGETXATTR, &attr);
|
||||
+ if (result == 0) {
|
||||
+ attr.fsx_xflags |= FS_XFLAG_EXTSIZE;
|
||||
+ attr.fsx_extsize = file_opts->extent_size_hint;
|
||||
+ result = ioctl(fd, FS_IOC_FSSETXATTR, &attr);
|
||||
+ }
|
||||
+ if (result < 0 && file_opts->has_extent_size_hint &&
|
||||
+ file_opts->extent_size_hint)
|
||||
+ {
|
||||
+ warn_report("Failed to set extent size hint: %s",
|
||||
+ strerror(errno));
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
/* Resize and potentially preallocate the file to the desired
|
||||
* final size */
|
||||
@@ -2381,6 +2411,8 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
|
||||
{
|
||||
BlockdevCreateOptions options;
|
||||
int64_t total_size = 0;
|
||||
+ int64_t extent_size_hint = 0;
|
||||
+ bool has_extent_size_hint = false;
|
||||
bool nocow = false;
|
||||
PreallocMode prealloc;
|
||||
char *buf = NULL;
|
||||
@@ -2392,6 +2424,11 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
|
||||
/* Read out options */
|
||||
total_size = ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0),
|
||||
BDRV_SECTOR_SIZE);
|
||||
+ if (qemu_opt_get(opts, BLOCK_OPT_EXTENT_SIZE_HINT)) {
|
||||
+ has_extent_size_hint = true;
|
||||
+ extent_size_hint =
|
||||
+ qemu_opt_get_size_del(opts, BLOCK_OPT_EXTENT_SIZE_HINT, -1);
|
||||
+ }
|
||||
nocow = qemu_opt_get_bool(opts, BLOCK_OPT_NOCOW, false);
|
||||
buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
|
||||
prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
|
||||
@@ -2411,6 +2448,8 @@ static int coroutine_fn raw_co_create_opts(BlockDriver *drv,
|
||||
.preallocation = prealloc,
|
||||
.has_nocow = true,
|
||||
.nocow = nocow,
|
||||
+ .has_extent_size_hint = has_extent_size_hint,
|
||||
+ .extent_size_hint = extent_size_hint,
|
||||
},
|
||||
};
|
||||
return raw_co_create(&options, errp);
|
||||
@@ -2902,6 +2941,11 @@ static QemuOptsList raw_create_opts = {
|
||||
#endif
|
||||
", full)"
|
||||
},
|
||||
+ {
|
||||
+ .name = BLOCK_OPT_EXTENT_SIZE_HINT,
|
||||
+ .type = QEMU_OPT_SIZE,
|
||||
+ .help = "Extent size hint for the image file, 0 to disable"
|
||||
+ },
|
||||
{ /* end of list */ }
|
||||
}
|
||||
};
|
||||
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
||||
index 41f13ecbed..4b23da2eb0 100644
|
||||
--- a/include/block/block_int.h
|
||||
+++ b/include/block/block_int.h
|
||||
@@ -53,6 +53,7 @@
|
||||
#define BLOCK_OPT_ADAPTER_TYPE "adapter_type"
|
||||
#define BLOCK_OPT_REDUNDANCY "redundancy"
|
||||
#define BLOCK_OPT_NOCOW "nocow"
|
||||
+#define BLOCK_OPT_EXTENT_SIZE_HINT "extent_size_hint"
|
||||
#define BLOCK_OPT_OBJECT_SIZE "object_size"
|
||||
#define BLOCK_OPT_REFCOUNT_BITS "refcount_bits"
|
||||
#define BLOCK_OPT_DATA_FILE "data_file"
|
||||
diff --git a/qapi/block-core.json b/qapi/block-core.json
|
||||
index 289320902d..c7aa919fa3 100644
|
||||
--- a/qapi/block-core.json
|
||||
+++ b/qapi/block-core.json
|
||||
@@ -4272,14 +4272,17 @@
|
||||
# falloc (if defined CONFIG_POSIX_FALLOCATE),
|
||||
# full (if defined CONFIG_POSIX))
|
||||
# @nocow Turn off copy-on-write (valid only on btrfs; default: off)
|
||||
+# @extent-size-hint: Extent size hint to add to the image file; 0 for not
|
||||
+# adding an extent size hint (default: 1 MB, since 5.1)
|
||||
#
|
||||
# Since: 2.12
|
||||
##
|
||||
{ 'struct': 'BlockdevCreateOptionsFile',
|
||||
- 'data': { 'filename': 'str',
|
||||
- 'size': 'size',
|
||||
- '*preallocation': 'PreallocMode',
|
||||
- '*nocow': 'bool' } }
|
||||
+ 'data': { 'filename': 'str',
|
||||
+ 'size': 'size',
|
||||
+ '*preallocation': 'PreallocMode',
|
||||
+ '*nocow': 'bool',
|
||||
+ '*extent-size-hint': 'size'} }
|
||||
|
||||
##
|
||||
# @BlockdevCreateOptionsGluster:
|
||||
diff --git a/tests/qemu-iotests/082.out b/tests/qemu-iotests/082.out
|
||||
index 9d4ed4dc9d..7a87946fa2 100644
|
||||
--- a/tests/qemu-iotests/082.out
|
||||
+++ b/tests/qemu-iotests/082.out
|
||||
@@ -59,6 +59,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -82,6 +83,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -105,6 +107,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -128,6 +131,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -151,6 +155,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -174,6 +179,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -197,6 +203,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -220,6 +227,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -339,6 +347,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -362,6 +371,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -385,6 +395,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -408,6 +419,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -431,6 +443,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -454,6 +467,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -477,6 +491,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
@@ -500,6 +515,7 @@ Supported options:
|
||||
encrypt.ivgen-hash-alg=<str> - Name of IV generator hash algorithm
|
||||
encrypt.key-secret=<str> - ID of secret providing qcow AES key or LUKS passphrase
|
||||
encryption=<bool (on/off)> - Encrypt the image with format 'aes'. (Deprecated in favor of encrypt.format=aes)
|
||||
+ extent_size_hint=<size> - Extent size hint for the image file, 0 to disable
|
||||
lazy_refcounts=<bool (on/off)> - Postpone refcount updates
|
||||
nocow=<bool (on/off)> - Turn off copy-on-write (valid only on btrfs)
|
||||
preallocation=<str> - Preallocation mode (allowed values: off, metadata, falloc, full)
|
||||
diff --git a/tests/qemu-iotests/106 b/tests/qemu-iotests/106
|
||||
index ac47eaa0f5..ee6f51d08b 100755
|
||||
--- a/tests/qemu-iotests/106
|
||||
+++ b/tests/qemu-iotests/106
|
||||
@@ -51,7 +51,10 @@ for create_mode in off falloc full; do
|
||||
echo
|
||||
echo "--- create_mode=$create_mode growth_mode=$growth_mode ---"
|
||||
|
||||
- IMGOPTS="preallocation=$create_mode" _make_test_img ${CREATION_SIZE}K
|
||||
+ # Our calculation below assumes kilobytes as unit for the actual size.
|
||||
+ # Disable the extent size hint because it would give us a result in
|
||||
+ # megabytes.
|
||||
+ IMGOPTS="preallocation=$create_mode,extent_size_hint=0" _make_test_img ${CREATION_SIZE}K
|
||||
$QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
|
||||
|
||||
expected_size=0
|
||||
@@ -98,7 +101,7 @@ for growth_mode in falloc full; do
|
||||
# plain int. We should use the correct type for the result, and
|
||||
# this tests we do.
|
||||
|
||||
- _make_test_img 2G
|
||||
+ _make_test_img -o "extent_size_hint=0" 2G
|
||||
$QEMU_IMG resize -f "$IMGFMT" --preallocation=$growth_mode "$TEST_IMG" +${GROWTH_SIZE}K
|
||||
|
||||
actual_size=$($QEMU_IMG info -f "$IMGFMT" "$TEST_IMG" | grep 'disk size')
|
||||
diff --git a/tests/qemu-iotests/175 b/tests/qemu-iotests/175
|
||||
index 55db2803ed..8a8494aeb6 100755
|
||||
--- a/tests/qemu-iotests/175
|
||||
+++ b/tests/qemu-iotests/175
|
||||
@@ -89,20 +89,20 @@ min_blocks=$(stat -c '%b' "$TEST_DIR/empty")
|
||||
|
||||
echo
|
||||
echo "== creating image with default preallocation =="
|
||||
-_make_test_img $size | _filter_imgfmt
|
||||
+_make_test_img -o extent_size_hint=0 $size | _filter_imgfmt
|
||||
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
|
||||
+ IMGOPTS="preallocation=$mode,extent_size_hint=0" _make_test_img $size | _filter_imgfmt
|
||||
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
|
||||
+ _make_test_img -o extent_size_hint=0 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
|
||||
diff --git a/tests/qemu-iotests/243 b/tests/qemu-iotests/243
|
||||
index e563761307..104c7256c4 100755
|
||||
--- a/tests/qemu-iotests/243
|
||||
+++ b/tests/qemu-iotests/243
|
||||
@@ -47,7 +47,7 @@ for mode in off metadata falloc full; do
|
||||
echo "=== preallocation=$mode ==="
|
||||
echo
|
||||
|
||||
- IMGOPTS="preallocation=$mode" _make_test_img 64M
|
||||
+ IMGOPTS="preallocation=$mode,extent_size_hint=0" _make_test_img 64M
|
||||
|
||||
printf "File size: "
|
||||
du -b $TEST_IMG | cut -f1
|
||||
@@ -64,7 +64,7 @@ for mode in off metadata falloc full; do
|
||||
echo "=== External data file: preallocation=$mode ==="
|
||||
echo
|
||||
|
||||
- IMGOPTS="data_file=$TEST_IMG.data,preallocation=$mode" _make_test_img 64M
|
||||
+ IMGOPTS="data_file=$TEST_IMG.data,preallocation=$mode,extent_size_hint=0" _make_test_img 64M
|
||||
|
||||
echo -n "qcow2 file size: "
|
||||
du -b $TEST_IMG | cut -f1
|
||||
@@ -75,7 +75,7 @@ for mode in off metadata falloc full; do
|
||||
echo -n "qcow2 disk usage: "
|
||||
[ $(du -B1 $TEST_IMG | cut -f1) -lt 1048576 ] && echo "low" || echo "high"
|
||||
echo -n "data disk usage: "
|
||||
- [ $(du -B1 $TEST_IMG.data | cut -f1) -lt 1048576 ] && echo "low" || echo "high"
|
||||
+ [ $(du -B1 $TEST_IMG.data | cut -f1) -lt 2097152 ] && echo "low" || echo "high"
|
||||
|
||||
done
|
||||
|
||||
diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
|
||||
index c8e8663665..f29c1d3238 100644
|
||||
--- a/tests/qemu-iotests/common.filter
|
||||
+++ b/tests/qemu-iotests/common.filter
|
||||
@@ -146,6 +146,7 @@ _filter_img_create()
|
||||
-e "s# refcount_bits=[0-9]\\+##g" \
|
||||
-e "s# key-secret=[a-zA-Z0-9]\\+##g" \
|
||||
-e "s# iter-time=[0-9]\\+##g" \
|
||||
+ -e "s# extent_size_hint=[0-9]\\+##g" \
|
||||
-e "s# force_size=\\(on\\|off\\)##g"
|
||||
}
|
||||
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,50 @@
|
||||
From b46fdf56b1a7938468565838bdadf260870e4f9b Mon Sep 17 00:00:00 2001
|
||||
From: Laurent Vivier <lvivier@redhat.com>
|
||||
Date: Wed, 9 Jun 2021 10:05:00 -0400
|
||||
Subject: [PATCH 3/4] spapr: Remove stale comment about power-saving LPCR bits
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
||||
Message-id: <20210609100501.427096-2-lvivier@redhat.com>
|
||||
Patchwork-id: 101682
|
||||
O-Subject: [RHEL-8.5.0 qemu-kvm PATCH 1/2] spapr: Remove stale comment about power-saving LPCR bits
|
||||
Bugzilla: 1969768
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: David Gibson <dgibson@redhat.com>
|
||||
RH-Acked-by: Greg Kurz <gkurz@redhat.com>
|
||||
|
||||
From: Nicholas Piggin <npiggin@gmail.com>
|
||||
|
||||
Commit 47a9b551547 ("spapr: Clean up handling of LPCR power-saving exit
|
||||
bits") moved this logic but did not remove the comment from the
|
||||
previous location.
|
||||
|
||||
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
|
||||
Message-Id: <20210526091626.3388262-2-npiggin@gmail.com>
|
||||
Reviewed-by: Cédric Le Goater <clg@kaod.org>
|
||||
Reviewed-by: Greg Kurz <groug@kaod.org>
|
||||
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
(cherry picked from commit 7be3bf6c8429969f97728bb712d9a99997835607)
|
||||
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/ppc/spapr_rtas.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
|
||||
index 8d8d8cdfcb..295eac986e 100644
|
||||
--- a/hw/ppc/spapr_rtas.c
|
||||
+++ b/hw/ppc/spapr_rtas.c
|
||||
@@ -163,7 +163,6 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, SpaprMachineState *spapr,
|
||||
|
||||
env->msr = (1ULL << MSR_SF) | (1ULL << MSR_ME);
|
||||
|
||||
- /* Enable Power-saving mode Exit Cause exceptions for the new CPU */
|
||||
lpcr = env->spr[SPR_LPCR];
|
||||
if (!pcc->interrupts_big_endian(callcpu)) {
|
||||
lpcr |= LPCR_ILE;
|
||||
--
|
||||
2.27.0
|
||||
|
@ -0,0 +1,89 @@
|
||||
From 28794dca79a94d01c8732b84fe6ac6ba2986ce45 Mon Sep 17 00:00:00 2001
|
||||
From: Laurent Vivier <lvivier@redhat.com>
|
||||
Date: Wed, 9 Jun 2021 10:05:01 -0400
|
||||
Subject: [PATCH 4/4] spapr: Set LPCR to current AIL mode when starting a new
|
||||
CPU
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
||||
Message-id: <20210609100501.427096-3-lvivier@redhat.com>
|
||||
Patchwork-id: 101683
|
||||
O-Subject: [RHEL-8.5.0 qemu-kvm PATCH 2/2] spapr: Set LPCR to current AIL mode when starting a new CPU
|
||||
Bugzilla: 1969768
|
||||
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
|
||||
RH-Acked-by: David Gibson <dgibson@redhat.com>
|
||||
RH-Acked-by: Greg Kurz <gkurz@redhat.com>
|
||||
|
||||
From: Nicholas Piggin <npiggin@gmail.com>
|
||||
|
||||
TCG does not keep track of AIL mode in a central place, it's based on
|
||||
the current LPCR[AIL] bits. Synchronize the new CPU's LPCR to the
|
||||
current LPCR in rtas_start_cpu(), similarly to the way the ILE bit is
|
||||
synchronized.
|
||||
|
||||
Open-code the ILE setting as well now that the caller's LPCR is
|
||||
available directly, there is no need for the indirection.
|
||||
|
||||
Without this, under both TCG and KVM, adding a POWER8/9/10 class CPU
|
||||
with a new core ID after a modern Linux has booted results in the new
|
||||
CPU's LPCR missing the LPCR[AIL]=0b11 setting that the other CPUs have.
|
||||
This can cause crashes and unexpected behaviour.
|
||||
|
||||
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
|
||||
Message-Id: <20210526091626.3388262-3-npiggin@gmail.com>
|
||||
Reviewed-by: Cédric Le Goater <clg@kaod.org>
|
||||
Reviewed-by: Greg Kurz <groug@kaod.org>
|
||||
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
|
||||
(cherry picked from commit ac559ecbea2649819e7b3fdd09f4e0243e0128db)
|
||||
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
||||
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||||
---
|
||||
hw/ppc/spapr_rtas.c | 14 +++++++++-----
|
||||
1 file changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
|
||||
index 295eac986e..5acb7c1f10 100644
|
||||
--- a/hw/ppc/spapr_rtas.c
|
||||
+++ b/hw/ppc/spapr_rtas.c
|
||||
@@ -132,8 +132,8 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, SpaprMachineState *spapr,
|
||||
target_ulong id, start, r3;
|
||||
PowerPCCPU *newcpu;
|
||||
CPUPPCState *env;
|
||||
- PowerPCCPUClass *pcc;
|
||||
target_ulong lpcr;
|
||||
+ target_ulong caller_lpcr;
|
||||
|
||||
if (nargs != 3 || nret != 1) {
|
||||
rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
|
||||
@@ -152,7 +152,6 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, SpaprMachineState *spapr,
|
||||
}
|
||||
|
||||
env = &newcpu->env;
|
||||
- pcc = POWERPC_CPU_GET_CLASS(newcpu);
|
||||
|
||||
if (!CPU(newcpu)->halted) {
|
||||
rtas_st(rets, 0, RTAS_OUT_HW_ERROR);
|
||||
@@ -163,10 +162,15 @@ static void rtas_start_cpu(PowerPCCPU *callcpu, SpaprMachineState *spapr,
|
||||
|
||||
env->msr = (1ULL << MSR_SF) | (1ULL << MSR_ME);
|
||||
|
||||
+ caller_lpcr = callcpu->env.spr[SPR_LPCR];
|
||||
lpcr = env->spr[SPR_LPCR];
|
||||
- if (!pcc->interrupts_big_endian(callcpu)) {
|
||||
- lpcr |= LPCR_ILE;
|
||||
- }
|
||||
+
|
||||
+ /* Set ILE the same way */
|
||||
+ lpcr = (lpcr & ~LPCR_ILE) | (caller_lpcr & LPCR_ILE);
|
||||
+
|
||||
+ /* Set AIL the same way */
|
||||
+ lpcr = (lpcr & ~LPCR_AIL) | (caller_lpcr & LPCR_AIL);
|
||||
+
|
||||
if (env->mmu_model == POWERPC_MMU_3_00) {
|
||||
/*
|
||||
* New cpus are expected to start in the same radix/hash mode
|
||||
--
|
||||
2.27.0
|
||||
|
@ -67,7 +67,7 @@ Obsoletes: %1-rhev
|
||||
Summary: QEMU is a machine emulator and virtualizer
|
||||
Name: qemu-kvm
|
||||
Version: 4.2.0
|
||||
Release: 51%{?dist}
|
||||
Release: 52%{?dist}
|
||||
# Epoch because we pushed a qemu-1.0 package. AIUI this can't ever be dropped
|
||||
Epoch: 15
|
||||
License: GPLv2 and GPLv2+ and CC-BY
|
||||
@ -1164,6 +1164,14 @@ Patch506: kvm-pc-bios-s390-ccw-fix-off-by-one-error.patch
|
||||
Patch507: kvm-pc-bios-s390-ccw-break-loop-if-a-null-block-number-i.patch
|
||||
# For bz#1942880 - RHEL8.4 Nightly[0322] - KVM guest fails to find zipl boot menu index (qemu-kvm)
|
||||
Patch508: kvm-pc-bios-s390-ccw-don-t-try-to-read-the-next-block-if.patch
|
||||
# For bz#1877163 - [FJ 8.3 Bug] The progress bar of the "virt-clone --nonsparse" command shows the progress rate exceeding 100%.
|
||||
Patch509: kvm-file-posix-Mitigate-file-fragmentation-with-extent-s.patch
|
||||
# For bz#1944861 - Qemu-img convert fails when source image is on gpfs
|
||||
Patch510: kvm-block-file-posix-Fix-problem-with-fallocate-PUNCH_HO.patch
|
||||
# For bz#1969768 - [ppc64le] Hotplug vcpu device hit call trace:[qemu output] KVM: unknown exit, hardware reason 7fff9ce87ed8
|
||||
Patch511: kvm-spapr-Remove-stale-comment-about-power-saving-LPCR-b.patch
|
||||
# For bz#1969768 - [ppc64le] Hotplug vcpu device hit call trace:[qemu output] KVM: unknown exit, hardware reason 7fff9ce87ed8
|
||||
Patch512: kvm-spapr-Set-LPCR-to-current-AIL-mode-when-starting-a-n.patch
|
||||
|
||||
BuildRequires: wget
|
||||
BuildRequires: rpm-build
|
||||
@ -2112,6 +2120,18 @@ useradd -r -u 107 -g qemu -G kvm -d / -s /sbin/nologin \
|
||||
|
||||
|
||||
%changelog
|
||||
* Fri Jun 11 2021 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 4.2.0-52.el8
|
||||
- kvm-file-posix-Mitigate-file-fragmentation-with-extent-s.patch [bz#1877163]
|
||||
- kvm-block-file-posix-Fix-problem-with-fallocate-PUNCH_HO.patch [bz#1944861]
|
||||
- kvm-spapr-Remove-stale-comment-about-power-saving-LPCR-b.patch [bz#1969768]
|
||||
- kvm-spapr-Set-LPCR-to-current-AIL-mode-when-starting-a-n.patch [bz#1969768]
|
||||
- Resolves: bz#1877163
|
||||
([FJ 8.3 Bug] The progress bar of the "virt-clone --nonsparse" command shows the progress rate exceeding 100%.)
|
||||
- Resolves: bz#1944861
|
||||
(Qemu-img convert fails when source image is on gpfs)
|
||||
- Resolves: bz#1969768
|
||||
([ppc64le] Hotplug vcpu device hit call trace:[qemu output] KVM: unknown exit, hardware reason 7fff9ce87ed8)
|
||||
|
||||
* Tue May 25 2021 Danilo Cesar Lemes de Paula <ddepaula@redhat.com> - 4.2.0-51.el8
|
||||
- kvm-linux-headers-Add-VFIO_CCW_REQ_IRQ_INDEX.patch [bz#1940450]
|
||||
- kvm-vfio-ccw-Connect-the-device-request-notifier.patch [bz#1940450]
|
||||
|
Loading…
Reference in New Issue
Block a user