this broke with 2.2.7, and can potentially cause data loss or
inconsistency. the patch basically reverts to pre-2.2.7 behaviour,
verified via a fio benchmark.

reported on our forum: https://forum.proxmox.com/threads/163066

upstream PR: https://github.com/openzfs/zfs/pull/17131

Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com>
---
module only change, needs kernel bump to be active

 ...vols-correctly-detect-flush-requests.patch | 58 +++++++++++++++++++
 debian/patches/series                         |  1 +
 2 files changed, 59 insertions(+)
 create mode 100644 
debian/patches/0012-linux-zvols-correctly-detect-flush-requests.patch

diff --git 
a/debian/patches/0012-linux-zvols-correctly-detect-flush-requests.patch 
b/debian/patches/0012-linux-zvols-correctly-detect-flush-requests.patch
new file mode 100644
index 0000000..609934a
--- /dev/null
+++ b/debian/patches/0012-linux-zvols-correctly-detect-flush-requests.patch
@@ -0,0 +1,58 @@
+From c9ae14e064f961709557fdcbdb40e692a97225ec Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbich...@proxmox.com>
+Date: Mon, 10 Mar 2025 15:51:09 +0100
+Subject: [PATCH] linux: zvols: correctly detect flush requests
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+since 4.10, bio->bi_opf needs to be checked to determine all kinds of
+flush requests. this was the case prior to the commit referenced below,
+but the order of ifdefs was not the usual one (newest up top), which
+might have caused this to slip through.
+
+this fixes a regression when using zvols as Qemu block devices, but
+might have broken other use cases as well. the symptoms are that all
+sync writes from within a VM configured to use such a virtual block
+devices are ignored and treated as async writes by the host ZFS layer.
+
+this can be verified using fio in sync mode inside the VM, for example
+with
+
+ fio \
+ --filename=/dev/sda --ioengine=libaio --loops=1 --size=10G \
+ --time_based --runtime=60 --group_reporting --stonewall --name=cc1 \
+ --description="CC1" --rw=write --bs=4k --direct=1 --iodepth=1 \
+ --numjobs=1 --sync=1
+
+which shows an IOPS number way above what the physical device underneath
+supports, with "zpool iostat -r 1" on the hypervisor side showing no
+sync IO occuring during the benchmark.
+
+with the regression fixed, both fio inside the VM and the IO stats on
+the host show the expected numbers.
+
+Fixes: 846b5985192467acabf5484ae610b4b37b7f8162
+"config: remove HAVE_REQ_OP_* and HAVE_REQ_*"
+
+Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com>
+---
+ include/os/linux/kernel/linux/blkdev_compat.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/os/linux/kernel/linux/blkdev_compat.h 
b/include/os/linux/kernel/linux/blkdev_compat.h
+index d96708c60..084869c34 100644
+--- a/include/os/linux/kernel/linux/blkdev_compat.h
++++ b/include/os/linux/kernel/linux/blkdev_compat.h
+@@ -383,7 +383,7 @@ bio_set_flush(struct bio *bio)
+ static inline boolean_t
+ bio_is_flush(struct bio *bio)
+ {
+-      return (bio_op(bio) == REQ_OP_FLUSH);
++      return (bio_op(bio) == REQ_OP_FLUSH) || (op_is_flush(bio->bi_opf));
+ }
+ 
+ /*
+-- 
+2.39.5
+
diff --git a/debian/patches/series b/debian/patches/series
index 229027f..938488c 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -9,3 +9,4 @@
 0009-arc-stat-summary-guard-access-to-freshly-introduced-.patch
 0010-Fix-nfs_truncate_shares-without-etc-exports.d.patch
 0011-zpool-status-tighten-bounds-for-noalloc-stat-availab.patch
+0012-linux-zvols-correctly-detect-flush-requests.patch
-- 
2.39.5



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to