diff --git a/config/kernel-dentry-operations.m4 b/config/kernel-dentry-operations.m4 index 957ebc9f0581..a364211677cb 100644 --- a/config/kernel-dentry-operations.m4 +++ b/config/kernel-dentry-operations.m4 @@ -1,160 +1,135 @@ -dnl # -dnl # 3.4.0 API change -dnl # Added d_make_root() to replace previous d_alloc_root() function. -dnl # -AC_DEFUN([ZFS_AC_KERNEL_SRC_D_MAKE_ROOT], [ - ZFS_LINUX_TEST_SRC([d_make_root], [ - #include - ], [ - d_make_root(NULL); - ]) -]) - -AC_DEFUN([ZFS_AC_KERNEL_D_MAKE_ROOT], [ - AC_MSG_CHECKING([whether d_make_root() is available]) - ZFS_LINUX_TEST_RESULT_SYMBOL([d_make_root], - [d_make_root], [fs/dcache.c], [ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_D_MAKE_ROOT, 1, [d_make_root() is available]) - ], [ - AC_MSG_RESULT(no) - ]) -]) - dnl # dnl # 2.6.28 API change dnl # Added d_obtain_alias() helper function. dnl # AC_DEFUN([ZFS_AC_KERNEL_SRC_D_OBTAIN_ALIAS], [ ZFS_LINUX_TEST_SRC([d_obtain_alias], [ #include ], [ d_obtain_alias(NULL); ]) ]) AC_DEFUN([ZFS_AC_KERNEL_D_OBTAIN_ALIAS], [ AC_MSG_CHECKING([whether d_obtain_alias() is available]) ZFS_LINUX_TEST_RESULT_SYMBOL([d_obtain_alias], [d_obtain_alias], [fs/dcache.c], [ AC_MSG_RESULT(yes) ], [ ZFS_LINUX_TEST_ERROR([d_obtain_alias()]) ]) ]) dnl # dnl # 2.6.12 API change dnl # d_prune_aliases() helper function available. dnl # AC_DEFUN([ZFS_AC_KERNEL_SRC_D_PRUNE_ALIASES], [ ZFS_LINUX_TEST_SRC([d_prune_aliases], [ #include ], [ struct inode *ip = NULL; d_prune_aliases(ip); ]) ]) AC_DEFUN([ZFS_AC_KERNEL_D_PRUNE_ALIASES], [ AC_MSG_CHECKING([whether d_prune_aliases() is available]) ZFS_LINUX_TEST_RESULT_SYMBOL([d_prune_aliases], [d_prune_aliases], [fs/dcache.c], [ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_D_PRUNE_ALIASES, 1, [d_prune_aliases() is available]) ], [ ZFS_LINUX_TEST_ERROR([d_prune_aliases()]) ]) ]) dnl # dnl # 2.6.38 API change dnl # Added d_set_d_op() helper function. dnl # AC_DEFUN([ZFS_AC_KERNEL_SRC_D_SET_D_OP], [ ZFS_LINUX_TEST_SRC([d_set_d_op], [ #include ], [ d_set_d_op(NULL, NULL); ]) ]) AC_DEFUN([ZFS_AC_KERNEL_D_SET_D_OP], [ AC_MSG_CHECKING([whether d_set_d_op() is available]) ZFS_LINUX_TEST_RESULT_SYMBOL([d_set_d_op], [d_set_d_op], [fs/dcache.c], [ AC_MSG_RESULT(yes) ], [ ZFS_LINUX_TEST_ERROR([d_set_d_op]) ]) ]) dnl # dnl # 3.6 API change dnl # AC_DEFUN([ZFS_AC_KERNEL_SRC_D_REVALIDATE_NAMEIDATA], [ ZFS_LINUX_TEST_SRC([dentry_operations_revalidate], [ #include #include static int revalidate (struct dentry *dentry, struct nameidata *nidata) { return 0; } static const struct dentry_operations dops __attribute__ ((unused)) = { .d_revalidate = revalidate, }; ],[]) ]) AC_DEFUN([ZFS_AC_KERNEL_D_REVALIDATE_NAMEIDATA], [ AC_MSG_CHECKING([whether dops->d_revalidate() takes struct nameidata]) ZFS_LINUX_TEST_RESULT([dentry_operations_revalidate], [ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_D_REVALIDATE_NAMEIDATA, 1, [dops->d_revalidate() operation takes nameidata]) ],[ AC_MSG_RESULT(no) ]) ]) dnl # dnl # 2.6.38 API change dnl # Added sb->s_d_op default dentry_operations member dnl # AC_DEFUN([ZFS_AC_KERNEL_SRC_S_D_OP], [ ZFS_LINUX_TEST_SRC([super_block_s_d_op], [ #include ],[ struct super_block sb __attribute__ ((unused)); sb.s_d_op = NULL; ]) ]) AC_DEFUN([ZFS_AC_KERNEL_S_D_OP], [ AC_MSG_CHECKING([whether super_block has s_d_op]) ZFS_LINUX_TEST_RESULT([super_block_s_d_op], [ AC_MSG_RESULT(yes) ], [ ZFS_LINUX_TEST_ERROR([super_block s_d_op]) ]) ]) AC_DEFUN([ZFS_AC_KERNEL_SRC_DENTRY], [ - ZFS_AC_KERNEL_SRC_D_MAKE_ROOT ZFS_AC_KERNEL_SRC_D_OBTAIN_ALIAS ZFS_AC_KERNEL_SRC_D_PRUNE_ALIASES ZFS_AC_KERNEL_SRC_D_SET_D_OP ZFS_AC_KERNEL_SRC_D_REVALIDATE_NAMEIDATA ZFS_AC_KERNEL_SRC_S_D_OP ]) AC_DEFUN([ZFS_AC_KERNEL_DENTRY], [ - ZFS_AC_KERNEL_D_MAKE_ROOT ZFS_AC_KERNEL_D_OBTAIN_ALIAS ZFS_AC_KERNEL_D_PRUNE_ALIASES ZFS_AC_KERNEL_D_SET_D_OP ZFS_AC_KERNEL_D_REVALIDATE_NAMEIDATA ZFS_AC_KERNEL_S_D_OP ]) diff --git a/include/os/linux/kernel/linux/dcache_compat.h b/include/os/linux/kernel/linux/dcache_compat.h index 4d92e4dbde57..de533a5fd28b 100644 --- a/include/os/linux/kernel/linux/dcache_compat.h +++ b/include/os/linux/kernel/linux/dcache_compat.h @@ -1,109 +1,105 @@ /* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or https://opensource.org/licenses/CDDL-1.0. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (C) 2011 Lawrence Livermore National Security, LLC. */ #ifndef _ZFS_DCACHE_H #define _ZFS_DCACHE_H #include #define dname(dentry) ((char *)((dentry)->d_name.name)) #define dlen(dentry) ((int)((dentry)->d_name.len)) -#ifndef HAVE_D_MAKE_ROOT -#define d_make_root(inode) d_alloc_root(inode) -#endif /* HAVE_D_MAKE_ROOT */ - #define d_alias d_u.d_alias /* * Starting from Linux 5.13, flush_dcache_page() becomes an inline function * and under some configurations, may indirectly referencing GPL-only * symbols, e.g., cpu_feature_keys on powerpc and PageHuge on riscv. * Override this function when it is detected being GPL-only. */ #if defined __powerpc__ && defined HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY #include #define flush_dcache_page(page) do { \ if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE) && \ test_bit(PG_dcache_clean, &(page)->flags)) \ clear_bit(PG_dcache_clean, &(page)->flags); \ } while (0) #endif /* * For riscv implementation, the use of PageHuge can be safely removed. * Because it handles pages allocated by HugeTLB, while flush_dcache_page * in zfs module is only called on kernel pages. */ #if defined __riscv && defined HAVE_FLUSH_DCACHE_PAGE_GPL_ONLY #define flush_dcache_page(page) do { \ if (test_bit(PG_dcache_clean, &(page)->flags)) \ clear_bit(PG_dcache_clean, &(page)->flags); \ } while (0) #endif /* * 2.6.30 API change, * The const keyword was added to the 'struct dentry_operations' in * the dentry structure. To handle this we define an appropriate * dentry_operations_t typedef which can be used. */ typedef const struct dentry_operations dentry_operations_t; /* * 2.6.38 API addition, * Added d_clear_d_op() helper function which clears some flags and the * registered dentry->d_op table. This is required because d_set_d_op() * issues a warning when the dentry operations table is already set. * For the .zfs control directory to work properly we must be able to * override the default operations table and register custom .d_automount * and .d_revalidate callbacks. */ static inline void d_clear_d_op(struct dentry *dentry) { dentry->d_op = NULL; dentry->d_flags &= ~( DCACHE_OP_HASH | DCACHE_OP_COMPARE | DCACHE_OP_REVALIDATE | DCACHE_OP_DELETE); } /* * Walk and invalidate all dentry aliases of an inode * unless it's a mountpoint */ static inline void zpl_d_drop_aliases(struct inode *inode) { struct dentry *dentry; spin_lock(&inode->i_lock); hlist_for_each_entry(dentry, &inode->i_dentry, d_alias) { if (!IS_ROOT(dentry) && !d_mountpoint(dentry) && (dentry->d_inode == inode)) { d_drop(dentry); } } spin_unlock(&inode->i_lock); } #endif /* _ZFS_DCACHE_H */