diff --git a/kmod/src/Makefile.kernelcompat b/kmod/src/Makefile.kernelcompat index 1880905e..570be1e5 100644 --- a/kmod/src/Makefile.kernelcompat +++ b/kmod/src/Makefile.kernelcompat @@ -64,6 +64,15 @@ ifneq (,$(shell grep 'static inline bool RBNAME.*_compute_max' include/linux/rbt ccflags-y += -DKC_RB_TREE_AUGMENTED_COMPUTE_MAX endif +# +# v4.8-rc1-29-g31051c85b5e2 +# +# inode_change_ok() removed - replace with setattr_prepare() +# +ifneq (,$(shell grep 'extern int setattr_prepare' include/linux/fs.h)) +ccflags-y += -DKC_SETATTR_PREPARE +endif + # # v4.15-rc3-4-gae5e165d855d # diff --git a/kmod/src/inode.c b/kmod/src/inode.c index 414be4a5..6016c0d2 100644 --- a/kmod/src/inode.c +++ b/kmod/src/inode.c @@ -467,8 +467,7 @@ retry: SCOUTFS_LKF_REFRESH_INODE, inode, &lock); if (ret) return ret; - - ret = inode_change_ok(inode, attr); + ret = setattr_prepare(dentry, attr); if (ret) goto out; diff --git a/kmod/src/kernelcompat.h b/kmod/src/kernelcompat.h index 8b9a1c3b..1f6072e3 100644 --- a/kmod/src/kernelcompat.h +++ b/kmod/src/kernelcompat.h @@ -99,4 +99,13 @@ static inline int dir_emit_dots(struct file *file, void *dirent, #define d_materialise_unique(dentry, inode) d_splice_alias(inode, dentry) #endif +/* + * v4.8-rc1-29-g31051c85b5e2 + * + * fall back to inode_change_ok() if setattr_prepare() isn't available + */ +#ifndef KC_SETATTR_PREPARE +#define setattr_prepare(dentry, attr) inode_change_ok(d_inode(dentry), attr) +#endif + #endif