File 0025-LU-14651-llite-extend-inode-methods-with-user-namesp.patch of Package lustre_2_12
From ebfd0474c106fd697efcfee3ee87a225c9a33551 Mon Sep 17 00:00:00 2001
From: Jian Yu <yujian@whamcloud.com>
Date: Fri, 14 Jan 2022 10:22:25 -0800
Subject: [PATCH 25/35] LU-14651 llite: extend inode methods with user
namespace arg
Kernel 5.12 supports idmapped mounts, which extends
vfsmount struct with a new struct user_namespace member,
and also extends some inode methods with an additional
user namespace argument.
The series can be found here:
https://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux.git/log/?h=idmapped_mounts
Change-Id: I7cccde8cb3288e1ce3d9b6255796b954a6e115df
Signed-off-by: Jian Yu <yujian@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/45938
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
---
lustre/autoconf/lustre-core.m4 | 50 ++++++++++++++++++++++++---------
lustre/include/lustre_compat.h | 45 ++++++++++++++++++++---------
lustre/llite/file.c | 21 ++++++++------
lustre/llite/llite_internal.h | 31 ++++++++++++++------
lustre/llite/llite_lib.c | 8 ++++--
lustre/llite/namei.c | 38 +++++++++++++++++--------
lustre/llite/xattr.c | 43 ++++++++++++++++++++--------
lustre/osd-ldiskfs/osd_compat.c | 4 +--
lustre/osd-ldiskfs/osd_oi.c | 2 +-
lustre/tests/kernel/kinode.c | 2 +-
10 files changed, 170 insertions(+), 74 deletions(-)
diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4
index f1c1c5bc5480..19cbdaf7b0ce 100644
--- a/lustre/autoconf/lustre-core.m4
+++ b/lustre/autoconf/lustre-core.m4
@@ -378,7 +378,6 @@ inode_ops_permission_2args, [
struct inode *inode __attribute__ ((unused));
inode = "no";
- inode->i_op->permission(NULL, 0);
],[
AC_DEFINE(HAVE_INODE_PERMISION_2ARGS, 1,
[inode_operations->permission has two args])
@@ -747,8 +746,9 @@ AC_DEFUN([LC_IOP_TRUNCATE], [
LB_CHECK_COMPILE([if 'inode_operations' has '.truncate' member function],
inode_ops_truncate, [
#include <linux/fs.h>
+ void *foo;
],[
- ((struct inode_operations *)0)->truncate(NULL);
+ foo = ((struct inode_operations *)0)->truncate;
],[
AC_DEFINE(HAVE_INODEOPS_TRUNCATE, 1,
[inode_operations has .truncate member function])
@@ -1075,14 +1075,9 @@ LB_CHECK_COMPILE([if 'inode_operations' use 'umode_t' as parameter],
inode_ops_umode_t, [
#include <linux/fs.h>
#include <linux/types.h>
- int my_mknod(struct inode *dir, struct dentry *dchild,
- umode_t mode, dev_t dev)
- {
- return 0;
- }
],[
struct inode_operations ops;
- ops.mknod = my_mknod;
+ ops.mknod = NULL;
],[
AC_DEFINE(HAVE_INODEOPS_USE_UMODE_T, 1,
[inode_operations use umode_t as parameter])
@@ -1910,10 +1905,8 @@ LB_CHECK_COMPILE([if 'inode_operations->rename' taken flags as argument],
iops_rename_with_flags, [
#include <linux/fs.h>
],[
- struct inode *i1 = NULL, *i2 = NULL;
- struct dentry *d1 = NULL, *d2 = NULL;
- int rc;
- rc = ((struct inode_operations *)0)->rename(i1, d1, i2, d2, 0);
+ struct inode_operations *iop;
+ iop->rename = NULL;
], [
AC_DEFINE(HAVE_IOPS_RENAME_WITH_FLAGS, 1,
[inode_operations->rename need flags as argument])
@@ -2296,6 +2289,32 @@ bio_endio, [
])
]) # LC_BIO_ENDIO_USES_ONE_ARG
+#
+# LC_HAVE_USER_NAMESPACE_ARG
+#
+# kernel 5.12 commit 549c7297717c32ee53f156cd949e055e601f67bb
+# fs: make helpers idmap mount aware
+# Extend some inode methods with an additional user namespace argument.
+#
+AC_DEFUN([LC_HAVE_USER_NAMESPACE_ARG], [
+tmp_flags="$EXTRA_KCFLAGS"
+EXTRA_KCFLAGS="-Werror"
+LB_CHECK_COMPILE([if 'inode_operations' members have user namespace argument],
+user_namespace_argument, [
+ #include <linux/fs.h>
+],[
+ ((struct inode_operations *)1)->getattr((struct user_namespace *)NULL,
+ NULL, NULL, 0, 0);
+],[
+ AC_DEFINE(HAVE_USER_NAMESPACE_ARG, 1,
+ ['inode_operations' members have user namespace argument])
+])
+EXTRA_KCFLAGS="$tmp_flags"
+]) # LC_HAVE_USER_NAMESPACE_ARG
+
+AC_DEFUN([LC_PROG_LINUX_SRC], [])
+AC_DEFUN([LC_PROG_LINUX_RESULTS], [])
+
#
# LC_HAVE_INTERVAL_EXP_BLK_INTEGRITY
#
@@ -2879,8 +2898,8 @@ LB_CHECK_COMPILE([if 'struct vm_fault' replaced virtual_address with address fie
vm_fault_address, [
#include <linux/mm.h>
],[
- struct vm_fault vmf;
- vmf.address = NULL;
+ unsigned long vaddr = ((struct vm_fault *)0)->address;
+ (void)vaddr;
],[
AC_DEFINE(HAVE_VM_FAULT_ADDRESS, 1,
[virtual_address has been replaced by address field])
@@ -3482,6 +3501,9 @@ AC_DEFUN([LC_PROG_LINUX], [
# 5.1
LC_HAS_LINUX_SELINUX_ENABLED
+ # 5.12
+ LC_HAVE_USER_NAMESPACE_ARG
+
# 5.0
LC_UAPI_LINUX_MOUNT_H
LC_LM_COMPARE_OWNER_EXISTS
diff --git a/lustre/include/lustre_compat.h b/lustre/include/lustre_compat.h
index 887aeb3fae9d..336c6ab12a6d 100644
--- a/lustre/include/lustre_compat.h
+++ b/lustre/include/lustre_compat.h
@@ -1,3 +1,4 @@
+
/*
* GPL HEADER START
*
@@ -370,10 +371,12 @@ static inline struct inode *file_inode(const struct file *file)
#define ll_vfs_rename(a, b, c, d) vfs_rename(a, b, c, d)
#endif
-#ifdef HAVE_VFS_UNLINK_3ARGS
-#define ll_vfs_unlink(a, b) vfs_unlink(a, b, NULL)
+#ifdef HAVE_USER_NAMESPACE_ARG
+#define vfs_unlink(ns, dir, de) vfs_unlink(ns, dir, de, NULL)
+#elif defined HAVE_VFS_UNLINK_3ARGS
+#define vfs_unlink(ns, dir, de) vfs_unlink(dir, de, NULL)
#else
-#define ll_vfs_unlink(a, b) vfs_unlink(a, b)
+#define vfs_unlink(ns, dir, de) vfs_unlink(dir, de)
#endif
#ifndef HAVE_INODE_LOCK
@@ -481,7 +484,7 @@ int ll_removexattr(struct dentry *dentry, const char *name);
#ifdef HAVE_IOP_SET_ACL
#ifdef CONFIG_FS_POSIX_ACL
-#ifndef HAVE_POSIX_ACL_UPDATE_MODE
+#if !defined(HAVE_USER_NAMESPACE_ARG) && !defined(HAVE_POSIX_ACL_UPDATE_MODE)
static inline int posix_acl_update_mode(struct inode *inode, umode_t *mode_p,
struct posix_acl **acl)
{
@@ -801,13 +804,15 @@ static inline int ll_vfs_getxattr(struct dentry *dentry, struct inode *inode,
const char *name,
void *value, size_t size)
{
-#ifndef HAVE_VFS_SETXATTR
+#ifdef HAVE_USER_NAMESPACE_ARG
+ return vfs_getxattr(&init_user_ns, dentry, name, value, size);
+#elif defined(HAVE_VFS_SETXATTR)
+ return __vfs_getxattr(dentry, inode, name, value, size);
+#else
if (unlikely(!inode->i_op->getxattr))
return -ENODATA;
return inode->i_op->getxattr(dentry, name, value, size);
-#else
- return __vfs_getxattr(dentry, inode, name, value, size);
#endif
}
@@ -815,27 +820,41 @@ static inline int ll_vfs_setxattr(struct dentry *dentry, struct inode *inode,
const char *name,
const void *value, size_t size, int flags)
{
-#ifndef HAVE_VFS_SETXATTR
+#ifdef HAVE_USER_NAMESPACE_ARG
+ return vfs_setxattr(&init_user_ns, dentry, name, value, size, flags);
+#elif defined(HAVE_VFS_SETXATTR)
+ return __vfs_setxattr(dentry, inode, name, value, size, flags);
+#else
if (unlikely(!inode->i_op->setxattr))
return -EOPNOTSUPP;
return inode->i_op->setxattr(dentry, name, value, size, flags);
-#else
- return __vfs_setxattr(dentry, inode, name, value, size, flags);
#endif
}
static inline int ll_vfs_removexattr(struct dentry *dentry, struct inode *inode,
const char *name)
{
-#ifndef HAVE_VFS_SETXATTR
+#ifdef HAVE_USER_NAMESPACE_ARG
+ return vfs_removexattr(&init_user_ns, dentry, name);
+#elif defined(HAVE_VFS_SETXATTR)
+ return __vfs_removexattr(dentry, name);
+#else
if (unlikely(!inode->i_op->setxattr))
return -EOPNOTSUPP;
return inode->i_op->removexattr(dentry, name);
-#else
- return __vfs_removexattr(dentry, name);
#endif
}
+#ifndef HAVE_USER_NAMESPACE_ARG
+#define posix_acl_update_mode(ns, inode, mode, acl) \
+ posix_acl_update_mode(inode, mode, acl)
+#define notify_change(ns, de, attr, inode) notify_change(de, attr, inode)
+#define inode_owner_or_capable(ns, inode) inode_owner_or_capable(inode)
+#define vfs_create(ns, dir, de, mode, ex) vfs_create(dir, de, mode, ex)
+#define vfs_mkdir(ns, dir, de, mode) vfs_mkdir(dir, de, mode)
+#define ll_set_acl(ns, inode, acl, type) ll_set_acl(inode, acl, type)
+#endif
+
#endif /* _LUSTRE_COMPAT_H */
diff --git a/lustre/llite/file.c b/lustre/llite/file.c
index 20b986865628..80b9c7772f1f 100644
--- a/lustre/llite/file.c
+++ b/lustre/llite/file.c
@@ -1127,8 +1127,8 @@ static int ll_check_swap_layouts_validity(struct inode *inode1,
if (!S_ISREG(inode1->i_mode) || !S_ISREG(inode2->i_mode))
return -EINVAL;
- if (inode_permission(inode1, MAY_WRITE) ||
- inode_permission(inode2, MAY_WRITE))
+ if (inode_permission(&init_user_ns, inode1, MAY_WRITE) ||
+ inode_permission(&init_user_ns, inode2, MAY_WRITE))
return -EPERM;
if (inode1->i_sb != inode2->i_sb)
@@ -4491,9 +4491,9 @@ static inline dev_t ll_compat_encode_dev(dev_t dev)
return MKDEV(MAJOR(dev) & 0xff, MINOR(dev) & 0xff);
}
-#ifdef HAVE_INODEOPS_ENHANCED_GETATTR
-int ll_getattr(const struct path *path, struct kstat *stat,
- u32 request_mask, unsigned int flags)
+#if defined(HAVE_USER_NAMESPACE_ARG) || defined(HAVE_INODEOPS_ENHANCED_GETATTR)
+int ll_getattr(struct user_namespace *mnt_userns, const struct path *path,
+ struct kstat *stat, u32 request_mask, unsigned int flags)
{
struct dentry *de = path->dentry;
#else
@@ -4619,7 +4619,8 @@ struct posix_acl *ll_get_acl(struct inode *inode, int type)
#ifdef HAVE_IOP_SET_ACL
#ifdef CONFIG_FS_POSIX_ACL
-int ll_set_acl(struct inode *inode, struct posix_acl *acl, int type)
+int ll_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
+ struct posix_acl *acl, int type)
{
struct ll_sb_info *sbi = ll_i2sbi(inode);
struct ptlrpc_request *req = NULL;
@@ -4633,7 +4634,8 @@ int ll_set_acl(struct inode *inode, struct posix_acl *acl, int type)
case ACL_TYPE_ACCESS:
name = XATTR_NAME_POSIX_ACL_ACCESS;
if (acl)
- rc = posix_acl_update_mode(inode, &inode->i_mode, &acl);
+ rc = posix_acl_update_mode(mnt_userns, inode,
+ &inode->i_mode, &acl);
break;
case ACL_TYPE_DEFAULT:
@@ -4683,7 +4685,8 @@ int ll_inode_permission(struct inode *inode, int mask, unsigned int flags)
# ifdef HAVE_INODE_PERMISION_2ARGS
int ll_inode_permission(struct inode *inode, int mask)
# else
-int ll_inode_permission(struct inode *inode, int mask)
+int ll_inode_permission(struct user_namespace *mnt_userns, struct inode *inode,
+ int mask)
# endif
#endif
{
@@ -4745,7 +4748,7 @@ int ll_inode_permission(struct inode *inode, int mask)
}
ll_stats_ops_tally(sbi, LPROC_LL_INODE_PERM, 1);
- rc = ll_generic_permission(inode, mask, flags, ll_check_acl);
+ rc = generic_permission(mnt_userns, inode, mask);
/* restore current process's credentials and FS capability */
if (squash_id) {
revert_creds(old_cred);
diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h
index 113d492c9bcf..53394cdeb459 100644
--- a/lustre/llite/llite_internal.h
+++ b/lustre/llite/llite_internal.h
@@ -236,6 +236,17 @@ struct ll_inode_info {
struct list_head lli_xattrs; /* ll_xattr_entry->xe_list */
};
+#ifndef HAVE_USER_NAMESPACE_ARG
+#define inode_permission(ns, inode, mask) inode_permission(inode, mask)
+#define generic_permission(ns, inode, mask) generic_permission(inode, mask)
+#define simple_setattr(ns, de, iattr) simple_setattr(de, iattr)
+#define ll_inode_permission(ns, inode, mask) ll_inode_permission(inode, mask)
+#ifdef HAVE_INODEOPS_ENHANCED_GETATTR
+#define ll_getattr(ns, path, stat, mask, fl) ll_getattr(path, stat, mask, fl)
+#endif /* HAVE_INODEOPS_ENHANCED_GETATTR */
+#define ll_setattr(ns, de, attr) ll_setattr(de, attr)
+#endif
+
static inline __u32 ll_layout_version_get(struct ll_inode_info *lli)
{
__u32 gen;
@@ -866,16 +877,17 @@ int ll_md_real_close(struct inode *inode, fmode_t fmode);
extern void ll_rw_stats_tally(struct ll_sb_info *sbi, pid_t pid,
struct ll_file_data *file, loff_t pos,
size_t count, int rw);
-#ifdef HAVE_INODEOPS_ENHANCED_GETATTR
-int ll_getattr(const struct path *path, struct kstat *stat,
- u32 request_mask, unsigned int flags);
+#if defined(HAVE_USER_NAMESPACE_ARG) || defined(HAVE_INODEOPS_ENHANCED_GETATTR)
+int ll_getattr(struct user_namespace *mnt_userns, const struct path *path,
+ struct kstat *stat, u32 request_mask, unsigned int flags);
#else
int ll_getattr(struct vfsmount *mnt, struct dentry *de, struct kstat *stat);
-#endif
+#endif /* HAVE_USER_NAMESPACE_ARG */
struct posix_acl *ll_get_acl(struct inode *inode, int type);
#ifdef HAVE_IOP_SET_ACL
#ifdef CONFIG_FS_POSIX_ACL
-int ll_set_acl(struct inode *inode, struct posix_acl *acl, int type);
+int ll_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
+ struct posix_acl *acl, int type);
#else /* !CONFIG_FS_POSIX_ACL */
#define ll_set_acl NULL
#endif /* CONFIG_FS_POSIX_ACL */
@@ -886,10 +898,12 @@ int ll_migrate(struct inode *parent, struct file *file,
int ll_get_fid_by_name(struct inode *parent, const char *name,
int namelen, struct lu_fid *fid, struct inode **inode);
#ifdef HAVE_GENERIC_PERMISSION_4ARGS
-int ll_inode_permission(struct inode *inode, int mask, unsigned int flags);
+int ll_inode_permission(struct inode *inode,
+ int mask, unsigned int flags);
#else
# ifndef HAVE_INODE_PERMISION_2ARGS
-int ll_inode_permission(struct inode *inode, int mask);
+int ll_inode_permission(struct user_namespace *mnt_userns, struct inode *inode,
+ int mask);
# else
int ll_inode_permission(struct inode *inode, int mask);
# endif
@@ -950,7 +964,8 @@ void ll_dir_clear_lsm_md(struct inode *inode);
void ll_clear_inode(struct inode *inode);
int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
enum op_xvalid xvalid, bool hsm_import);
-int ll_setattr(struct dentry *de, struct iattr *attr);
+int ll_setattr(struct user_namespace *mnt_userns, struct dentry *de,
+ struct iattr *attr);
int ll_statfs(struct dentry *de, struct kstatfs *sfs);
int ll_statfs_internal(struct ll_sb_info *sbi, struct obd_statfs *osfs,
u32 flags);
diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c
index 80b32939d02a..7ccf9f6e2170 100644
--- a/lustre/llite/llite_lib.c
+++ b/lustre/llite/llite_lib.c
@@ -1563,7 +1563,8 @@ static int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data)
!S_ISDIR(inode->i_mode)) {
ia_valid = op_data->op_attr.ia_valid;
op_data->op_attr.ia_valid &= ~TIMES_SET_FLAGS;
- rc = simple_setattr(dentry, &op_data->op_attr);
+ rc = simple_setattr(&init_user_ns, dentry,
+ &op_data->op_attr);
op_data->op_attr.ia_valid = ia_valid;
}
} else if (rc != -EPERM && rc != -EACCES && rc != -ETXTBSY) {
@@ -1585,7 +1586,7 @@ static int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data)
op_data->op_attr.ia_valid &= ~(TIMES_SET_FLAGS | ATTR_SIZE);
if (S_ISREG(inode->i_mode))
inode_lock(inode);
- rc = simple_setattr(dentry, &op_data->op_attr);
+ rc = simple_setattr(&init_user_ns, dentry, &op_data->op_attr);
if (S_ISREG(inode->i_mode))
inode_unlock(inode);
op_data->op_attr.ia_valid = ia_valid;
@@ -1780,7 +1781,8 @@ out:
return rc;
}
-int ll_setattr(struct dentry *de, struct iattr *attr)
+int ll_setattr(struct user_namespace *mnt_userns, struct dentry *de,
+ struct iattr *attr)
{
int mode = de->d_inode->i_mode;
enum op_xvalid xvalid = 0;
diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c
index b36476482931..47ae228d0736 100644
--- a/lustre/llite/namei.c
+++ b/lustre/llite/namei.c
@@ -49,6 +49,18 @@
#include <lustre_dlm.h>
#include "llite_internal.h"
+#ifndef HAVE_USER_NAMESPACE_ARG
+#define ll_create_nd(ns, dir, de, mode, ex) ll_create_nd(dir, de, mode, ex)
+#define ll_mkdir(ns, dir, dch, mode) ll_mkdir(dir, dch, mode)
+#define ll_mknod(ns, dir, dch, mode, rd) ll_mknod(dir, dch, mode, rd)
+#ifdef HAVE_IOPS_RENAME_WITH_FLAGS
+#define ll_rename(ns, src, sdc, tgt, tdc, fl) ll_rename(src, sdc, tgt, tdc, fl)
+#else
+#define ll_rename(ns, src, sdc, tgt, tdc) ll_rename(src, sdc, tgt, tdc)
+#endif /* HAVE_IOPS_RENAME_WITH_FLAGS */
+#define ll_symlink(nd, dir, dch, old) ll_symlink(dir, dch, old)
+#endif
+
static int ll_create_it(struct inode *dir, struct dentry *dentry,
struct lookup_intent *it,
void *secctx, __u32 secctxlen);
@@ -905,7 +917,8 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
* to proceed with lookup. LU-4185
*/
if ((flags & LOOKUP_CREATE) && !(flags & LOOKUP_OPEN) &&
- (inode_permission(parent, MAY_WRITE | MAY_EXEC) == 0))
+ (inode_permission(&init_user_ns,
+ parent, MAY_WRITE | MAY_EXEC) == 0))
return NULL;
if (flags & (LOOKUP_PARENT|LOOKUP_OPEN|LOOKUP_CREATE))
@@ -1373,8 +1386,8 @@ err_exit:
return err;
}
-static int ll_mknod(struct inode *dir, struct dentry *dchild, ll_umode_t mode,
- dev_t rdev)
+static int ll_mknod(struct user_namespace *mnt_userns, struct inode *dir,
+ struct dentry *dchild, ll_umode_t mode, dev_t rdev)
{
struct qstr *name = &dchild->d_name;
int err;
@@ -1416,7 +1429,8 @@ static int ll_mknod(struct inode *dir, struct dentry *dchild, ll_umode_t mode,
/*
* Plain create. Intent create is handled in atomic_open.
*/
-static int ll_create_nd(struct inode *dir, struct dentry *dentry,
+static int ll_create_nd(struct user_namespace *mnt_userns,
+ struct inode *dir, struct dentry *dentry,
umode_t mode, bool want_excl)
{
int rc;
@@ -1430,7 +1444,7 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry,
/* Using mknod(2) to create a regular file is designed to not recognize
* volatile file name, so we use ll_mknod() here. */
- rc = ll_mknod(dir, dentry, mode, 0);
+ rc = ll_mknod(mnt_userns, dir, dentry, mode, 0);
ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_CREATE, 1);
@@ -1491,8 +1505,8 @@ out:
}
#endif /* HAVE_IOP_ATOMIC_OPEN */
-static int ll_symlink(struct inode *dir, struct dentry *dchild,
- const char *oldpath)
+static int ll_symlink(struct user_namespace *mnt_userns, struct inode *dir,
+ struct dentry *dchild, const char *oldpath)
{
struct qstr *name = &dchild->d_name;
int err;
@@ -1544,7 +1558,8 @@ out:
RETURN(err);
}
-static int ll_mkdir(struct inode *dir, struct dentry *dchild, ll_umode_t mode)
+static int ll_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
+ struct dentry *dchild, ll_umode_t mode)
{
struct qstr *name = &dchild->d_name;
int err;
@@ -1675,9 +1690,10 @@ out:
RETURN(rc);
}
-static int ll_rename(struct inode *src, struct dentry *src_dchild,
+static int ll_rename(struct user_namespace *mnt_userns,
+ struct inode *src, struct dentry *src_dchild,
struct inode *tgt, struct dentry *tgt_dchild
-#ifdef HAVE_IOPS_RENAME_WITH_FLAGS
+#if defined(HAVE_USER_NAMESPACE_ARG) || defined(HAVE_IOPS_RENAME_WITH_FLAGS)
, unsigned int flags
#endif
)
@@ -1690,7 +1706,7 @@ static int ll_rename(struct inode *src, struct dentry *src_dchild,
int err;
ENTRY;
-#ifdef HAVE_IOPS_RENAME_WITH_FLAGS
+#if defined(HAVE_USER_NAMESPACE_ARG) || defined(HAVE_IOPS_RENAME_WITH_FLAGS)
if (flags)
return -EINVAL;
#endif
diff --git a/lustre/llite/xattr.c b/lustre/llite/xattr.c
index 7e6bfc0a5183..444125a230bf 100644
--- a/lustre/llite/xattr.c
+++ b/lustre/llite/xattr.c
@@ -92,7 +92,13 @@ static int xattr_type_filter(struct ll_sb_info *sbi,
return 0;
}
+#ifndef HAVE_USER_NAMESPACE_ARG
+#define ll_xattr_set_common(hd, ns, de, inode, name, value, size, flags) \
+ ll_xattr_set_common(hd, de, inode, name, value, size, flags)
+#endif
+
static int ll_xattr_set_common(const struct xattr_handler *handler,
+ struct user_namespace *mnt_userns,
struct dentry *dentry, struct inode *inode,
const char *name, const void *value, size_t size,
int flags)
@@ -128,7 +134,7 @@ static int ll_xattr_set_common(const struct xattr_handler *handler,
if ((handler->flags == XATTR_ACL_ACCESS_T ||
handler->flags == XATTR_ACL_DEFAULT_T) &&
#ifdef HAVE_INODE_OWNER_OR_CAPABLE
- !inode_owner_or_capable(inode))
+ !inode_owner_or_capable(mnt_userns, inode))
#else
!is_owner_or_cap(inode))
#endif
@@ -323,7 +329,13 @@ static int ll_setstripe_ea(struct dentry *dentry, struct lov_user_md *lump,
return rc;
}
+#ifndef HAVE_USER_NAMESPACE_ARG
+#define ll_xattr_set(hd, ns, de, inode, name, value, size, flags) \
+ ll_xattr_set(hd, de, inode, name, value, size, flags)
+#endif
+
static int ll_xattr_set(const struct xattr_handler *handler,
+ struct user_namespace *mnt_userns,
struct dentry *dentry, struct inode *inode,
const char *name, const void *value, size_t size,
int flags)
@@ -356,8 +368,8 @@ static int ll_xattr_set(const struct xattr_handler *handler,
le32_to_cpu(LOV_MAGIC_MASK)) == le32_to_cpu(LOV_MAGIC_MAGIC))
lustre_swab_lov_user_md((struct lov_user_md *)value, 0);
- return ll_xattr_set_common(handler, dentry, inode, name, value, size,
- flags);
+ return ll_xattr_set_common(handler, mnt_userns, dentry, inode, name,
+ value, size, flags);
}
int ll_xattr_list(struct inode *inode, const char *name, int type, void *buffer,
@@ -692,7 +704,8 @@ static int ll_xattr_set_4_3(const struct xattr_handler *handler,
size, flags);
}
-#elif !defined(HAVE_XATTR_HANDLER_INODE_PARAM)
+#elif !defined(HAVE_USER_NAMESPACE_ARG) && \
+!defined(HAVE_XATTR_HANDLER_INODE_PARAM)
const struct xattr_handler *get_xattr_handler(int handler_flag)
{
int i = 0;
@@ -738,7 +751,7 @@ static int ll_xattr_set_common_3_11(struct dentry *dentry, const char *name,
if (!handler)
return -ENXIO;
- return ll_xattr_set_common(handler, dentry, dentry->d_inode, name,
+ return ll_xattr_set_common(handler, NULL, dentry, dentry->d_inode, name,
value, size, flags);
}
@@ -751,7 +764,7 @@ static int ll_xattr_set_3_11(struct dentry *dentry, const char *name,
if (!handler)
return -ENXIO;
- return ll_xattr_set(handler, dentry, dentry->d_inode, name, value,
+ return ll_xattr_set(handler, NULL, dentry, dentry->d_inode, name, value,
size, flags);
}
#endif
@@ -762,7 +775,8 @@ static const struct xattr_handler ll_user_xattr_handler = {
#if defined(HAVE_XATTR_HANDLER_SIMPLIFIED)
.get = ll_xattr_get_common_4_3,
.set = ll_xattr_set_common_4_3,
-#elif !defined(HAVE_XATTR_HANDLER_INODE_PARAM)
+#elif !defined(HAVE_USER_NAMESPACE_ARG) && \
+!defined(HAVE_XATTR_HANDLER_INODE_PARAM)
.get = ll_xattr_get_common_3_11,
.set = ll_xattr_set_common_3_11,
#else
@@ -777,7 +791,8 @@ static const struct xattr_handler ll_trusted_xattr_handler = {
#if defined(HAVE_XATTR_HANDLER_SIMPLIFIED)
.get = ll_xattr_get_4_3,
.set = ll_xattr_set_4_3,
-#elif !defined(HAVE_XATTR_HANDLER_INODE_PARAM)
+#elif !defined(HAVE_USER_NAMESPACE_ARG) && \
+!defined(HAVE_XATTR_HANDLER_INODE_PARAM)
.get = ll_xattr_get_3_11,
.set = ll_xattr_set_3_11,
#else
@@ -792,7 +807,8 @@ static const struct xattr_handler ll_security_xattr_handler = {
#if defined(HAVE_XATTR_HANDLER_SIMPLIFIED)
.get = ll_xattr_get_common_4_3,
.set = ll_xattr_set_common_4_3,
-#elif !defined(HAVE_XATTR_HANDLER_INODE_PARAM)
+#elif !defined(HAVE_USER_NAMESPACE_ARG) && \
+!defined(HAVE_XATTR_HANDLER_INODE_PARAM)
.get = ll_xattr_get_common_3_11,
.set = ll_xattr_set_common_3_11,
#else
@@ -811,7 +827,8 @@ static const struct xattr_handler ll_acl_access_xattr_handler = {
#if defined(HAVE_XATTR_HANDLER_SIMPLIFIED)
.get = ll_xattr_get_common_4_3,
.set = ll_xattr_set_common_4_3,
-#elif !defined(HAVE_XATTR_HANDLER_INODE_PARAM)
+#elif !defined(HAVE_USER_NAMESPACE_ARG) && \
+!defined(HAVE_XATTR_HANDLER_INODE_PARAM)
.get = ll_xattr_get_common_3_11,
.set = ll_xattr_set_common_3_11,
#else
@@ -830,7 +847,8 @@ static const struct xattr_handler ll_acl_default_xattr_handler = {
#if defined(HAVE_XATTR_HANDLER_SIMPLIFIED)
.get = ll_xattr_get_common_4_3,
.set = ll_xattr_set_common_4_3,
-#elif !defined(HAVE_XATTR_HANDLER_INODE_PARAM)
+#elif !defined(HAVE_USER_NAMESPACE_ARG) && \
+!defined(HAVE_XATTR_HANDLER_INODE_PARAM)
.get = ll_xattr_get_common_3_11,
.set = ll_xattr_set_common_3_11,
#else
@@ -845,7 +863,8 @@ static const struct xattr_handler ll_lustre_xattr_handler = {
#if defined(HAVE_XATTR_HANDLER_SIMPLIFIED)
.get = ll_xattr_get_4_3,
.set = ll_xattr_set_4_3,
-#elif !defined(HAVE_XATTR_HANDLER_INODE_PARAM)
+#elif !defined(HAVE_USER_NAMESPACE_ARG) && \
+!defined(HAVE_XATTR_HANDLER_INODE_PARAM)
.get = ll_xattr_get_3_11,
.set = ll_xattr_set_3_11,
#else
diff --git a/lustre/osd-ldiskfs/osd_compat.c b/lustre/osd-ldiskfs/osd_compat.c
index f39e39a48968..83c8f5a08ad8 100644
--- a/lustre/osd-ldiskfs/osd_compat.c
+++ b/lustre/osd-ldiskfs/osd_compat.c
@@ -127,7 +127,7 @@ simple_mkdir(const struct lu_env *env, struct osd_device *osd,
RETURN(dchild);
}
- err = vfs_mkdir(dir->d_inode, dchild, mode);
+ err = vfs_mkdir(&init_user_ns, dir->d_inode, dchild, mode);
if (err)
GOTO(out_err, err);
@@ -1255,7 +1255,7 @@ int osd_obj_map_recover(struct osd_thread_info *info,
/* If the src object has never been modified, then remove it. */
if (inode->i_size == 0 && inode->i_mode & S_ISUID &&
inode->i_mode & S_ISGID) {
- rc = ll_vfs_unlink(src_parent, src_child);
+ rc = vfs_unlink(&init_user_ns, src_parent, src_child);
if (unlikely(rc == -ENOENT))
rc = 0;
}
diff --git a/lustre/osd-ldiskfs/osd_oi.c b/lustre/osd-ldiskfs/osd_oi.c
index 47295cd3761a..ded20c955d88 100644
--- a/lustre/osd-ldiskfs/osd_oi.c
+++ b/lustre/osd-ldiskfs/osd_oi.c
@@ -346,7 +346,7 @@ static int osd_remove_oi_one(struct dentry *parent, const char *name,
if (IS_ERR(child)) {
rc = PTR_ERR(child);
} else {
- rc = ll_vfs_unlink(parent->d_inode, child);
+ rc = vfs_unlink(&init_user_ns, parent->d_inode, child);
dput(child);
}
diff --git a/lustre/tests/kernel/kinode.c b/lustre/tests/kernel/kinode.c
index b143ab8357cf..7c6c6e3dc137 100644
--- a/lustre/tests/kernel/kinode.c
+++ b/lustre/tests/kernel/kinode.c
@@ -64,7 +64,7 @@ static int stat_file(struct kstat *stbuf)
return -EIO;
}
-#ifdef HAVE_INODEOPS_ENHANCED_GETATTR
+#if defined(HAVE_USER_NAMESPACE_ARG) || defined(HAVE_INODEOPS_ENHANCED_GETATTR)
rc = vfs_getattr(&fd->f_path, stbuf, STATX_INO, AT_STATX_SYNC_AS_STAT);
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
rc = vfs_getattr(&fd->f_path, stbuf);
--
2.41.0