guse: convert to use flag for device i_node
authorNikita Shubin <n.shubin@yadro.com>
Wed, 12 Mar 2025 12:35:18 +0000 (15:35 +0300)
committerNikita Shubin <n.shubin@yadro.com>
Wed, 12 Mar 2025 12:35:18 +0000 (15:35 +0300)
Use flag for device inode to disnguish between line and config events.

Signed-off-by: Nikita Shubin <n.shubin@yadro.com>
guse.c

diff --git a/guse.c b/guse.c
index 510c52fbdb9455c9bcb6b55c8f6c5ddf9ec82f4f..86a1d885e2a96755d2a80fbebccffaacc504e40b 100644 (file)
--- 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;