From 3a61da7f45ed992d0f57b4629ce97e5c890d1ff0 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Sun, 14 Sep 2025 10:00:14 +0800 Subject: [PATCH] Add vfs_getattr compatibility for kernels < 4.14 Co-authored-by: backslashxx <118538522+backslashxx@users.noreply.github.com> Signed-off-by: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> --- kernel/Makefile | 7 ++++++- kernel/throne_tracker.c | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/kernel/Makefile b/kernel/Makefile index e8093d91..4804fd51 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -105,7 +105,6 @@ ifeq ($(shell grep "ssize_t kernel_write" $(srctree)/fs/read_write.c | grep -q " ccflags-y += -DKSU_OPTIONAL_KERNEL_WRITE endif ifeq ($(shell grep -q "inode_security_struct\s\+\*selinux_inode" $(srctree)/security/selinux/include/objsec.h; echo $$?),0) -$(info -- KernelSU: kernel has selinux_inode.) ccflags-y += -DKSU_OPTIONAL_SELINUX_INODE endif ifeq ($(shell grep -q "int\s\+path_umount" $(srctree)/fs/namespace.c; echo $$?),0) @@ -121,6 +120,12 @@ ifeq ($(shell grep -q "SEC_SELINUX_PORTING_COMMON" $(srctree)/security/selinux/a ccflags-y += -DSAMSUNG_SELINUX_PORTING endif +# Check new vfs_getattr() +ifeq ($(shell grep -A1 "^int vfs_getattr" $(srctree)/fs/stat.c | grep -q "query_flags" ; echo $$?),0) +$(info -- KernelSU/compat: new vfs_getattr() found) +ccflags-y += -DKSU_HAS_NEW_VFS_GETATTR +endif + # Custom Signs ifdef KSU_EXPECTED_SIZE ccflags-y += -DEXPECTED_SIZE=$(KSU_EXPECTED_SIZE) diff --git a/kernel/throne_tracker.c b/kernel/throne_tracker.c index 8ad52a29..8cd0728a 100644 --- a/kernel/throne_tracker.c +++ b/kernel/throne_tracker.c @@ -304,8 +304,23 @@ FILLDIR_RETURN_TYPE user_data_actor(struct dir_context *ctx, const char *name, return FILLDIR_ACTOR_CONTINUE; } +/* +4.11, also backported on lineage common kernel 4.9 !! +int vfs_getattr(const struct path *path, struct kstat *stat, + u32 request_mask, unsigned int query_flags) + +4.10 +int vfs_getattr(struct path *path, struct kstat *stat) + +basically no mask and flags for =< 4.10 + +*/ struct kstat stat; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0) || defined(KSU_HAS_NEW_VFS_GETATTR) err = vfs_getattr(&path, &stat, STATX_UID, AT_STATX_SYNC_AS_STAT); +#else + err = vfs_getattr(&path, &stat); +#endif path_put(&path); if (err) {