aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Norris <robn@despairlabs.com>2025-04-04 05:59:15 +0000
committerTony Hutter <hutter2@llnl.gov>2025-05-27 21:41:45 +0000
commit3f94332a7ada27c71b813df405b5e6c87e57e9db (patch)
tree036e65b3fe8133bf65e4504fa87bb6e434400315
parent050517c41b0ce7f85712cfd2d0c460ac40951503 (diff)
-rw-r--r--config/kernel-mkdir.m457
-rw-r--r--module/os/linux/zfs/zpl_ctldir.c12
-rw-r--r--module/os/linux/zfs/zpl_inode.c17
3 files changed, 67 insertions, 19 deletions
diff --git a/config/kernel-mkdir.m4 b/config/kernel-mkdir.m4
index 8e084443c7b4..c1aebc387abe 100644
--- a/config/kernel-mkdir.m4
+++ b/config/kernel-mkdir.m4
@@ -3,6 +3,22 @@ dnl # Supported mkdir() interfaces checked newest to oldest.
dnl #
AC_DEFUN([ZFS_AC_KERNEL_SRC_MKDIR], [
dnl #
+ dnl # 6.15 API change
+ dnl # mkdir() returns struct dentry *
+ dnl #
+ ZFS_LINUX_TEST_SRC([mkdir_return_dentry], [
+ #include <linux/fs.h>
+
+ static struct dentry *mkdir(struct mnt_idmap *idmap,
+ struct inode *inode, struct dentry *dentry,
+ umode_t umode) { return dentry; }
+ static const struct inode_operations
+ iops __attribute__ ((unused)) = {
+ .mkdir = mkdir,
+ };
+ ],[])
+
+ dnl #
dnl # 6.3 API change
dnl # mkdir() takes struct mnt_idmap * as the first arg
dnl #
@@ -59,29 +75,40 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_MKDIR], [
AC_DEFUN([ZFS_AC_KERNEL_MKDIR], [
dnl #
- dnl # 6.3 API change
- dnl # mkdir() takes struct mnt_idmap * as the first arg
+ dnl # 6.15 API change
+ dnl # mkdir() returns struct dentry *
dnl #
- AC_MSG_CHECKING([whether iops->mkdir() takes struct mnt_idmap*])
- ZFS_LINUX_TEST_RESULT([mkdir_mnt_idmap], [
+ AC_MSG_CHECKING([whether iops->mkdir() returns struct dentry*])
+ ZFS_LINUX_TEST_RESULT([mkdir_return_dentry], [
AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_IOPS_MKDIR_IDMAP, 1,
- [iops->mkdir() takes struct mnt_idmap*])
+ AC_DEFINE(HAVE_IOPS_MKDIR_DENTRY, 1,
+ [iops->mkdir() returns struct dentry*])
],[
- AC_MSG_RESULT(no)
-
dnl #
- dnl # 5.12 API change
- dnl # The struct user_namespace arg was added as the first argument to
- dnl # mkdir() of the iops structure.
+ dnl # 6.3 API change
+ dnl # mkdir() takes struct mnt_idmap * as the first arg
dnl #
- AC_MSG_CHECKING([whether iops->mkdir() takes struct user_namespace*])
- ZFS_LINUX_TEST_RESULT([mkdir_user_namespace], [
+ AC_MSG_CHECKING([whether iops->mkdir() takes struct mnt_idmap*])
+ ZFS_LINUX_TEST_RESULT([mkdir_mnt_idmap], [
AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_IOPS_MKDIR_USERNS, 1,
- [iops->mkdir() takes struct user_namespace*])
+ AC_DEFINE(HAVE_IOPS_MKDIR_IDMAP, 1,
+ [iops->mkdir() takes struct mnt_idmap*])
],[
AC_MSG_RESULT(no)
+
+ dnl #
+ dnl # 5.12 API change
+ dnl # The struct user_namespace arg was added as the first argument to
+ dnl # mkdir() of the iops structure.
+ dnl #
+ AC_MSG_CHECKING([whether iops->mkdir() takes struct user_namespace*])
+ ZFS_LINUX_TEST_RESULT([mkdir_user_namespace], [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_IOPS_MKDIR_USERNS, 1,
+ [iops->mkdir() takes struct user_namespace*])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
])
])
])
diff --git a/module/os/linux/zfs/zpl_ctldir.c b/module/os/linux/zfs/zpl_ctldir.c
index d6a755af6b2d..a7fdb8f28009 100644
--- a/module/os/linux/zfs/zpl_ctldir.c
+++ b/module/os/linux/zfs/zpl_ctldir.c
@@ -336,14 +336,20 @@ zpl_snapdir_rmdir(struct inode *dip, struct dentry *dentry)
return (error);
}
+#if defined(HAVE_IOPS_MKDIR_USERNS)
static int
-#ifdef HAVE_IOPS_MKDIR_USERNS
zpl_snapdir_mkdir(struct user_namespace *user_ns, struct inode *dip,
struct dentry *dentry, umode_t mode)
#elif defined(HAVE_IOPS_MKDIR_IDMAP)
+static int
+zpl_snapdir_mkdir(struct mnt_idmap *user_ns, struct inode *dip,
+ struct dentry *dentry, umode_t mode)
+#elif defined(HAVE_IOPS_MKDIR_DENTRY)
+static struct dentry *
zpl_snapdir_mkdir(struct mnt_idmap *user_ns, struct inode *dip,
struct dentry *dentry, umode_t mode)
#else
+static int
zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, umode_t mode)
#endif
{
@@ -371,7 +377,11 @@ zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, umode_t mode)
ASSERT3S(error, <=, 0);
crfree(cr);
+#if defined(HAVE_IOPS_MKDIR_DENTRY)
+ return (ERR_PTR(error));
+#else
return (error);
+#endif
}
/*
diff --git a/module/os/linux/zfs/zpl_inode.c b/module/os/linux/zfs/zpl_inode.c
index 8386fc2ae0ce..56ef3a7d1212 100644
--- a/module/os/linux/zfs/zpl_inode.c
+++ b/module/os/linux/zfs/zpl_inode.c
@@ -333,14 +333,20 @@ zpl_unlink(struct inode *dir, struct dentry *dentry)
return (error);
}
+#if defined(HAVE_IOPS_MKDIR_USERNS)
static int
-#ifdef HAVE_IOPS_MKDIR_USERNS
zpl_mkdir(struct user_namespace *user_ns, struct inode *dir,
struct dentry *dentry, umode_t mode)
#elif defined(HAVE_IOPS_MKDIR_IDMAP)
+static int
+zpl_mkdir(struct mnt_idmap *user_ns, struct inode *dir,
+ struct dentry *dentry, umode_t mode)
+#elif defined(HAVE_IOPS_MKDIR_DENTRY)
+static struct dentry *
zpl_mkdir(struct mnt_idmap *user_ns, struct inode *dir,
struct dentry *dentry, umode_t mode)
#else
+static int
zpl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
#endif
{
@@ -349,7 +355,8 @@ zpl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
znode_t *zp;
int error;
fstrans_cookie_t cookie;
-#if !(defined(HAVE_IOPS_MKDIR_USERNS) || defined(HAVE_IOPS_MKDIR_IDMAP))
+#if !(defined(HAVE_IOPS_MKDIR_USERNS) || \
+ defined(HAVE_IOPS_MKDIR_IDMAP) || defined(HAVE_IOPS_MKDIR_DENTRY))
zidmap_t *user_ns = kcred->user_ns;
#endif
@@ -377,9 +384,13 @@ zpl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
spl_fstrans_unmark(cookie);
kmem_free(vap, sizeof (vattr_t));
crfree(cr);
- ASSERT3S(error, <=, 0);
+ ASSERT3S(error, <=, 0);
+#if defined(HAVE_IOPS_MKDIR_DENTRY)
+ return (error != 0 ? ERR_PTR(error) : NULL);
+#else
return (error);
+#endif
}
static int