From dcd5607ce0b35c256a7e2ec7cdca642961219c07 Mon Sep 17 00:00:00 2001 From: Sebastien Buisson Date: Mon, 6 Apr 2020 09:29:10 +0000 Subject: [PATCH] LU-13430 vfs: add ll_vfs_getxattr/ll_vfs_setxattr compat macro Instead of checking everywhere in the code whether kernel defines __vfs_getxattr/__vfs_setxattr/__vfs_removexattr, define compat macros to handle this in lustre_compat.h. Signed-off-by: Sebastien Buisson Change-Id: Iabb54c41e6ccc4b9524f614308a4cd98c5a7ec55 Reviewed-on: https://review.whamcloud.com/38175 Reviewed-by: Andreas Dilger Tested-by: jenkins Reviewed-by: James Simmons Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/include/lustre_compat.h | 66 ++++++++++++++++++++++++--------------- lustre/llite/pcc.c | 25 +++------------ lustre/llite/xattr_security.c | 4 +-- lustre/osd-ldiskfs/osd_handler.c | 4 +-- lustre/osd-ldiskfs/osd_internal.h | 20 ++---------- lustre/osd-ldiskfs/osd_scrub.c | 2 +- 6 files changed, 52 insertions(+), 69 deletions(-) diff --git a/lustre/include/lustre_compat.h b/lustre/include/lustre_compat.h index 53c8a17..b9e5ca8 100644 --- a/lustre/include/lustre_compat.h +++ b/lustre/include/lustre_compat.h @@ -193,31 +193,6 @@ static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr) #define ll_removexattr generic_removexattr #endif /* HAVE_IOP_XATTR */ -#ifndef HAVE_VFS_SETXATTR -const struct xattr_handler *get_xattr_type(const char *name); - -static inline int -__vfs_setxattr(struct dentry *dentry, struct inode *inode, const char *name, - const void *value, size_t size, int flags) -{ - const struct xattr_handler *handler; - int rc; - - handler = get_xattr_type(name); - if (!handler) - return -EOPNOTSUPP; - -# if defined(HAVE_XATTR_HANDLER_INODE_PARAM) - rc = handler->set(handler, dentry, inode, name, value, size, flags); -# elif defined(HAVE_XATTR_HANDLER_SIMPLIFIED) - rc = handler->set(handler, dentry, name, value, size, flags); -# else - rc = handler->set(dentry, name, value, size, flags, handler->flags); -# endif /* !HAVE_XATTR_HANDLER_INODE_PARAM */ - return rc; -} -#endif /* HAVE_VFS_SETXATTR */ - #ifndef HAVE_POSIX_ACL_VALID_USER_NS #define posix_acl_valid(a,b) posix_acl_valid(b) #endif @@ -541,4 +516,45 @@ static inline bool bdev_integrity_enabled(struct block_device *bdev, int rw) #define selinux_is_enabled() 1 #endif +static inline int ll_vfs_getxattr(struct dentry *dentry, struct inode *inode, + const char *name, + void *value, size_t size) +{ +#ifndef HAVE_VFS_SETXATTR + if (!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 +} + +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 + if (!inode->i_op->setxattr) + return -ENOTSUPP; + + 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 + if (!inode->i_op->setxattr) + return -ENOTSUPP; + + return inode->i_op->removexattr(dentry, name); +#else + return __vfs_removexattr(dentry, name); +#endif +} + #endif /* _LUSTRE_COMPAT_H */ diff --git a/lustre/llite/pcc.c b/lustre/llite/pcc.c index eeae234..70da52d 100644 --- a/lustre/llite/pcc.c +++ b/lustre/llite/pcc.c @@ -1106,16 +1106,9 @@ static int pcc_layout_xattr_set(struct pcc_inode *pcci, __u32 gen) if (!(lli->lli_pcc_dsflags & PCC_DATASET_AUTO_ATTACH)) RETURN(0); -#ifndef HAVE_VFS_SETXATTR - if (!pcc_dentry->d_inode->i_op->setxattr) - RETURN(-ENOTSUPP); + rc = ll_vfs_setxattr(pcc_dentry, pcc_dentry->d_inode, pcc_xattr_layout, + &gen, sizeof(gen), 0); - rc = pcc_dentry->d_inode->i_op->setxattr(pcc_dentry, pcc_xattr_layout, - &gen, sizeof(gen), 0); -#else - rc = __vfs_setxattr(pcc_dentry, pcc_dentry->d_inode, pcc_xattr_layout, - &gen, sizeof(gen), 0); -#endif RETURN(rc); } @@ -1238,18 +1231,8 @@ static int pcc_try_dataset_attach(struct inode *inode, __u32 gen, GOTO(out, rc = 0); pcc_dentry = path.dentry; -#ifndef HAVE_VFS_SETXATTR - if (!pcc_dentry->d_inode->i_op->getxattr) - /* ignore this error */ - GOTO(out_put_path, rc = 0); - - rc = pcc_dentry->d_inode->i_op->getxattr(pcc_dentry, pcc_xattr_layout, - &pcc_gen, sizeof(pcc_gen)); -#else - rc = __vfs_getxattr(pcc_dentry, pcc_dentry->d_inode, pcc_xattr_layout, - &pcc_gen, sizeof(pcc_gen)); -#endif - + rc = ll_vfs_getxattr(pcc_dentry, pcc_dentry->d_inode, pcc_xattr_layout, + &pcc_gen, sizeof(pcc_gen)); if (rc < 0) /* ignore this error */ GOTO(out_put_path, rc = 0); diff --git a/lustre/llite/xattr_security.c b/lustre/llite/xattr_security.c index f1c1ed9..94679b8 100644 --- a/lustre/llite/xattr_security.c +++ b/lustre/llite/xattr_security.c @@ -115,8 +115,8 @@ ll_initxattrs(struct inode *inode, const struct xattr *xattr_array, break; } - err = __vfs_setxattr(dentry, inode, full_name, xattr->value, - xattr->value_len, XATTR_CREATE); + err = ll_vfs_setxattr(dentry, inode, full_name, xattr->value, + xattr->value_len, XATTR_CREATE); kfree(full_name); if (err < 0) break; diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index e0c1337..8d8d8b4 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -4411,7 +4411,7 @@ static int osd_xattr_set_pfid(const struct lu_env *env, struct osd_object *obj, /* Remove old PFID EA entry firstly. */ dquot_initialize(inode); - rc = osd_removexattr(dentry, inode, XATTR_NAME_FID); + rc = ll_vfs_removexattr(dentry, inode, XATTR_NAME_FID); if (rc == -ENODATA) { if ((fl & LU_XATTR_REPLACE) && !(fl & LU_XATTR_CREATE)) RETURN(rc); @@ -4717,7 +4717,7 @@ static int osd_xattr_del(const struct lu_env *env, struct dt_object *dt, dquot_initialize(inode); dentry->d_inode = inode; dentry->d_sb = inode->i_sb; - rc = osd_removexattr(dentry, inode, name); + rc = ll_vfs_removexattr(dentry, inode, name); } osd_trans_exec_check(env, handle, OSD_OT_XATTR_SET); diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index 7c47013..6c62ca4 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -711,22 +711,6 @@ extern int ldiskfs_pdo; #define DECLARE_BVEC_ITER_ALL(iter) int iter #endif -#ifndef HAVE_VFS_SETXATTR -#define osd_setxattr(dentry, inode, name, buf, len, flag) \ - ((inode)->i_op->setxattr(dentry, name, buf, len, flag)) -#define osd_getxattr(dentry, inode, name, buf, len) \ - ((inode)->i_op->getxattr(dentry, name, buf, len)) -#define osd_removexattr(dentry, inode, name) \ - ((inode)->i_op->removexattr(dentry, name)) -#else /* HAVE_VFS_SETXATTR */ -#define osd_setxattr(dentry, inode, name, buf, len, flag) \ - __vfs_setxattr(dentry, inode, name, buf, len, flag) -#define osd_getxattr(dentry, inode, name, buf, len) \ - __vfs_getxattr(dentry, inode, name, buf, len) -#define osd_removexattr(dentry, inode, name) \ - __vfs_removexattr(dentry, name) -#endif /* !HAVE_VFS_SETXATTR */ - static inline int __osd_xattr_get(struct inode *inode, struct dentry *dentry, const char *name, void *buf, int len) { @@ -735,7 +719,7 @@ static inline int __osd_xattr_get(struct inode *inode, struct dentry *dentry, dentry->d_inode = inode; dentry->d_sb = inode->i_sb; - return osd_getxattr(dentry, inode, name, buf, len); + return ll_vfs_getxattr(dentry, inode, name, buf, len); } static inline int __osd_xattr_set(struct osd_thread_info *info, @@ -747,7 +731,7 @@ static inline int __osd_xattr_set(struct osd_thread_info *info, dquot_initialize(inode); dentry->d_inode = inode; dentry->d_sb = inode->i_sb; - return osd_setxattr(dentry, inode, name, buf, buflen, fl); + return ll_vfs_setxattr(dentry, inode, name, buf, buflen, fl); } #ifdef CONFIG_PROC_FS diff --git a/lustre/osd-ldiskfs/osd_scrub.c b/lustre/osd-ldiskfs/osd_scrub.c index c81ba1b..ed25083 100644 --- a/lustre/osd-ldiskfs/osd_scrub.c +++ b/lustre/osd-ldiskfs/osd_scrub.c @@ -208,7 +208,7 @@ osd_scrub_convert_ff(struct osd_thread_info *info, struct osd_device *dev, if (rc == sizeof(*ff)) { /* 2) delete the old XATTR_NAME_FID */ dquot_initialize(inode); - rc = osd_removexattr(dentry, inode, XATTR_NAME_FID); + rc = ll_vfs_removexattr(dentry, inode, XATTR_NAME_FID); if (rc) GOTO(stop, rc); -- 1.8.3.1