Some more data for Qcow2, Qcow2 format is not impacted by the issue because it does not do SEEK_DATA/HOLE at all, because as you said it knows from its own metadata. But qcow2 instances with a RAW backing file does.. So qcow2 instances laverage also benefit of the patch, if they have big RAW backing file (or smaller but fragmented). Openstack default is RAW backing file for qcow2 instance images_type. I made others test on local mirror: *57 GiB disk in on ssd, mirror file is on a nvme device *the disk is on fragmented file (Average size per extent 2125 KB, nb_extent: 28495, ext4) *both qcow2 and raw test are run on the same fragmented file, only content change(format/data). RESULTS master____ RAW_________ 203s 291MB/s qemu freeze master-fix RAW_________ 113s 523MB/s qemu stable (+56% perf) master____ QCOW2_______ 115s 505MB/s qemu stable master-fix QCOW2_______ 116s 505MB/s qemu stable master____ QCOW2-SML_BF 113s 523MB/s qemu stable (1) master-fix QCOW2-SML_BF 113s 523MB/s qemu stable (1) master____ QCOW2-BIG_BF 201s 294MB/s qemu freeze (2) master-fix QCOW2-BIG_BF 112s 523MB/s qemu stable (2) (+56% perf) (1) qcow2 disk with small RAW backing file (1.5GB) big part of data are in qcow2 format (2) qcow2 disk with all data in RAW backing file (57GiB) Here are some stap metrics during test: (see script at the end) find_allocation: total count of qemu find_allocation calls iomap_seek_hole: count SEEK_HOLE (fs/iomap.c) iomap_apply: count file extent iomap (fs/iomap.c) iomap_seek_hole loop iomap_apply calls on all file extent until it finds a hole or EOF, it can be 1 up to 28495 in worst case in the test file. master____ RAW_________ 203s 291MB/s qemu freeze find_allocation: 59139 iomap_seek_hole: 59139 (each find_allocation call SEEK_HOLE) iomap_apply: 843330989 (this breaks qemu) master-fix RAW_________ 113s 523MB/s qemu stable (+56% perf) find_allocation: 59167 iomap_seek_hole: 4 (hole cache hit 99.993%) iomap_apply: 113286 (avg iomap_apply call per SEEK_HOLE: 28321) master____ QCOW2_______ 115s 505MB/s qemu stable find_allocation: 0 iomap_seek_hole: 0 iomap_apply: 0 master-fix QCOW2_______ 116s 505MB/s qemu stable find_allocation: 0 iomap_seek_hole: 0 iomap_apply: 0 master____ QCOW2-SML_BF 113s 523MB/s qemu stable (1) find_allocation: 1418 iomap_seek_hole: 1297 iomap_apply: 7297 master-fix QCOW2-SML_BF 113s 523MB/s qemu stable (1) find_allocation: 1418 iomap_seek_hole: 145 (hole cache hit 0.898%) iomap_apply: 794 master____ QCOW2-BIG_BF 201s 294MB/s qemu freeze (2) find_allocation: 59133 iomap_seek_hole: 59133 iomap_apply: 843172534 master-fix QCOW2-BIG_BF 112s 523MB/s qemu stable (2) (+56% perf) find_allocation: 59130 iomap_seek_hole: 1 (hole cache hit 0.999%) iomap_apply: 28494 ################# seek_hole.stp ############################### global iomap_apply, iomap_seek_hole, find_allocation probe kernel.function("iomap_seek_hole").call { if (pid() == target()) { iomap_seek_hole ++ } } probe kernel.function("iomap_apply").call { if (pid() == target()) { iomap_apply ++ } } probe process("/usr/bin/qemu-system-x86_64").function("find_allocation").call { if (pid() == target()) { find_allocation ++ } } probe end { printf ("find_allocation: %d\niomap_seek_hole: %d\niomap_apply: %d\n",find_allocation, iomap_seek_hole, iomap_apply) }