Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
filesystems
lustre_2_12
0025-LU-14651-llite-extend-inode-methods-with-u...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor