From ccf88f2894b6b4af3a2fda7865acec989e55a7f4 Mon Sep 17 00:00:00 2001 From: YangXin <245051644@qq.com> Date: Mon, 15 Aug 2022 10:19:01 +0800 Subject: [PATCH 1/3] Add aarch64 compile support. Signed-off-by: YangXin <245051644@qq.com> --- qtfs/qtfs/syscall.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/qtfs/qtfs/syscall.c b/qtfs/qtfs/syscall.c index c83270f..907c472 100644 --- a/qtfs/qtfs/syscall.c +++ b/qtfs/qtfs/syscall.c @@ -9,10 +9,22 @@ #include "conn.h" #include "qtfs-mod.h" + static long qtfs_remote_mount(char __user *dev_name, char __user *dir_name, char __user *type, unsigned long flags, void __user *data); static int qtfs_remote_umount(char __user *name, int flags); +#ifdef __aarch64__ +static struct kprobe kp = { + .symbol_name = "kallsyms_lookup_name" +}; +typedef unsigned long (*kallsyms_lookup_name_t)(const char *name); +extern unsigned long kallsyms_lookup_name(const char *name); +void (*update_mapping_prot)(phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot); +unsigned long start_rodata, end_rodata; +#define section_size (end_rodata - start_rodata) +#endif + static char *qtfs_copy_mount_string(const void __user *data) { return data ? strndup_user(data, PATH_MAX) : NULL; @@ -260,18 +272,29 @@ __SYSCALL_DEFINEx(2, _qtfs_umount, char __user *, name, int, flags) // make the page writable int make_rw(unsigned long address) { +#ifdef __x86_64__ unsigned int level; pte_t *pte = lookup_address(address, &level); pte->pte |= _PAGE_RW; +#endif +#ifdef __aarch64__ + update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL); +#endif return 0; } // make the page write protected int make_ro(unsigned long address) { +#ifdef __x86_64__ unsigned int level; pte_t *pte = lookup_address(address, &level); pte->pte &= ~_PAGE_RW; +#endif + +#ifdef __aarch64__ + update_mapping_prot(__pa_symbol(start_rodata), (unsigned long)start_rodata, section_size, PAGE_KERNEL_RO); +#endif return 0; } @@ -486,6 +509,9 @@ static unsigned long *qtfs_oldsyscall_epoll_ctl = NULL; int qtfs_syscall_init(void) { +#ifdef __aarch64__ + kallsyms_lookup_name_t kallsyms_lookup_name; +#endif qtfs_debug("qtfs use my_mount instead of mount:0x%lx umount:0x%lx\n", (unsigned long)qtfs_kern_syms.sys_call_table[__NR_mount], (unsigned long)qtfs_kern_syms.sys_call_table[__NR_umount2]); qtfs_debug("qtfs use my_epoll_ctl instead of epoll_ctl:0x%lx\n", @@ -500,6 +526,13 @@ int qtfs_syscall_init(void) qtfs_kern_syms.sys_call_table[__NR_epoll_ctl] = (unsigned long *)__x64_sys_qtfs_epoll_ctl; #endif #ifdef __aarch64__ + register_kprobe(&kp); + kallsyms_lookup_name = (kallsyms_lookup_name_t) kp.addr; + unregister_kprobe(&kp); + update_mapping_prot = (void *)kallsyms_lookup_name("update_mapping_prot"); + start_rodata = (unsigned long)kallsyms_lookup_name("__start_rodata"); + end_rodata= (unsigned long)kallsyms_lookup_name("__end_rodata"); + qtfs_kern_syms.sys_call_table[__NR_mount] = (unsigned long *)__arm64_sys_qtfs_mount; qtfs_kern_syms.sys_call_table[__NR_umount2] = (unsigned long *)__arm64_sys_qtfs_umount; qtfs_kern_syms.sys_call_table[__NR_epoll_ctl] = (unsigned long *)__arm64_sys_qtfs_epoll_ctl; -- Gitee From c9146de2c247e8234899f1cf61e977c6be294c1a Mon Sep 17 00:00:00 2001 From: YangXin <245051644@qq.com> Date: Mon, 15 Aug 2022 10:19:28 +0800 Subject: [PATCH 2/3] Enable compiling driver to 5.10 kernel on machine without 5.10 kernel. Signed-off-by: YangXin <245051644@qq.com> --- qtfs/qtfs/Makefile | 2 +- qtfs/qtfs_server/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/qtfs/qtfs/Makefile b/qtfs/qtfs/Makefile index f3c6014..fb6a51e 100644 --- a/qtfs/qtfs/Makefile +++ b/qtfs/qtfs/Makefile @@ -1,5 +1,5 @@ ccflags-y += -I$(src)/../ -I$(src) -DQTFS_CLIENT -KBUILD=/lib/modules/$(shell uname -r)/build/ +KBUILD=/lib/modules/5.10*/build/ obj-m:=qtfs.o qtfs-objs:=qtfs-mod.o sb.o syscall.o ../conn.o xattr.o proc.o ../misc.o miss.o diff --git a/qtfs/qtfs_server/Makefile b/qtfs/qtfs_server/Makefile index c1c5ef6..13f9c3e 100644 --- a/qtfs/qtfs_server/Makefile +++ b/qtfs/qtfs_server/Makefile @@ -1,5 +1,5 @@ ccflags-y += -I$(src)/../ -I$(src) -DQTFS_SERVER -KBUILD=/lib/modules/$(shell uname -r)/build/ +KBUILD=/lib/modules/5.10*/build/ obj-m:=qtfs_server.o qtfs_server-objs:=../conn.o fsops.o qtfs-server.o ../misc.o -- Gitee From a8c013b5ffb8f9de3565c6596b67fe9d4225e0cf Mon Sep 17 00:00:00 2001 From: YangXin <245051644@qq.com> Date: Mon, 15 Aug 2022 10:30:47 +0800 Subject: [PATCH 3/3] Fix error when mount devname is not a system path. Signed-off-by: YangXin <245051644@qq.com> --- qtfs/qtfs/syscall.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/qtfs/qtfs/syscall.c b/qtfs/qtfs/syscall.c index 907c472..a83e025 100644 --- a/qtfs/qtfs/syscall.c +++ b/qtfs/qtfs/syscall.c @@ -300,15 +300,18 @@ int make_ro(unsigned long address) int qtfs_dir_to_qtdir(char *dir, char *qtdir) { - int ret; + int ret = 0; struct path path; ret = kern_path(dir, LOOKUP_FOLLOW, &path); if (ret) { - qtfs_err("qtfs dir to qtdir failed, ret: %d\n", ret); - return ret; + strcpy(qtdir, dir); + return 0; + } + if (strcmp(path.mnt->mnt_sb->s_type->name, QTFS_FSTYPE_NAME)) { + strcpy(qtdir, dir); + } else { + ret = qtfs_fullname(qtdir, path.dentry); } - - ret = qtfs_fullname(qtdir, path.dentry); path_put(&path); return ret; } -- Gitee