diff --git a/SOURCES/kvm-block-file-posix-Fix-problem-with-fallocate-PUNCH_HO.patch b/SOURCES/kvm-block-file-posix-Fix-problem-with-fallocate-PUNCH_HO.patch
new file mode 100644
index 0000000..60b1b0a
--- /dev/null
+++ b/SOURCES/kvm-block-file-posix-Fix-problem-with-fallocate-PUNCH_HO.patch
@@ -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
+
diff --git a/SOURCES/kvm-file-posix-Mitigate-file-fragmentation-with-extent-s.patch b/SOURCES/kvm-file-posix-Mitigate-file-fragmentation-with-extent-s.patch
new file mode 100644
index 0000000..e8639f3
--- /dev/null
+++ b/SOURCES/kvm-file-posix-Mitigate-file-fragmentation-with-extent-s.patch
@@ -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
+
diff --git a/SOURCES/kvm-spapr-Remove-stale-comment-about-power-saving-LPCR-b.patch b/SOURCES/kvm-spapr-Remove-stale-comment-about-power-saving-LPCR-b.patch
new file mode 100644
index 0000000..4f15509
--- /dev/null
+++ b/SOURCES/kvm-spapr-Remove-stale-comment-about-power-saving-LPCR-b.patch
@@ -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
+
diff --git a/SOURCES/kvm-spapr-Set-LPCR-to-current-AIL-mode-when-starting-a-n.patch b/SOURCES/kvm-spapr-Set-LPCR-to-current-AIL-mode-when-starting-a-n.patch
new file mode 100644
index 0000000..84abc74
--- /dev/null
+++ b/SOURCES/kvm-spapr-Set-LPCR-to-current-AIL-mode-when-starting-a-n.patch
@@ -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
+
diff --git a/SPECS/qemu-kvm.spec b/SPECS/qemu-kvm.spec
index aaa4f65..be2291d 100644
--- a/SPECS/qemu-kvm.spec
+++ b/SPECS/qemu-kvm.spec
@@ -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]