cherry-pick fixes for Linux 6.14 compat

The 6.13 kernel is supported without any additional changes required
and 6.14 needs only two smaller ones, so backport them to 2.2.7 to be
able to provide a more recent opt-in kernel soonish.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2025-03-26 17:51:00 +01:00
parent 3db234ab64
commit 7cbbd2bfe5
3 changed files with 149 additions and 0 deletions

View File

@ -0,0 +1,103 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Rob Norris <robn@despairlabs.com>
Date: Wed, 5 Feb 2025 17:14:20 +1100
Subject: [PATCH] Linux 6.14: dops->d_revalidate now takes four args
This is a convenience for filesystems that need the inode of their
parent or their own name, as its often complicated to get that
information. We don't need those things, so this is just detecting which
prototype is expected and adjusting our callback to match.
Sponsored-by: https://despairlabs.com/sponsor/
Signed-off-by: Rob Norris <robn@despairlabs.com>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
(cherry picked from commit 7ef6b70e960a7cc504242952699057f0ee616449)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
---
config/kernel-automount.m4 | 41 ++++++++++++++++++++++++++++++--
module/os/linux/zfs/zpl_ctldir.c | 6 +++++
2 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/config/kernel-automount.m4 b/config/kernel-automount.m4
index 52f1931b7..b5f1392d0 100644
--- a/config/kernel-automount.m4
+++ b/config/kernel-automount.m4
@@ -5,7 +5,7 @@ dnl # solution to handling automounts. Prior to this cifs/nfs clients
dnl # which required automount support would abuse the follow_link()
dnl # operation on directories for this purpose.
dnl #
-AC_DEFUN([ZFS_AC_KERNEL_SRC_AUTOMOUNT], [
+AC_DEFUN([ZFS_AC_KERNEL_SRC_D_AUTOMOUNT], [
ZFS_LINUX_TEST_SRC([dentry_operations_d_automount], [
#include <linux/dcache.h>
static struct vfsmount *d_automount(struct path *p) { return NULL; }
@@ -15,7 +15,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_AUTOMOUNT], [
])
])
-AC_DEFUN([ZFS_AC_KERNEL_AUTOMOUNT], [
+AC_DEFUN([ZFS_AC_KERNEL_D_AUTOMOUNT], [
AC_MSG_CHECKING([whether dops->d_automount() exists])
ZFS_LINUX_TEST_RESULT([dentry_operations_d_automount], [
AC_MSG_RESULT(yes)
@@ -23,3 +23,40 @@ AC_DEFUN([ZFS_AC_KERNEL_AUTOMOUNT], [
ZFS_LINUX_TEST_ERROR([dops->d_automount()])
])
])
+
+dnl #
+dnl # 6.14 API change
+dnl # dops->d_revalidate now has four args.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_SRC_D_REVALIDATE_4ARGS], [
+ ZFS_LINUX_TEST_SRC([dentry_operations_d_revalidate_4args], [
+ #include <linux/dcache.h>
+ static int d_revalidate(struct inode *dir,
+ const struct qstr *name, struct dentry *dentry,
+ unsigned int fl) { return 0; }
+ struct dentry_operations dops __attribute__ ((unused)) = {
+ .d_revalidate = d_revalidate,
+ };
+ ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_D_REVALIDATE_4ARGS], [
+ AC_MSG_CHECKING([whether dops->d_revalidate() takes 4 args])
+ ZFS_LINUX_TEST_RESULT([dentry_operations_d_revalidate_4args], [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_D_REVALIDATE_4ARGS, 1,
+ [dops->d_revalidate() takes 4 args])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_SRC_AUTOMOUNT], [
+ ZFS_AC_KERNEL_SRC_D_AUTOMOUNT
+ ZFS_AC_KERNEL_SRC_D_REVALIDATE_4ARGS
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_AUTOMOUNT], [
+ ZFS_AC_KERNEL_D_AUTOMOUNT
+ ZFS_AC_KERNEL_D_REVALIDATE_4ARGS
+])
diff --git a/module/os/linux/zfs/zpl_ctldir.c b/module/os/linux/zfs/zpl_ctldir.c
index 56a30be51..d6a755af6 100644
--- a/module/os/linux/zfs/zpl_ctldir.c
+++ b/module/os/linux/zfs/zpl_ctldir.c
@@ -185,8 +185,14 @@ zpl_snapdir_automount(struct path *path)
* as of the 3.18 kernel revaliding the mountpoint dentry will result in
* the snapshot being immediately unmounted.
*/
+#ifdef HAVE_D_REVALIDATE_4ARGS
+static int
+zpl_snapdir_revalidate(struct inode *dir, const struct qstr *name,
+ struct dentry *dentry, unsigned int flags)
+#else
static int
zpl_snapdir_revalidate(struct dentry *dentry, unsigned int flags)
+#endif
{
return (!!dentry->d_inode);
}

View File

@ -0,0 +1,44 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Rob Norris <robn@despairlabs.com>
Date: Wed, 5 Feb 2025 17:52:45 +1100
Subject: [PATCH] Linux 6.14: BLK_MQ_F_SHOULD_MERGE was removed
According to the upstream change, all callers set it, and all block
devices either honoured it or ignored it, so removing it entirely allows
a bunch of handling for the "unset" case to be removed, and it becomes
effectively implied.
We follow suit, and keep setting it for older kernels.
Sponsored-by: https://despairlabs.com/sponsor/
Signed-off-by: Rob Norris <robn@despairlabs.com>
Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
(cherry picked from commit 2ca91ba3cf209c6f1db42247ff2ca3f9ce4f2d4d)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
---
module/os/linux/zfs/zvol_os.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/module/os/linux/zfs/zvol_os.c b/module/os/linux/zfs/zvol_os.c
index 01f812b8e..4c61ae232 100644
--- a/module/os/linux/zfs/zvol_os.c
+++ b/module/os/linux/zfs/zvol_os.c
@@ -202,7 +202,16 @@ static int zvol_blk_mq_alloc_tag_set(zvol_state_t *zv)
* We need BLK_MQ_F_BLOCKING here since we do blocking calls in
* zvol_request_impl()
*/
- zso->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING;
+ zso->tag_set.flags = BLK_MQ_F_BLOCKING;
+
+#ifdef BLK_MQ_F_SHOULD_MERGE
+ /*
+ * Linux 6.14 removed BLK_MQ_F_SHOULD_MERGE and made it implicit.
+ * For older kernels, we set it.
+ */
+ zso->tag_set.flags |= BLK_MQ_F_SHOULD_MERGE;
+#endif
+
zso->tag_set.driver_data = zv;
return (blk_mq_alloc_tag_set(&zso->tag_set));

View File

@ -11,3 +11,5 @@
0011-zpool-status-tighten-bounds-for-noalloc-stat-availab.patch
0012-linux-zvols-correctly-detect-flush-requests.patch
0013-contrib-initramfs-use-LVM-autoactivation-for-activat.patch
0014-Linux-6.14-dops-d_revalidate-now-takes-four-args.patch
0015-Linux-6.14-BLK_MQ_F_SHOULD_MERGE-was-removed.patch