[Devel] [PATCH VZ9 v2 4/4] fs/fuse kio: integrate pcs_krpc to kio module

Liu Kui kui.liu at virtuozzo.com
Tue Jul 2 18:26:09 MSK 2024


Enable pcs_krpc in kio module:
- add module parameter 'pcs_krpc_support' to indicate whether pcs_krpc
  is supported.
- export APIs to userspace as sub-commands of the FUSE_IOC_KIO_CALL
  ioctl command on the /dev/fuse device.

https://pmc.acronis.work/browse/VSTOR-82613

Signed-off-by: Liu Kui <kui.liu at virtuozzo.com>
---
 fs/fuse/dev.c                      | 19 ++++--
 fs/fuse/fuse_i.h                   |  2 +-
 fs/fuse/kio/pcs/pcs_cluster_core.c |  4 ++
 fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 94 +++++++++++++++++++++++++++++-
 fs/fuse/kio/pcs/pcs_ioctl.h        | 29 +++++++++
 5 files changed, 140 insertions(+), 8 deletions(-)

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index e4a153bcc82e..01df9d4e4e70 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -2658,11 +2658,20 @@ static long fuse_dev_ioctl(struct file *file, unsigned int cmd,
 
 		if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
 			return -EFAULT;
-		op = fuse_kio_get(NULL, req.name);
-		if (op == NULL)
-			return -EINVAL;
-		res = op->ioctl(NULL, NULL, req.cmd, req.data, req.len);
-		fuse_kio_put(op);
+
+		fud = fuse_get_dev(file);
+		if (fud) {
+			op = fud->fc->kio.op;
+			if (op == NULL)
+				return -EINVAL;
+			res = op->dev_ioctl(fud->fc, req.cmd, req.data, req.len);
+		} else {
+			op = fuse_kio_get(NULL, req.name);
+			if (op == NULL)
+				return -EINVAL;
+			res = op->ioctl(NULL, NULL, req.cmd, req.data, req.len);
+			fuse_kio_put(op);
+		}
 		break;
 	}
 	default:
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 0c1bd5209dbc..090871a1e356 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -649,7 +649,7 @@ struct fuse_kio_ops {
 	void (*inode_release)(struct fuse_inode *fi);
 	void (*kill_requests)(struct fuse_conn *fc, struct inode *inode);
 	int  (*ioctl)(struct file *file, struct inode *inode, unsigned int cmd, unsigned long arg, int len);
-
+	int  (*dev_ioctl)(struct fuse_conn *fc, unsigned int cmd, unsigned long arg, int len);
 };
 int fuse_register_kio(struct fuse_kio_ops *ops);
 void fuse_unregister_kio(struct fuse_kio_ops *ops);
