mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-01-25 10:12:13 +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_TIMER
|
||||||
ZFS_AC_KERNEL_SRC_SUPER_BLOCK_S_WB_ERR
|
ZFS_AC_KERNEL_SRC_SUPER_BLOCK_S_WB_ERR
|
||||||
ZFS_AC_KERNEL_SRC_SOPS_FREE_INODE
|
ZFS_AC_KERNEL_SRC_SOPS_FREE_INODE
|
||||||
|
ZFS_AC_KERNEL_SRC_NAMESPACE
|
||||||
case "$host_cpu" in
|
case "$host_cpu" in
|
||||||
powerpc*)
|
powerpc*)
|
||||||
ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
|
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_TIMER
|
||||||
ZFS_AC_KERNEL_SUPER_BLOCK_S_WB_ERR
|
ZFS_AC_KERNEL_SUPER_BLOCK_S_WB_ERR
|
||||||
ZFS_AC_KERNEL_SOPS_FREE_INODE
|
ZFS_AC_KERNEL_SOPS_FREE_INODE
|
||||||
|
ZFS_AC_KERNEL_NAMESPACE
|
||||||
case "$host_cpu" in
|
case "$host_cpu" in
|
||||||
powerpc*)
|
powerpc*)
|
||||||
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
ZFS_AC_KERNEL_CPU_HAS_FEATURE
|
||||||
|
|||||||
@ -25,6 +25,10 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2025, Rob Norris <robn@despairlabs.com>
|
||||||
|
*/
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/sysmacros.h>
|
#include <sys/sysmacros.h>
|
||||||
#include <sys/kmem.h>
|
#include <sys/kmem.h>
|
||||||
@ -56,6 +60,19 @@ typedef struct zone_dataset {
|
|||||||
} zone_dataset_t;
|
} zone_dataset_t;
|
||||||
|
|
||||||
#ifdef CONFIG_USER_NS
|
#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:
|
* Returns:
|
||||||
* - 0 on success
|
* - 0 on success
|
||||||
@ -84,7 +101,7 @@ user_ns_get(int fd, struct user_namespace **userns)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ns = get_proc_ns(file_inode(nsfile));
|
ns = get_proc_ns(file_inode(nsfile));
|
||||||
if (ns->ops->type != CLONE_NEWUSER) {
|
if (!ns_is_newuser(ns)) {
|
||||||
error = ENOTTY;
|
error = ENOTTY;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user