From c9845a13323f8d1cb03d9940e9d72f21abe039d5 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Thu, 11 Dec 2025 05:04:57 +1100 Subject: [PATCH] Linux: work around use of GPL-only symbol `kasan_flag_enabled` We may not be able to avoid our code referencing the symbol, but we can ensure that a symbol of that name is available to the linker during build, and so not require linking the GPL-exported version. Sponsored-by: https://despairlabs.com/sponsor/ Reviewed-by: Brian Behlendorf Signed-off-by: Rob Norris Closes #18009 Closes #18040 --- config/kernel-kasan-enabled.m4 | 23 ++++++++++++++ config/kernel.m4 | 2 ++ module/Kbuild.in | 1 + module/os/linux/zfs/kasan_compat.c | 48 ++++++++++++++++++++++++++++++ module/os/linux/zfs/zfs_vnops_os.c | 1 - 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 config/kernel-kasan-enabled.m4 create mode 100644 module/os/linux/zfs/kasan_compat.c diff --git a/config/kernel-kasan-enabled.m4 b/config/kernel-kasan-enabled.m4 new file mode 100644 index 000000000..71b241999 --- /dev/null +++ b/config/kernel-kasan-enabled.m4 @@ -0,0 +1,23 @@ +dnl # +dnl # 6.18: some architectures and config option causes the kasan_ inline +dnl # functions to reference the GPL-only symbol 'kasan_flag_enabled', +dnl # breaking the build. Detect this and work +dnl # around it. +AC_DEFUN([ZFS_AC_KERNEL_SRC_KASAN_ENABLED], [ + ZFS_LINUX_TEST_SRC([kasan_enabled], [ + #include + ], [ + kasan_enabled(); + ], [], [ZFS_META_LICENSE]) +]) +AC_DEFUN([ZFS_AC_KERNEL_KASAN_ENABLED], [ + AC_MSG_CHECKING([whether kasan_enabled() is GPL-only]) + ZFS_LINUX_TEST_RESULT([kasan_enabled_license], [ + AC_MSG_RESULT(no) + ], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_KASAN_ENABLED_GPL_ONLY, 1, + [kasan_enabled() is GPL-only]) + ]) +]) + diff --git a/config/kernel.m4 b/config/kernel.m4 index 40b7de739..f095c8f20 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -138,6 +138,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ ZFS_AC_KERNEL_SRC_SOPS_FREE_INODE ZFS_AC_KERNEL_SRC_NAMESPACE ZFS_AC_KERNEL_SRC_INODE_GENERIC_DROP + ZFS_AC_KERNEL_SRC_KASAN_ENABLED case "$host_cpu" in powerpc*) ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE @@ -260,6 +261,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ ZFS_AC_KERNEL_SOPS_FREE_INODE ZFS_AC_KERNEL_NAMESPACE ZFS_AC_KERNEL_INODE_GENERIC_DROP + ZFS_AC_KERNEL_KASAN_ENABLED case "$host_cpu" in powerpc*) ZFS_AC_KERNEL_CPU_HAS_FEATURE diff --git a/module/Kbuild.in b/module/Kbuild.in index e653908ef..fad4231ff 100644 --- a/module/Kbuild.in +++ b/module/Kbuild.in @@ -433,6 +433,7 @@ ZFS_OBJS := \ ZFS_OBJS_OS := \ abd_os.o \ arc_os.o \ + kasan_compat.o \ mmp_os.o \ policy.o \ qat.o \ diff --git a/module/os/linux/zfs/kasan_compat.c b/module/os/linux/zfs/kasan_compat.c new file mode 100644 index 000000000..d0faf5caf --- /dev/null +++ b/module/os/linux/zfs/kasan_compat.c @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: CDDL-1.0 +/* + * 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) 2025, Rob Norris + */ + +#ifndef _ZFS_LINUX_KASAN_ENABLED_H +#define _ZFS_LINUX_KASAN_ENABLED_H + +#ifdef HAVE_KASAN_ENABLED_GPL_ONLY +/* + * The kernel supports a runtime setting to enable/disable KASAN. The control + * flag kasan_flag_enabled is a GPL-only symbol, which prevents us from + * accessing it. Unfortunately, this is called by the header function + * kasan_enabled(), which in turn is used to call or skip instrumentation + * functions in various header-based kernel facilities. If we inadvertently + * call one, the build breaks. + * + * To work around this, we define our own `kasan_flag_enabled` set to "false", + * disabling use of KASAN inside our code. The linker will resolve this symbol + * at build time, and so never need to reach out to the off-limits kernel + * symbol. + */ +#include +struct static_key_false kasan_flag_enabled = STATIC_KEY_FALSE_INIT; +#endif + +#endif diff --git a/module/os/linux/zfs/zfs_vnops_os.c b/module/os/linux/zfs/zfs_vnops_os.c index 02465adf3..a788e3fd4 100644 --- a/module/os/linux/zfs/zfs_vnops_os.c +++ b/module/os/linux/zfs/zfs_vnops_os.c @@ -31,7 +31,6 @@ /* Portions Copyright 2007 Jeremy Teo */ /* Portions Copyright 2010 Robert Milkowski */ - #include #include #include