diff --git a/fs/fuse/kio/pcs/pcs_cluster_core.c b/fs/fuse/kio/pcs/pcs_cluster_core.c
index 8c34c60eb79a..6df2ccee9a1f 100644
--- a/fs/fuse/kio/pcs/pcs_cluster_core.c
+++ b/fs/fuse/kio/pcs/pcs_cluster_core.c
@@ -162,6 +162,8 @@ int pcs_cc_init(struct pcs_cluster_core *cc, struct workqueue_struct *wq,
 	cc->nilbuffer_kv.iov_len = sizeof(cc->nilbuffer);
 
 	pcs_csset_init(&cc->css);
+	pcs_mrset_init(&cc->mrs);
+	pcs_krpcset_init(&cc->krpcs);
 
 	err = pcs_mapset_init(cc);
 	if (err)
@@ -210,6 +212,8 @@ int pcs_cc_init(struct pcs_cluster_core *cc, struct workqueue_struct *wq,
 
 void pcs_cc_fini(struct pcs_cluster_core *cc)
 {
+	pcs_krpcset_fini(&cc->krpcs);
+	pcs_mrset_fini(&cc->mrs);
 	pcs_csset_fini(&cc->css);
 	pcs_mapset_fini(&cc->maps);
 	pcs_rpc_engine_fini(&cc->eng);
diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
index d326cab39625..a0452bad1fd1 100644
--- a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
+++ b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
@@ -37,6 +37,8 @@
 #include "fuse_ktrace.h"
 #include "fuse_prometheus.h"
 #include "pcs_net_addr.h"
+#include "pcs_mr.h"
+#include "pcs_krpc.h"
 
 unsigned int pcs_loglevel = LOG_TRACE;
 module_param(pcs_loglevel, uint, 0644);
@@ -79,6 +81,10 @@ unsigned int cpu_worker_flags = 1;
 module_param(cpu_worker_flags, uint, 0444);
 MODULE_PARM_DESC(cpu_worker_flags, "Set cpu worker flags");
 
+bool pcs_krpc_support = true;
+module_param(pcs_krpc_support, bool, 0444);
+MODULE_PARM_DESC(pcs_krpc_support, "krpc support");
+
 #define sel_wq_flags(f) ((((f) & 1) ? WQ_CPU_INTENSIVE : 0) | (((f) & 2) ? WQ_UNBOUND : 0))
 
 void (*fuse_printk_plugin)(unsigned long, const char *, ...);
@@ -1876,6 +1882,84 @@ static int kpcs_ioctl(struct file *file, struct inode *inode, unsigned int cmd,
 	return res;
 }
 
+static int kpcs_dev_ioctl(struct fuse_conn *fc, unsigned int cmd, unsigned long arg, int len)
+{
+	struct pcs_fuse_cluster *pfc = fc->kio.ctx;
+	struct pcs_cluster_core *cc = &pfc->cc;
+	int res;
+
+	switch (cmd) {
+	case PCS_IOC_KRPC_CREATE:
+	{
+		struct pcs_ioc_krpc_create req;
+
+		if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+			return -EFAULT;
+
+		if (pcs_krpc_lookup(&cc->krpcs, &req.id))
+			return -EEXIST;
+
+		res = pcs_krpc_create(&cc->krpcs, &req.id, &req.addr, req.cs_flags);
+		break;
+	}
+	case PCS_IOC_KRPC_UPDATE_ADDR:
+	{
+		struct pcs_ioc_krpc_create req;
+
+		if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+			return -EFAULT;
+
+		res = pcs_krpc_update_addr(&cc->krpcs, &req.id, &req.addr, req.cs_flags);
+		break;
+	}
+
+	case PCS_IOC_KRPC_CONNECT:
+	{
+		struct pcs_ioc_krpc_connect req;
+
+		if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+			return -EFAULT;
+
+		res = pcs_krpc_connect(&cc->krpcs, &req.id);
+		break;
+	}
+	case PCS_IOC_KRPC_DESTROY:
+	{
+		struct pcs_ioc_krpc_destroy req;
+
+		if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+			return -EFAULT;
+
+		res = pcs_krpc_destroy(&cc->krpcs, &req.id);
+		break;
+	}
+	case PCS_IOC_REG_MR:
+	{
+		struct pcs_ioc_reg_mr req;
+
+		if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+			return -EFAULT;
+
+		res = pcs_reg_mr(&cc->mrs, req.start, req.len);
+		break;
+	}
+	case PCS_IOC_DEREG_MR:
+	{
+		struct pcs_ioc_dereg_mr req;
+
+		if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+			return -EFAULT;
+
+		res = pcs_dereg_mr(&cc->mrs, req.id);
+		break;
+	}
+	default:
+		res = -ENOIOCTLCMD;
+		break;
+	}
+	return res;
+}
+
 static struct fuse_kio_ops kio_pcs_ops = {
 	.name		= "pcs",
 	.owner		= THIS_MODULE,
@@ -1892,9 +1976,9 @@ static struct fuse_kio_ops kio_pcs_ops = {
 	.inode_release	= kpcs_inode_release,
 	.kill_requests	= kpcs_kill_requests,
 	.ioctl		= kpcs_ioctl,
+	.dev_ioctl	= kpcs_dev_ioctl,
 };
 
-
 static int __init kpcs_mod_init(void)
 {
 	int err = -ENOMEM;
@@ -1936,10 +2020,13 @@ static int __init kpcs_mod_init(void)
 	if (pcs_csa_init())
 		goto free_cleanup_wq;
 
+	if (pcs_krpc_init())
+		goto free_csa;
+
 	fast_path_version = PCS_FAST_PATH_VERSION.full;
 
 	if (fuse_register_kio(&kio_pcs_ops))
-		goto free_csa;
+		goto free_krpc;
 
 	/* Clone relay_file_operations to set ownership */
 	ktrace_file_operations = relay_file_operations;
@@ -1957,6 +2044,8 @@ static int __init kpcs_mod_init(void)
 	       pcs_fuse_req_cachep, pcs_ireq_cachep, pcs_wq);
 
 	return 0;
+free_krpc:
+	pcs_krpc_fini();
 free_csa:
 	pcs_csa_fini();
 free_cleanup_wq:
@@ -1989,6 +2078,7 @@ static void __exit kpcs_mod_exit(void)
 	kmem_cache_destroy(pcs_ireq_cachep);
 	kmem_cache_destroy(pcs_fuse_req_cachep);
 	pcs_csa_fini();
+	pcs_krpc_fini();
 }
 
 module_init(kpcs_mod_init);
diff --git a/fs/fuse/kio/pcs/pcs_ioctl.h b/fs/fuse/kio/pcs/pcs_ioctl.h
index 8e55be02c654..a0795d33b4f6 100644
--- a/fs/fuse/kio/pcs/pcs_ioctl.h
+++ b/fs/fuse/kio/pcs/pcs_ioctl.h
@@ -123,4 +123,33 @@ struct pcs_csa_setmap
 #define PCS_CSA_IOC_SETMAP	_IOR('V',38, struct pcs_csa_setmap)
 #define PCS_KIO_CALL_REG	_IOR('V',39, struct fuse_pcs_ioc_register)
 
+struct pcs_ioc_reg_mr {
+	u64	start;
+	u64	len;
+};
+#define PCS_IOC_REG_MR  _IOR('V', 40, struct pcs_ioc_reg_mr)
+
+struct pcs_ioc_dereg_mr {
+	u32 id;
+};
+#define PCS_IOC_DEREG_MR  _IOR('V', 41, struct pcs_ioc_dereg_mr)
+
+struct pcs_ioc_krpc_create {
+	PCS_NODE_ID_T	id;
+	PCS_NET_ADDR_T	addr;
+	int		cs_flags;
+};
+#define PCS_IOC_KRPC_CREATE	_IOR('V', 42, struct pcs_ioc_krpc_create)
+#define PCS_IOC_KRPC_UPDATE_ADDR _IOR('V', 43, struct pcs_ioc_krpc_create)
+
+struct pcs_ioc_krpc_connect {
+	PCS_NODE_ID_T	id;
+};
+#define PCS_IOC_KRPC_CONNECT _IOR('V', 44, struct pcs_ioc_krpc_connect)
+
+struct pcs_ioc_krpc_destroy {
+	PCS_NODE_ID_T	id;
+};
+#define PCS_IOC_KRPC_DESTROY _IOR('V', 45, struct pcs_ioc_krpc_destroy)
+
 #endif /* _PCS_IOCTL_H_ */
-- 
2.39.3 (Apple Git-146)



More information about the Devel mailing list