From e5b09ef6de79108adb1443303af04a419ace0e51 Mon Sep 17 00:00:00 2001 From: Nikita Shubin Date: Wed, 12 Mar 2025 15:35:18 +0300 Subject: [PATCH] guse: convert to use flag for device i_node Use flag for device inode to disnguish between line and config events. Signed-off-by: Nikita Shubin --- guse.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/guse.c b/guse.c index 510c52f..86a1d88 100644 --- a/guse.c +++ b/guse.c @@ -33,9 +33,10 @@ extern struct mnt_idmap invalid_mnt_idmap; #include "fuse_i.h" /* GUSE specific operations */ -#define GUSE_INIT 4097 - -#define GUSE_CONNTBL_LEN 64 +#define GUSE_INIT 4097 +#define GUSE_CONNTBL_LEN 64 +#define GUSE_DEVICE_INODE_FLAG BIT_ULL(63) +#define GUSE_DEVICE_INODE_MASK GENMASK_ULL(63, 0) struct guse_conn { struct list_head list; /* linked on guse_conntbl */ @@ -44,13 +45,8 @@ struct guse_conn { struct cdev *cdev; /* associated character device */ struct device *dev; /* device representing @cdev */ - /* - * Split inode into two parts: - * - device_inode is required for GPIO_V2_GET_LINEINFO_WATCH_IOCTL - * - linereq_inode required for individual GPIO_V2_GET_LINE_IOCTL - */ - u32 device_inode; - u32 linereq_inode; + /* device inode marked with GUSE_DEVICE_INODE_FLAG */ + u64 inode; /* init parameters, set once during initialization */ bool unrestricted_ioctl; @@ -124,7 +120,7 @@ static int guse_open(struct inode *inode, struct file *file) { dev_t devt = inode->i_cdev->dev; struct guse_conn *cc = NULL, *pos; - u64 u_inode = 0; + u64 u_inode; int rc; /* look up and get the connection */ @@ -144,7 +140,8 @@ static int guse_open(struct inode *inode, struct file *file) * Generic permission check is already done against the chrdev * file, proceed to open. */ - u_inode = (u64)(++cc->device_inode) << 32; + u_inode = (++cc->inode) & GUSE_DEVICE_INODE_MASK; + u_inode |= GUSE_DEVICE_INODE_FLAG; rc = fuse_do_open(&cc->fm, u_inode, file, 0); if (rc) fuse_conn_put(&cc->fc); @@ -203,6 +200,7 @@ static long guse_create_line_request(struct guse_conn *cc, unsigned long arg) struct file *file; unsigned int i; int rc = 0, fd; + u64 u_inode; if (copy_from_user(&request, uarg, sizeof(request))) return -EFAULT; @@ -216,7 +214,10 @@ static long guse_create_line_request(struct guse_conn *cc, unsigned long arg) file = anon_inode_getfile("[guse_line]", &guse_line_fops, NULL, O_RDONLY | O_CLOEXEC); - rc = fuse_do_open(&cc->fm, ++cc->linereq_inode, file, 0); + u_inode = (++cc->inode) & GUSE_DEVICE_INODE_MASK; + pr_err("%s: i_ino %lu, u_inode %llu\n", __func__, file->f_inode->i_ino, u_inode); + + rc = fuse_do_open(&cc->fm, u_inode, file, 0); if (rc) goto out_fail; -- 2.30.2