From 65b4a5c5518f249cc7dc03182d90b268cfc49b15 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Sat, 2 May 2026 04:52:57 +1000 Subject: [PATCH] Linux 7.1: access dentry d_alias directly The d_u union introduced in 3.18 is now anonymous, so we need to detect it and decide the right way to name d_alias. Note that we used to have support for both names to support kernels before 3.18, so this commit is effectively reverting the commit that removed that support, efc293e371. Sponsored-by: TrueNAS Reviewed-by: Tony Hutter Reviewed-by: Brian Behlendorf Signed-off-by: Rob Norris Closes #18471 --- config/kernel-dentry-alias.m4 | 32 +++++++++++++++++++ config/kernel.m4 | 2 ++ include/os/linux/kernel/linux/dcache_compat.h | 2 ++ 3 files changed, 36 insertions(+) create mode 100644 config/kernel-dentry-alias.m4 diff --git a/config/kernel-dentry-alias.m4 b/config/kernel-dentry-alias.m4 new file mode 100644 index 000000000..0baf1a06d --- /dev/null +++ b/config/kernel-dentry-alias.m4 @@ -0,0 +1,32 @@ +dnl # SPDX-License-Identifier: CDDL-1.0 +dnl # +dnl # 7.1 API change +dnl # d_u union in struct dentry is now anonmymous, so d_alias must be +dnl # named directly +dnl # +AC_DEFUN([ZFS_AC_KERNEL_SRC_DENTRY_ALIAS_D_U], [ + ZFS_LINUX_TEST_SRC([dentry_alias_d_u], [ + #include + #include + #include + ], [ + struct inode *inode __attribute__ ((unused)) = NULL; + struct dentry *dentry __attribute__ ((unused)) = NULL; + hlist_for_each_entry(dentry, &inode->i_dentry, + d_u.d_alias) { + d_drop(dentry); + } + ]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_DENTRY_ALIAS_D_U], [ + AC_MSG_CHECKING([whether dentry aliases are in d_u member]) + ZFS_LINUX_TEST_RESULT([dentry_alias_d_u], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_DENTRY_D_U_ALIASES, 1, + [dentry aliases are in d_u member]) + ],[ + AC_MSG_RESULT(no) + ]) +]) + diff --git a/config/kernel.m4 b/config/kernel.m4 index fd36ae42d..05f59745d 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -73,6 +73,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ ZFS_AC_KERNEL_SRC_SETATTR_PREPARE ZFS_AC_KERNEL_SRC_INSERT_INODE_LOCKED ZFS_AC_KERNEL_SRC_DENTRY + ZFS_AC_KERNEL_SRC_DENTRY_ALIAS_D_U ZFS_AC_KERNEL_SRC_TRUNCATE_SETSIZE ZFS_AC_KERNEL_SRC_SECURITY_INODE ZFS_AC_KERNEL_SRC_FS_CONTEXT @@ -196,6 +197,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ ZFS_AC_KERNEL_SETATTR_PREPARE ZFS_AC_KERNEL_INSERT_INODE_LOCKED ZFS_AC_KERNEL_DENTRY + ZFS_AC_KERNEL_DENTRY_ALIAS_D_U ZFS_AC_KERNEL_TRUNCATE_SETSIZE ZFS_AC_KERNEL_SECURITY_INODE ZFS_AC_KERNEL_FS_CONTEXT diff --git a/include/os/linux/kernel/linux/dcache_compat.h b/include/os/linux/kernel/linux/dcache_compat.h index f94dcda61..e27158926 100644 --- a/include/os/linux/kernel/linux/dcache_compat.h +++ b/include/os/linux/kernel/linux/dcache_compat.h @@ -32,7 +32,9 @@ #define dname(dentry) ((char *)((dentry)->d_name.name)) #define dlen(dentry) ((int)((dentry)->d_name.len)) +#ifdef HAVE_DENTRY_D_U_ALIASES #define d_alias d_u.d_alias +#endif #ifdef HAVE_MM_PAGE_FLAGS_STRUCT /*