#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 */
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;
{
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 */
* 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);
struct file *file;
unsigned int i;
int rc = 0, fd;
+ u64 u_inode;
if (copy_from_user(&request, uarg, sizeof(request)))
return -EFAULT;
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;