X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flustre_compat.h;h=0c0b3ba851d5641b4984aff1d9b667945435320a;hb=refs%2Fchanges%2F45%2F36245%2F2;hp=df20146d716cf3c9f118658ce9b2fd554243dcc4;hpb=65a8ff5fbe8ca014bd01150ab102d8aa43f78cff;p=fs%2Flustre-release.git diff --git a/lustre/include/lustre_compat.h b/lustre/include/lustre_compat.h index df20146..0c0b3ba 100644 --- a/lustre/include/lustre_compat.h +++ b/lustre/include/lustre_compat.h @@ -38,78 +38,19 @@ #include #include #include +#include #include #include #include #include +#include #include -#include #include -#ifdef HAVE_FS_STRUCT_RWLOCK -# define LOCK_FS_STRUCT(fs) write_lock(&(fs)->lock) -# define UNLOCK_FS_STRUCT(fs) write_unlock(&(fs)->lock) -#else -# define LOCK_FS_STRUCT(fs) spin_lock(&(fs)->lock) -# define UNLOCK_FS_STRUCT(fs) spin_unlock(&(fs)->lock) -#endif - -#ifdef HAVE_FS_STRUCT_SEQCOUNT -# define WRITE_FS_SEQ_BEGIN(fs) write_seqcount_begin(&(fs)->seq) -# define WRITE_FS_SEQ_END(fs) write_seqcount_end(&(fs)->seq) -#else -# define WRITE_FS_SEQ_BEGIN(fs) -# define WRITE_FS_SEQ_END(fs) -#endif -static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, - struct dentry *dentry) -{ - struct path path; - struct path old_pwd; - - path.mnt = mnt; - path.dentry = dentry; - path_get(&path); - LOCK_FS_STRUCT(fs); - WRITE_FS_SEQ_BEGIN(fs); - old_pwd = fs->pwd; - fs->pwd = path; - WRITE_FS_SEQ_END(fs); - UNLOCK_FS_STRUCT(fs); - - if (old_pwd.dentry) - path_put(&old_pwd); -} - #define current_ngroups current_cred()->group_info->ngroups #define current_groups current_cred()->group_info->small_block -/* - * OBD need working random driver, thus all our - * initialization routines must be called after device - * driver initialization - */ -#ifndef MODULE -#undef module_init -#define module_init(a) late_initcall(a) -#endif - -#ifndef MODULE_ALIAS_FS -#define MODULE_ALIAS_FS(name) -#endif - -#ifdef HAVE_GENERIC_PERMISSION_2ARGS -# define ll_generic_permission(inode, mask, flags, check_acl) \ - generic_permission(inode, mask) -#elif defined HAVE_GENERIC_PERMISSION_4ARGS -# define ll_generic_permission(inode, mask, flags, check_acl) \ - generic_permission(inode, mask, flags, check_acl) -#else -# define ll_generic_permission(inode, mask, flags, check_acl) \ - generic_permission(inode, mask, check_acl) -#endif - #ifdef HAVE_4ARGS_VFS_SYMLINK #define ll_vfs_symlink(dir, dentry, mnt, path, mode) \ vfs_symlink(dir, dentry, path, mode) @@ -134,18 +75,6 @@ static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, # define inode_dio_write_done(i) up_write(&(i)->i_alloc_sem) #endif -#ifndef FS_HAS_FIEMAP -#define FS_HAS_FIEMAP (0) -#endif - -#ifndef HAVE_SIMPLE_SETATTR -#define simple_setattr(dentry, ops) inode_setattr((dentry)->d_inode, ops) -#endif - -#ifndef SLAB_DESTROY_BY_RCU -#define SLAB_DESTROY_BY_RCU 0 -#endif - #ifndef HAVE_INIT_LIST_HEAD_RCU static inline void INIT_LIST_HEAD_RCU(struct list_head *list) { @@ -154,22 +83,6 @@ static inline void INIT_LIST_HEAD_RCU(struct list_head *list) } #endif -#ifndef HAVE_DQUOT_SUSPEND -# define ll_vfs_dq_init vfs_dq_init -# define ll_vfs_dq_drop vfs_dq_drop -# define ll_vfs_dq_transfer vfs_dq_transfer -# define ll_vfs_dq_off(sb, remount) vfs_dq_off(sb, remount) -#else -# define ll_vfs_dq_init dquot_initialize -# define ll_vfs_dq_drop dquot_drop -# define ll_vfs_dq_transfer dquot_transfer -# define ll_vfs_dq_off(sb, remount) dquot_suspend(sb, -1) -#endif - -#ifndef HAVE_BLKDEV_GET_BY_DEV -# define blkdev_get_by_dev(dev, mode, holder) open_by_devnum(dev, mode) -#endif - #ifdef HAVE_BVEC_ITER #define bio_idx(bio) (bio->bi_iter.bi_idx) #define bio_set_sector(bio, sector) (bio->bi_iter.bi_sector = sector) @@ -190,23 +103,6 @@ static inline void INIT_LIST_HEAD_RCU(struct list_head *list) #define bio_start_sector(bio) (bio->bi_sector) #endif -#ifndef HAVE_BLK_QUEUE_MAX_SEGMENTS -#define blk_queue_max_segments(rq, seg) \ - do { blk_queue_max_phys_segments(rq, seg); \ - blk_queue_max_hw_segments(rq, seg); } while (0) -#else -#define queue_max_phys_segments(rq) queue_max_segments(rq) -#define queue_max_hw_segments(rq) queue_max_segments(rq) -#endif - -#ifdef HAVE_BLK_PLUG -#define DECLARE_PLUG(plug) struct blk_plug plug -#else /* !HAVE_BLK_PLUG */ -#define DECLARE_PLUG(name) -#define blk_start_plug(plug) do {} while (0) -#define blk_finish_plug(plug) do {} while (0) -#endif - #ifdef HAVE_KMAP_ATOMIC_HAS_1ARG #define ll_kmap_atomic(a, b) kmap_atomic(a) #define ll_kunmap_atomic(a, b) kunmap_atomic(a) @@ -250,6 +146,13 @@ static inline void INIT_LIST_HEAD_RCU(struct list_head *list) #define DECLARE_LL_D_HLIST_NODE_PTR(name) /* nothing */ #endif /* !DATA_FOR_LLITE_IS_LIST */ +#ifndef HAVE_D_IN_LOOKUP +static inline int d_in_lookup(struct dentry *dentry) +{ + return false; +} +#endif + #ifndef QUOTA_OK # define QUOTA_OK 0 #endif @@ -323,6 +226,10 @@ static inline void set_nlink(struct inode *inode, unsigned int nlink) # define ll_umode_t int #endif +#ifndef HAVE_VM_FAULT_T +#define vm_fault_t int +#endif + #include #ifndef HAVE_D_MAKE_ROOT static inline struct dentry *d_make_root(struct inode *root) @@ -375,6 +282,37 @@ static inline struct inode *file_inode(const struct file *file) #define ll_vfs_unlink(a, b) vfs_unlink(a, b) #endif +#ifndef HAVE_INODE_OWNER_OR_CAPABLE +#define inode_owner_or_capable(inode) is_owner_or_cap(inode) +#endif + +static inline int ll_vfs_getattr(struct path *path, struct kstat *st) +{ + int rc; + +#ifdef HAVE_INODEOPS_ENHANCED_GETATTR + rc = vfs_getattr(path, st, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); +#elif defined HAVE_VFS_GETATTR_2ARGS + rc = vfs_getattr(path, st); +#else + rc = vfs_getattr(path->mnt, path->dentry, st); +#endif + return rc; +} + +#ifndef HAVE_D_IS_POSITIVE +static inline bool d_is_positive(const struct dentry *dentry) +{ + return dentry->d_inode != NULL; +} +#endif + +#ifdef HAVE_VFS_CREATE_USE_NAMEIDATA +# define LL_VFS_CREATE_FALSE NULL +#else +# define LL_VFS_CREATE_FALSE false +#endif + #ifndef HAVE_INODE_LOCK # define inode_lock(inode) mutex_lock(&(inode)->i_mutex) # define inode_unlock(inode) mutex_unlock(&(inode)->i_mutex) @@ -455,17 +393,9 @@ static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr) #endif #ifdef HAVE_IOP_XATTR -#ifdef HAVE_XATTR_HANDLER_FLAGS #define ll_setxattr generic_setxattr #define ll_getxattr generic_getxattr #define ll_removexattr generic_removexattr -#else -int ll_setxattr(struct dentry *dentry, const char *name, - const void *value, size_t size, int flags); -ssize_t ll_getxattr(struct dentry *dentry, const char *name, - void *buf, size_t buf_size); -int ll_removexattr(struct dentry *dentry, const char *name); -#endif /* ! HAVE_XATTR_HANDLER_FLAGS */ #endif /* HAVE_IOP_XATTR */ #ifndef HAVE_VFS_SETXATTR @@ -475,7 +405,6 @@ static inline int __vfs_setxattr(struct dentry *dentry, struct inode *inode, const char *name, const void *value, size_t size, int flags) { -# ifdef HAVE_XATTR_HANDLER_FLAGS const struct xattr_handler *handler; int rc; @@ -491,14 +420,25 @@ __vfs_setxattr(struct dentry *dentry, struct inode *inode, const char *name, rc = handler->set(dentry, name, value, size, flags, handler->flags); # endif /* !HAVE_XATTR_HANDLER_INODE_PARAM */ return rc; -# else /* !HAVE_XATTR_HANDLER_FLAGS */ - return ll_setxattr(dentry, name, value, size, flags); -# endif /* HAVE_XATTR_HANDLER_FLAGS */ } #endif /* HAVE_VFS_SETXATTR */ +#ifndef HAVE_POSIXACL_USER_NS +/* + * Mask out &init_user_ns so we don't jump + * through hoops to define it somehow only + * to have it ignored anyway. + */ +#define posix_acl_from_xattr(a, b, c) posix_acl_from_xattr(b, c) +#define posix_acl_to_xattr(a, b, c, d) posix_acl_to_xattr(b, c, d) +#endif + +#ifndef HAVE_POSIX_ACL_VALID_USER_NS +#define posix_acl_valid(a,b) posix_acl_valid(b) +#endif + #ifdef HAVE_IOP_SET_ACL -#ifdef CONFIG_FS_POSIX_ACL +#ifdef CONFIG_LUSTRE_FS_POSIX_ACL #ifndef HAVE_POSIX_ACL_UPDATE_MODE static inline int posix_acl_update_mode(struct inode *inode, umode_t *mode_p, struct posix_acl **acl) @@ -540,11 +480,24 @@ static inline bool is_sxid(umode_t mode) #define IS_NOSEC(inode) (!is_sxid(inode->i_mode)) #endif -#ifndef MS_NOSEC -static inline void inode_has_no_xattr(struct inode *inode) -{ - return; -} +/* + * mount MS_* flags split from superblock SB_* flags + * if the SB_* flags are not available use the MS_* flags + */ +#if !defined(SB_RDONLY) && defined(MS_RDONLY) +# define SB_RDONLY MS_RDONLY +#endif +#if !defined(SB_ACTIVE) && defined(MS_ACTIVE) +# define SB_ACTIVE MS_ACTIVE +#endif +#if !defined(SB_NOSEC) && defined(MS_NOSEC) +# define SB_NOSEC MS_NOSEC +#endif +#if !defined(SB_POSIXACL) && defined(MS_POSIXACL) +# define SB_POSIXACL MS_POSIXACL +#endif +#if !defined(SB_NODIRATIME) && defined(MS_NODIRATIME) +# define SB_NODIRATIME MS_NODIRATIME #endif #ifndef HAVE_FILE_OPERATIONS_READ_WRITE_ITER @@ -695,11 +648,15 @@ static inline struct timespec current_time(struct inode *inode) #define alloc_workqueue(name, flags, max_active) create_workqueue(name) #endif +#ifndef smp_store_mb +#define smp_store_mb(var, value) set_mb(var, value) +#endif + #ifndef READ_ONCE #define READ_ONCE ACCESS_ONCE #endif -#ifdef HAVE_BLK_INTEGRITY_ENABLED +#if IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY) static inline unsigned short blk_integrity_interval(struct blk_integrity *bi) { #ifdef HAVE_INTERVAL_EXP_BLK_INTEGRITY @@ -708,7 +665,7 @@ static inline unsigned short blk_integrity_interval(struct blk_integrity *bi) return bi->interval; #else return bi->sector_size; -#endif +#endif /* !HAVE_INTERVAL_EXP_BLK_INTEGRITY */ } static inline const char *blk_integrity_name(struct blk_integrity *bi) @@ -719,7 +676,16 @@ static inline const char *blk_integrity_name(struct blk_integrity *bi) return bi->name; #endif } + +static inline unsigned int bip_size(struct bio_integrity_payload *bip) +{ +#ifdef HAVE_BIP_ITER_BIO_INTEGRITY_PAYLOAD + return bip->bip_iter.bi_size; #else + return bip->bip_size; +#endif +} +#else /* !CONFIG_BLK_DEV_INTEGRITY */ static inline unsigned short blk_integrity_interval(struct blk_integrity *bi) { return 0; @@ -729,18 +695,8 @@ static inline const char *blk_integrity_name(struct blk_integrity *bi) /* gcc8 dislikes when strcmp() is called against NULL */ return ""; } -#endif - -static inline unsigned int bip_size(struct bio_integrity_payload *bip) -{ -#ifdef HAVE_BIP_ITER_BIO_INTEGRITY_PAYLOAD - return bip->bip_iter.bi_size; -#else - return bip->bip_size; -#endif -} +#endif /* !CONFIG_BLK_DEV_INTEGRITY */ -#ifdef HAVE_BLK_INTEGRITY_ENABLED #ifndef INTEGRITY_FLAG_READ #define INTEGRITY_FLAG_READ BLK_INTEGRITY_VERIFY #endif @@ -751,6 +707,7 @@ static inline unsigned int bip_size(struct bio_integrity_payload *bip) static inline bool bdev_integrity_enabled(struct block_device *bdev, int rw) { +#if IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY) struct blk_integrity *bi = bdev_get_integrity(bdev); if (bi == NULL) @@ -772,16 +729,11 @@ static inline bool bdev_integrity_enabled(struct block_device *bdev, int rw) if (rw == 1 && bi->generate_fn != NULL && (bi->flags & INTEGRITY_FLAG_WRITE)) return true; -#endif +#endif /* !HAVE_INTERVAL_EXP_BLK_INTEGRITY */ +#endif /* !CONFIG_BLK_DEV_INTEGRITY */ return false; } -#else -static inline bool bdev_integrity_enabled(struct block_device *bdev, int rw) -{ - return false; -} -#endif /* HAVE_BLK_INTEGRITY_ENABLED */ #ifdef HAVE_PAGEVEC_INIT_ONE_PARAM #define ll_pagevec_init(pvec, n) pagevec_init(pvec) @@ -789,4 +741,32 @@ static inline bool bdev_integrity_enabled(struct block_device *bdev, int rw) #define ll_pagevec_init(pvec, n) pagevec_init(pvec, n) #endif +#ifdef HAVE_D_COUNT +# define ll_d_count(d) d_count(d) +#else +# define ll_d_count(d) ((d)->d_count) +#endif /* HAVE_D_COUNT */ + +#ifndef HAVE_IN_COMPAT_SYSCALL +#define in_compat_syscall is_compat_task +#endif + +#ifdef HAVE_I_PAGES +#define page_tree i_pages +#else +#define i_pages tree_lock +#define xa_lock_irq(lockp) spin_lock_irq(lockp) +#define xa_unlock_irq(lockp) spin_unlock_irq(lockp) +#endif + +#ifndef KMEM_CACHE_USERCOPY +#define kmem_cache_create_usercopy(name, size, align, flags, useroffset, \ + usersize, ctor) \ + kmem_cache_create(name, size, align, flags, ctor) +#endif + +#ifndef HAVE_LINUX_SELINUX_IS_ENABLED +#define selinux_is_enabled() 1 +#endif + #endif /* _LUSTRE_COMPAT_H */