From 8e66cbde95f58c3a2a18351b81cae29bc69f760d Mon Sep 17 00:00:00 2001 From: Weifeng Su Date: Tue, 15 Aug 2023 07:06:03 +0000 Subject: [PATCH] Adapt for kernel 6.4 The file system inode ops need struct mnt_idmap parameter in kernel 6.4 Signed-off-by: Weifeng Su --- qtfs/qtfs/ops.h | 4 +++- qtfs/qtfs/proc.c | 8 ++++++-- qtfs/qtfs/sb.c | 35 +++++++++++++++++++++++++++-------- qtfs/qtfs/xattr.c | 32 ++++++++++++++++++++++++++++---- qtfs/qtfs_common/conn.c | 5 ++++- qtfs/qtfs_server/fsops.c | 25 +++++++++++++++++++------ 6 files changed, 87 insertions(+), 22 deletions(-) diff --git a/qtfs/qtfs/ops.h b/qtfs/qtfs/ops.h index 560be74..bdb2628 100644 --- a/qtfs/qtfs/ops.h +++ b/qtfs/qtfs/ops.h @@ -29,7 +29,9 @@ bool is_sb_proc(struct super_block *sb); struct inode *qtfs_iget(struct super_block *sb, struct inode_info *ii); const char *qtfs_getlink(struct dentry *dentry, struct inode *inode, struct delayed_call *done); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_getattr(struct mnt_idmap *idmap, const struct path *, struct kstat *, u32, unsigned int); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_getattr(struct user_namespace *mnt_userns, const struct path *, struct kstat *, u32, unsigned int); #else int qtfs_getattr(const struct path *, struct kstat *, u32, unsigned int); diff --git a/qtfs/qtfs/proc.c b/qtfs/qtfs/proc.c index e56bd8c..70238ea 100644 --- a/qtfs/qtfs/proc.c +++ b/qtfs/qtfs/proc.c @@ -26,7 +26,9 @@ struct dentry *qtfs_proc_lookup(struct inode *parent_inode, struct dentry *child_dentry, unsigned int flags); const char *qtfs_proc_getlink(struct dentry *dentry, struct inode *inode, struct delayed_call *done); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_proc_getattr(struct mnt_idmap *idmap, const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_proc_getattr(struct user_namespace *mnt_userns, const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags); #else int qtfs_proc_getattr(const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags); @@ -240,7 +242,9 @@ link_local: return link; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_proc_getattr(struct mnt_idmap *idmap, const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_proc_getattr(struct user_namespace *mnt_userns, const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags) #else int qtfs_proc_getattr(const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags) diff --git a/qtfs/qtfs/sb.c b/qtfs/qtfs/sb.c index fa3b5ac..faafa76 100644 --- a/qtfs/qtfs/sb.c +++ b/qtfs/qtfs/sb.c @@ -907,7 +907,9 @@ int qtfs_new_entry(struct inode *inode, struct dentry *dentry) return 0; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_mkdir(struct mnt_idmap *mnt_userns, struct inode *dir, struct dentry *dentry, umode_t mode) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_mkdir(struct user_namespace *mnt_userns, struct inode *dir, struct dentry *dentry, umode_t mode) #else int qtfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) @@ -946,7 +948,9 @@ int qtfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) return ret; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_create(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, umode_t mode, bool excl) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_create(struct user_namespace *mnt_userns, struct inode *dir, struct dentry *dentry, umode_t mode, bool excl) #else int qtfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool excl) @@ -990,7 +994,9 @@ int qtfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool exc return ret ? ret : ret2; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_mknod(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_mknod(struct user_namespace *mnt_userns, struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) #else int qtfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) @@ -1258,7 +1264,9 @@ err_end: return error; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_symlink(struct mnt_idmap *idmap, struct inode *dir, struct dentry *dentry, const char *symname) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_symlink(struct user_namespace *mnt_userns, struct inode *dir, struct dentry *dentry, const char *symname) #else int qtfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) @@ -1307,7 +1315,9 @@ err_end: return error; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_getattr(struct mnt_idmap *idmap, const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_getattr(struct user_namespace *mnt_userns, const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags) #else int qtfs_getattr(const struct path *path, struct kstat *stat, u32 req_mask, unsigned int flags) @@ -1360,7 +1370,9 @@ int qtfs_getattr(const struct path *path, struct kstat *stat, u32 req_mask, unsi return 0; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, struct iattr *attr) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry, struct iattr *attr) #else int qtfs_setattr(struct dentry *dentry, struct iattr *attr) @@ -1463,7 +1475,12 @@ const char *qtfs_getlink(struct dentry *dentry, qtfs_conn_put_param(pvar); return link; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +int qtfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, + struct dentry *old_dentry, struct inode *new_dir, + struct dentry *new_dentry, unsigned int flags) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) int qtfs_rename(struct user_namespace *mnt_userns, struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry, unsigned int flags) @@ -1604,7 +1621,9 @@ static int qtfs_fill_super(struct super_block *sb, void *priv_data, int silent) root_inode = new_inode(sb); root_inode->i_ino = 1; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) + inode_init_owner(&nop_mnt_idmap, root_inode, NULL, mode); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) inode_init_owner(&init_user_ns, root_inode, NULL, mode); #else inode_init_owner(root_inode, NULL, mode); diff --git a/qtfs/qtfs/xattr.c b/qtfs/qtfs/xattr.c index 3ba7704..4d15daf 100644 --- a/qtfs/qtfs/xattr.c +++ b/qtfs/qtfs/xattr.c @@ -73,7 +73,13 @@ static int qtfs_xattr_set(const struct xattr_handler *handler, size_t size, int flags); static int -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +qtfs_xattr_user_set(const struct xattr_handler *handler, + struct mnt_idmap *idmap, + struct dentry *unused, struct inode *inode, + const char *name, const void *value, + size_t size, int flags) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) qtfs_xattr_user_set(const struct xattr_handler *handler, struct user_namespace *mnt_userns, struct dentry *unused, struct inode *inode, @@ -91,7 +97,13 @@ qtfs_xattr_user_set(const struct xattr_handler *handler, } static int -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +qtfs_xattr_trusted_set(const struct xattr_handler *handler, + struct mnt_idmap *idmap, + struct dentry *unused, struct inode *inode, + const char *name, const void *value, + size_t size, int flags) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) qtfs_xattr_trusted_set(const struct xattr_handler *handler, struct user_namespace *mnt_userns, struct dentry *unused, struct inode *inode, @@ -108,7 +120,13 @@ qtfs_xattr_trusted_set(const struct xattr_handler *handler, } static int -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +qtfs_xattr_security_set(const struct xattr_handler *handler, + struct mnt_idmap *idmap, + struct dentry *unused, struct inode *inode, + const char *name, const void *value, + size_t size, int flags) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) qtfs_xattr_security_set(const struct xattr_handler *handler, struct user_namespace *mnt_userns, struct dentry *unused, struct inode *inode, @@ -270,7 +288,13 @@ const struct xattr_handler qtfs_xattr_security_handler = { #ifndef KVER_4_19 static int -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +qtfs_xattr_hurd_set(const struct xattr_handler *handler, + struct mnt_idmap *idmap, + struct dentry *unused, struct inode *inode, + const char *name, const void *value, + size_t size, int flags) +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) qtfs_xattr_hurd_set(const struct xattr_handler *handler, struct user_namespace *mnt_userns, struct dentry *unused, struct inode *inode, diff --git a/qtfs/qtfs_common/conn.c b/qtfs/qtfs_common/conn.c index 10b4cbe..cc59d52 100644 --- a/qtfs/qtfs_common/conn.c +++ b/qtfs/qtfs_common/conn.c @@ -167,8 +167,11 @@ int qtfs_uds_remote_connect_user(int fd, struct sockaddr __user *addr, int len) if (f.file == NULL) { return -EBADF; } - +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) + sock =sock_from_file(f.file); +#else sock = sock_from_file(f.file, &err); +#endif if (!sock) { goto end; } diff --git a/qtfs/qtfs_server/fsops.c b/qtfs/qtfs_server/fsops.c index 5485d04..5f3f779 100644 --- a/qtfs/qtfs_server/fsops.c +++ b/qtfs/qtfs_server/fsops.c @@ -30,7 +30,10 @@ #include #include #include -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) +#include +#include +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)) #include #endif @@ -860,7 +863,9 @@ static int handle_setattr(struct qtserver_arg *arg) } inode_lock(inode); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) + rsp->errno = notify_change(&nop_mnt_idmap, path.dentry, &req->attr, NULL); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) rsp->errno = notify_change(&init_user_ns, path.dentry, &req->attr, NULL); #else rsp->errno = notify_change(path.dentry, &req->attr, NULL); @@ -938,7 +943,9 @@ retry: req->mode &= ~current_umask(); error = security_path_mknod(&path, dent, req->mode, req->dev); if (!error) -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) + error = vfs_mknod(&nop_mnt_idmap, path.dentry->d_inode, dent, req->mode, req->dev); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) error = vfs_mknod(&init_user_ns, path.dentry->d_inode, dent, req->mode, req->dev); #else error = vfs_mknod(path.dentry->d_inode, dent, req->mode, req->dev); @@ -1046,7 +1053,9 @@ retry: qtfs_err("handle_symlink: newname(%s), oldname(%s) in kern_path_create %d\n", newname, oldname, error); return sizeof(struct qtrsp_symlink); } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) + rsp->errno = vfs_symlink(&nop_mnt_idmap, path.dentry->d_inode, dentry, oldname); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) rsp->errno = vfs_symlink(&init_user_ns, path.dentry->d_inode, dentry, oldname); #else rsp->errno = vfs_symlink(path.dentry->d_inode, dentry, oldname); @@ -1188,7 +1197,9 @@ int handle_xattrset(struct qtserver_arg *arg) path_put(&path); goto err_handle; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) + rsp->errno = vfs_setxattr(&nop_mnt_idmap, path.dentry, &req->buf[req->d.pathlen], &req->buf[req->d.pathlen + req->d.namelen], req->d.size, req->d.flags); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) rsp->errno = vfs_setxattr(&init_user_ns, path.dentry, &req->buf[req->d.pathlen], &req->buf[req->d.pathlen + req->d.namelen], req->d.size, req->d.flags); #else rsp->errno = vfs_setxattr(path.dentry, &req->buf[req->d.pathlen], &req->buf[req->d.pathlen + req->d.namelen], req->d.size, req->d.flags); @@ -1238,7 +1249,9 @@ int handle_xattrget(struct qtserver_arg *arg) goto err_handle; } } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) + error = vfs_getxattr(&nop_mnt_idmap, path.dentry, req->d.prefix_name, kvalue, req->d.size); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)) error = vfs_getxattr(&init_user_ns, path.dentry, req->d.prefix_name, kvalue, req->d.size); #else error = vfs_getxattr(path.dentry, req->d.prefix_name, kvalue, req->d.size); -- 2.33.0