diff --git a/kmod/src/Makefile.kernelcompat b/kmod/src/Makefile.kernelcompat index b781eea4..97840bf5 100644 --- a/kmod/src/Makefile.kernelcompat +++ b/kmod/src/Makefile.kernelcompat @@ -149,3 +149,12 @@ endif ifneq (,$(shell grep 'struct backing_dev_info.*backing_dev_info' include/linux/fs.h)) ccflags-y += -DKC_LINUX_BACKING_DEV_INFO=1 endif + +# +# v4.3-9290-ge409de992e3e +# +# xattr handlers are now passed a struct that contains `flags` +# +ifneq (,$(shell grep 'int...get..const struct xattr_handler.*struct dentry.*dentry,' include/linux/xattr.h)) +ccflags-y += -DKC_XATTR_STRUCT_XATTR_HANDLER=1 +endif diff --git a/kmod/src/acl.c b/kmod/src/acl.c index 6b43d8cc..93188f9d 100644 --- a/kmod/src/acl.c +++ b/kmod/src/acl.c @@ -218,10 +218,17 @@ int scoutfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) scoutfs_unlock(sb, lock, SCOUTFS_LOCK_WRITE); return ret; } - +#ifdef KC_XATTR_STRUCT_XATTR_HANDLER +int scoutfs_acl_get_xattr(const struct xattr_handler *handler, struct dentry *dentry, + struct inode *inode, const char *name, void *value, + size_t size) +{ + int type = handler->flags; +#else int scoutfs_acl_get_xattr(struct dentry *dentry, const char *name, void *value, size_t size, int type) { +#endif struct posix_acl *acl; int ret = 0; @@ -240,9 +247,17 @@ int scoutfs_acl_get_xattr(struct dentry *dentry, const char *name, void *value, return ret; } +#ifdef KC_XATTR_STRUCT_XATTR_HANDLER +int scoutfs_acl_set_xattr(const struct xattr_handler *handler, struct dentry *dentry, + struct inode *inode, const char *name, const void *value, + size_t size, int flags) +{ + int type = handler->flags; +#else int scoutfs_acl_set_xattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags, int type) { +#endif struct posix_acl *acl = NULL; int ret; diff --git a/kmod/src/acl.h b/kmod/src/acl.h index a9235eb5..1712b7e8 100644 --- a/kmod/src/acl.h +++ b/kmod/src/acl.h @@ -6,10 +6,19 @@ struct posix_acl *scoutfs_get_acl_locked(struct inode *inode, int type, struct s int scoutfs_set_acl(struct inode *inode, struct posix_acl *acl, int type); int scoutfs_set_acl_locked(struct inode *inode, struct posix_acl *acl, int type, struct scoutfs_lock *lock, struct list_head *ind_locks); +#ifdef KC_XATTR_STRUCT_XATTR_HANDLER +int scoutfs_acl_get_xattr(const struct xattr_handler *, struct dentry *dentry, + struct inode *inode, const char *name, void *value, + size_t size); +int scoutfs_acl_set_xattr(const struct xattr_handler *, struct dentry *dentry, + struct inode *inode, const char *name, const void *value, + size_t size, int flags); +#else int scoutfs_acl_get_xattr(struct dentry *dentry, const char *name, void *value, size_t size, int type); int scoutfs_acl_set_xattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags, int type); +#endif int scoutfs_acl_chmod_locked(struct inode *inode, struct iattr *attr, struct scoutfs_lock *lock, struct list_head *ind_locks); int scoutfs_init_acl_locked(struct inode *inode, struct inode *dir, diff --git a/kmod/src/xattr.c b/kmod/src/xattr.c index abdf8e0b..75fc35b4 100644 --- a/kmod/src/xattr.c +++ b/kmod/src/xattr.c @@ -850,6 +850,7 @@ unlock: return ret; } +#ifndef KC_XATTR_STRUCT_XATTR_HANDLER /* * Future kernels have this amazing hack to rewind the name to get the * skipped prefix. We're back in the stone ages without the handler @@ -857,22 +858,41 @@ unlock: * compat hook to either call the kernel's xattr_full_name(handler), or * our hack to use the flags as the prefix length. */ -static const char *full_name_hack(void *handler, const char *name, int len) +static const char *full_name_hack(const char *name, int len) { return name - len; } +#endif -static int scoutfs_xattr_get_handler(struct dentry *dentry, const char *name, - void *value, size_t size, int handler_flags) +static int scoutfs_xattr_get_handler +#ifdef KC_XATTR_STRUCT_XATTR_HANDLER + (const struct xattr_handler *handler, struct dentry *dentry, + struct inode *inode, const char *name, void *value, + size_t size) { - name = full_name_hack(NULL, name, handler_flags); + name = xattr_full_name(handler, name); +#else + (struct dentry *dentry, const char *name, + void *value, size_t size, int handler_flags) +{ + name = full_name_hack(name, handler_flags); +#endif return scoutfs_xattr_get(dentry, name, value, size); } -static int scoutfs_xattr_set_handler(struct dentry *dentry, const char *name, - const void *value, size_t size, int flags, int handler_flags) +static int scoutfs_xattr_set_handler +#ifdef KC_XATTR_STRUCT_XATTR_HANDLER + (const struct xattr_handler *handler, struct dentry *dentry, + struct inode *inode, const char *name, const void *value, + size_t size, int flags) { - name = full_name_hack(NULL, name, handler_flags); + name = xattr_full_name(handler, name); +#else + (struct dentry *dentry, const char *name, + const void *value, size_t size, int flags, int handler_flags) +{ + name = full_name_hack(name, handler_flags); +#endif return scoutfs_xattr_set(dentry, name, value, size, flags); }