mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-01-15 01:32:04 +03:00
Linux 6.18: namespace type moved to ns_common
The namespace type has moved from the namespace ops struct to the "common" base namespace struct. Detect this and define a macro that does the right thing for both versions. Sponsored-by: https://despairlabs.com/sponsor/ Signed-off-by: Rob Norris <robn@despairlabs.com>
This commit is contained in:
parent
005c631499
commit
2778832e22
31
config/kernel-namespace.m4
Normal file
31
config/kernel-namespace.m4
Normal file
@ -0,0 +1,31 @@
|
||||
dnl #
|
||||
dnl # 6.18 API change
|
||||
dnl # ns->ops->type was moved to ns->ns.ns_type (struct ns_common)
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_NS_COMMON_TYPE], [
|
||||
ZFS_LINUX_TEST_SRC([ns_common_type], [
|
||||
#include <linux/user_namespace.h>
|
||||
],[
|
||||
struct user_namespace ns;
|
||||
ns.ns.ns_type = 0;
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_NS_COMMON_TYPE], [
|
||||
AC_MSG_CHECKING([whether ns_type is accessible through ns_common])
|
||||
ZFS_LINUX_TEST_RESULT([ns_common_type], [
|
||||
AC_MSG_RESULT(yes)
|
||||
AC_DEFINE([HAVE_NS_COMMON_TYPE], 1,
|
||||
[Define if ns_type is accessible through ns_common])
|
||||
],[
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_NAMESPACE], [
|
||||
ZFS_AC_KERNEL_SRC_NS_COMMON_TYPE
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_NAMESPACE], [
|
||||
ZFS_AC_KERNEL_NS_COMMON_TYPE
|
||||
])
|
||||
@ -1,79 +0,0 @@
|
||||
dnl #
|
||||
dnl # 2.6.38 API change
|
||||
dnl # ns_capable() was introduced
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_NS_CAPABLE], [
|
||||
ZFS_LINUX_TEST_SRC([ns_capable], [
|
||||
#include <linux/capability.h>
|
||||
],[
|
||||
ns_capable((struct user_namespace *)NULL, CAP_SYS_ADMIN);
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_NS_CAPABLE], [
|
||||
AC_MSG_CHECKING([whether ns_capable exists])
|
||||
ZFS_LINUX_TEST_RESULT([ns_capable], [
|
||||
AC_MSG_RESULT(yes)
|
||||
],[
|
||||
ZFS_LINUX_TEST_ERROR([ns_capable()])
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 2.6.39 API change
|
||||
dnl # struct user_namespace was added to struct cred_t as cred->user_ns member
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_CRED_USER_NS], [
|
||||
ZFS_LINUX_TEST_SRC([cred_user_ns], [
|
||||
#include <linux/cred.h>
|
||||
],[
|
||||
struct cred cr;
|
||||
cr.user_ns = (struct user_namespace *)NULL;
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_CRED_USER_NS], [
|
||||
AC_MSG_CHECKING([whether cred_t->user_ns exists])
|
||||
ZFS_LINUX_TEST_RESULT([cred_user_ns], [
|
||||
AC_MSG_RESULT(yes)
|
||||
],[
|
||||
ZFS_LINUX_TEST_ERROR([cred_t->user_ns()])
|
||||
])
|
||||
])
|
||||
|
||||
dnl #
|
||||
dnl # 3.4 API change
|
||||
dnl # kuid_has_mapping() and kgid_has_mapping() were added to distinguish
|
||||
dnl # between internal kernel uids/gids and user namespace uids/gids.
|
||||
dnl #
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_KUID_HAS_MAPPING], [
|
||||
ZFS_LINUX_TEST_SRC([kuid_has_mapping], [
|
||||
#include <linux/uidgid.h>
|
||||
],[
|
||||
kuid_has_mapping((struct user_namespace *)NULL, KUIDT_INIT(0));
|
||||
kgid_has_mapping((struct user_namespace *)NULL, KGIDT_INIT(0));
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_KUID_HAS_MAPPING], [
|
||||
AC_MSG_CHECKING([whether kuid_has_mapping/kgid_has_mapping exist])
|
||||
ZFS_LINUX_TEST_RESULT([kuid_has_mapping], [
|
||||
AC_MSG_RESULT(yes)
|
||||
],[
|
||||
ZFS_LINUX_TEST_ERROR([kuid_has_mapping()])
|
||||
])
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_SRC_USERNS_CAPABILITIES], [
|
||||
ZFS_AC_KERNEL_SRC_NS_CAPABLE
|
||||
ZFS_AC_KERNEL_SRC_HAS_CAPABILITY
|
||||
ZFS_AC_KERNEL_SRC_CRED_USER_NS
|
||||
ZFS_AC_KERNEL_SRC_KUID_HAS_MAPPING
|
||||
])
|
||||
|
||||
AC_DEFUN([ZFS_AC_KERNEL_USERNS_CAPABILITIES], [
|
||||
ZFS_AC_KERNEL_NS_CAPABLE
|
||||
ZFS_AC_KERNEL_HAS_CAPABILITY
|
||||
ZFS_AC_KERNEL_CRED_USER_NS
|
||||
ZFS_AC_KERNEL_KUID_HAS_MAPPING
|
||||
])
|
||||
@ -136,6 +136,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
|
||||
ZFS_AC_KERNEL_SRC_TIMER
|
||||
ZFS_AC_KERNEL_SRC_SUPER_BLOCK_S_WB_ERR
|
||||
ZFS_AC_KERNEL_SRC_SOPS_FREE_INODE
|
||||
ZFS_AC_KERNEL_SRC_NAMESPACE
|
||||
case "$host_cpu" in
|
||||
powerpc*)
|
||||
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
||||
@ -256,6 +257,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
|
||||
ZFS_AC_KERNEL_TIMER
|
||||
ZFS_AC_KERNEL_SUPER_BLOCK_S_WB_ERR
|
||||
ZFS_AC_KERNEL_SOPS_FREE_INODE
|
||||
ZFS_AC_KERNEL_NAMESPACE
|
||||
case "$host_cpu" in
|
||||
powerpc*)
|
||||
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
||||
|
||||
@ -25,6 +25,10 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2025, Rob Norris <robn@despairlabs.com>
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#include <sys/kmem.h>
|
||||
@ -56,6 +60,19 @@ typedef struct zone_dataset {
|
||||
} zone_dataset_t;
|
||||
|
||||
#ifdef CONFIG_USER_NS
|
||||
|
||||
/*
|
||||
* Linux 6.18 moved the generic namespace type away from ns->ops->type onto
|
||||
* ns_common itself.
|
||||
*/
|
||||
#ifdef HAVE_NS_COMMON_TYPE
|
||||
#define ns_is_newuser(ns) \
|
||||
((ns)->ns_type == CLONE_NEWUSER)
|
||||
#else
|
||||
#define ns_is_newuser(ns) \
|
||||
((ns)->ops != NULL && (ns)->ops->type == CLONE_NEWUSER)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Returns:
|
||||
* - 0 on success
|
||||
@ -84,7 +101,7 @@ user_ns_get(int fd, struct user_namespace **userns)
|
||||
goto done;
|
||||
}
|
||||
ns = get_proc_ns(file_inode(nsfile));
|
||||
if (ns->ops->type != CLONE_NEWUSER) {
|
||||
if (!ns_is_newuser(ns)) {
|
||||
error = ENOTTY;
|
||||
goto done;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user