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

openSUSE Build Service is sponsored by