[Devel] [PATCH VZ9 1/3] fs: fuse: pcs: implement missing fuse control points

Alexey Kuznetsov kuznet at virtuozzo.com
Tue Oct 1 21:36:28 MSK 2024


It is strange, I was sure I did this ages ago. User space _uses_ them
for years. It looks like the patch has been lost. No problem, they are
used only for problem solving and experiments, I found this loss
trying to do this and failing.

Signed-off-by: Alexey Kuznetsov <kuznet at virtuozzo.com>
---
 fs/fuse/kio/pcs/fuse_stat.c        | 159 ++++++++++++++++++++++++++++++++-----
 fs/fuse/kio/pcs/fuse_stat.h        |   2 +-
 fs/fuse/kio/pcs/pcs_cluster.c      |  21 ++---
 fs/fuse/kio/pcs/pcs_cluster.h      |   2 +-
 fs/fuse/kio/pcs/pcs_cluster_core.c |  21 ++---
 fs/fuse/kio/pcs/pcs_cs.c           |   2 +-
 fs/fuse/kio/pcs/pcs_cs_accel.c     |   4 -
 fs/fuse/kio/pcs/pcs_map.c          |  35 ++++----
 fs/fuse/kio/pcs/pcs_req.h          |  17 ++--
 fs/fuse/kio/pcs/pcs_rpc.h          |   3 -
 fs/fuse/kio/pcs/pcs_rpc_clnt.c     |   2 +-
 fs/fuse/kio/pcs/pcs_sock_conn.c    |  30 +++++++
 12 files changed, 207 insertions(+), 91 deletions(-)

diff --git a/fs/fuse/kio/pcs/fuse_stat.c b/fs/fuse/kio/pcs/fuse_stat.c
index 48a6864..16c9633 100644
--- a/fs/fuse/kio/pcs/fuse_stat.c
+++ b/fs/fuse/kio/pcs/fuse_stat.c
@@ -407,13 +407,14 @@ static int pcs_fuse_cs_stats_open(struct inode *inode, struct file *file)
 	.release = single_release,
 };
 
-static ssize_t pcs_fuse_storage_version_read(struct file *file,
-					     char __user *buf, size_t len,
-					     loff_t *ppos)
+static ssize_t pcs_fuse_uintvar_read(struct file *file,
+				     char __user *buf, size_t len,
+				     loff_t *ppos,
+				     unsigned int get_value(struct pcs_cluster_core *))
 {
 	struct pcs_fuse_stat *stat;
 	struct pcs_cluster_core *cc;
-	char ver[32];
+	char kbuf[32];
 	size_t size;
 	ssize_t ret = 0;
 
@@ -424,9 +425,8 @@ static ssize_t pcs_fuse_storage_version_read(struct file *file,
 		goto out;
 	cc = container_of(stat, struct pcs_cluster_core, stat);
 
-	size = snprintf(ver, sizeof(ver), "%d\n",
-			atomic_read(&cc->storage_version));
-	ret = simple_read_from_buffer(buf, len, ppos, ver, size);
+	size = snprintf(kbuf, sizeof(kbuf), "%u\n", (*get_value)(cc));
+	ret = simple_read_from_buffer(buf, len, ppos, kbuf, size);
 
 out:
 	mutex_unlock(&fuse_mutex);
@@ -434,30 +434,34 @@ static ssize_t pcs_fuse_storage_version_read(struct file *file,
 	return ret;
 }
 
-static ssize_t pcs_fuse_storage_version_write(struct file *file,
-					      const char __user *buf,
-					      size_t count, loff_t *ppos)
+static ssize_t pcs_fuse_uintvar_write(struct file *file,
+				     const char __user *buf,
+				     size_t count, loff_t *ppos,
+				     int set_value(struct pcs_cluster_core *, unsigned int))
 {
 	struct pcs_fuse_stat *stat;
 	struct pcs_cluster_core *cc;
-	unsigned int ver;
+	unsigned int val;
 	int err;
 
 	if (*ppos)
 		return -EINVAL;
 
-	err = kstrtouint_from_user(buf, count, 0, &ver);
+	err = kstrtouint_from_user(buf, count, 0, &val);
 	if (err)
 		return err;
 
 	mutex_lock(&fuse_mutex);
 
 	stat = file_inode(file)->i_private;
-	if (!stat)
+	if (!stat) {
+		count = -EINVAL;
 		goto out;
+	}
 	cc = container_of(stat, struct pcs_cluster_core, stat);
 
-	pcs_cc_update_storage_versions(cc, ver);
+	if (set_value(cc, val))
+		count = -EINVAL;
 
 out:
 	mutex_unlock(&fuse_mutex);
@@ -465,13 +469,64 @@ static ssize_t pcs_fuse_storage_version_write(struct file *file,
 	return count;
 }
 
-static const struct file_operations pcs_fuse_storage_version_ops = {
-	.owner   = THIS_MODULE,
-	.open    = nonseekable_open,
-	.read    = pcs_fuse_storage_version_read,
-	.write   = pcs_fuse_storage_version_write,
-	.llseek  = no_llseek,
-};
+#define DEFINE_UINTVAR(name)							\
+static ssize_t pcs_fuse_##name##_read(struct file *file,			\
+				      char __user *buf, size_t len,		\
+				      loff_t *ppos)				\
+{										\
+	return pcs_fuse_uintvar_read(file, buf, len, ppos, get_##name);		\
+}										\
+static ssize_t pcs_fuse_##name##_write(struct file *file,			\
+				       const char __user *buf,			\
+				       size_t count, loff_t *ppos)		\
+{										\
+	return pcs_fuse_uintvar_write(file, buf, count, ppos, set_##name);	\
+}										\
+static const struct file_operations pcs_fuse_##name##_ops = {			\
+	.owner   = THIS_MODULE,							\
+	.open    = nonseekable_open,						\
+	.read    = pcs_fuse_##name##_read,					\
+	.write   = pcs_fuse_##name##_write,					\
+	.llseek  = no_llseek,							\
+}
+
+static unsigned int get_storage_version(struct pcs_cluster_core *cc)
+{
+	return atomic_read(&cc->storage_version);
+}
+
+static int set_storage_version(struct pcs_cluster_core *cc, unsigned int val)
+{
+	pcs_cc_update_storage_versions(cc, val);
+	return 0;
+}
+
+DEFINE_UINTVAR(storage_version);
+
+#define DEFINE_CFG_UINTVAR(name)					\
+static unsigned int get_##name(struct pcs_cluster_core *cc)		\
+{									\
+	return READ_ONCE(cc->cfg.name);					\
+}									\
+static int set_##name(struct pcs_cluster_core *cc, unsigned int val)	\
+{									\
+	WRITE_ONCE(cc->cfg.name, val);					\
+	return 0;							\
+}									\
+DEFINE_UINTVAR(name)
+
+DEFINE_CFG_UINTVAR(wmss);
+DEFINE_CFG_UINTVAR(rmss);
+DEFINE_CFG_UINTVAR(lmss);
+DEFINE_CFG_UINTVAR(io_locality);
+DEFINE_CFG_UINTVAR(io_tweaks);
+DEFINE_CFG_UINTVAR(tcp_sndbuf);
+DEFINE_CFG_UINTVAR(tcp_rcvbuf);
+DEFINE_CFG_UINTVAR(local_sndbuf);
+DEFINE_CFG_UINTVAR(fail_on_nospace);
+DEFINE_CFG_UINTVAR(iolat_cutoff);
+DEFINE_CFG_UINTVAR(netlat_cutoff);
+DEFINE_CFG_UINTVAR(use_unix_socket);
 
 static void fuse_kio_fstat_lat_itr(struct fuse_file *ff,
 				   struct pcs_dentry_info *di, void *ctx)
@@ -938,8 +993,68 @@ int pcs_fuse_stat_init(struct pcs_fuse_stat *stat)
 				  &pcs_fuse_cs_stats_ops, stat) ||
 	    !fuse_stat_add_dentry(kio_stat, stat,
 				  "storage_version",
-				  S_IFREG | S_IRUSR | S_IWUSR, 1, NULL,
+				  S_IFREG | 0600, 1, NULL,
 				  &pcs_fuse_storage_version_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "fail-on-nospace",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_fail_on_nospace_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "io_locality",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_io_locality_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "io_tweaks",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_io_tweaks_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "tcp_sndbuf",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_tcp_sndbuf_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "tcp_rcvbuf",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_tcp_rcvbuf_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "local_sndbuf",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_local_sndbuf_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "iolat_cutoff",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_iolat_cutoff_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "netlat_cutoff",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_netlat_cutoff_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "use_unix_socket",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_use_unix_socket_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "wmss",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_wmss_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "rmss",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_rmss_ops,
+				  stat) ||
+	    !fuse_stat_add_dentry(fc->conn_ctl, stat,
+				  "lmss",
+				  S_IFREG | 0600, 1, NULL,
+				  &pcs_fuse_lmss_ops,
 				  stat))
 		goto fail_dentries;
 
diff --git a/fs/fuse/kio/pcs/fuse_stat.h b/fs/fuse/kio/pcs/fuse_stat.h
index 9e0e0dc..15bc973 100644
--- a/fs/fuse/kio/pcs/fuse_stat.h
+++ b/fs/fuse/kio/pcs/fuse_stat.h
@@ -9,7 +9,7 @@
 #define _FUSE_STAT_H_ 1
 
 #define STAT_TIMER_PERIOD 5
-#define STAT_NUM_DENTRIES 7
+#define STAT_NUM_DENTRIES 19
 
 struct pcs_msg;
 struct pcs_int_request;
diff --git a/fs/fuse/kio/pcs/pcs_cluster.c b/fs/fuse/kio/pcs/pcs_cluster.c
index a19a559..0a1c8db 100644
--- a/fs/fuse/kio/pcs/pcs_cluster.c
+++ b/fs/fuse/kio/pcs/pcs_cluster.c
@@ -521,18 +521,10 @@ static void ireq_on_error_(struct pcs_int_request *ireq)
 	 */
 	ireq_notify_err(ireq, &ireq->error);
 	switch (ireq->error.value) {
-		/* This can happen if we lost connection for long time and lease has been lost.
-		 * We should try to reacquire lock. Server must reject reacquisition, if someone
-		 * took the lock after us.
-		 */
-	case PCS_ERR_LEASE_REQUIRED:
-	case PCS_ERR_LEASE_EXPIRED:
-	case PCS_ERR_INTEGRITY_FAIL: {
-		/* TODO:  tag ireq->dentry with EIO here */
-	}
 	case PCS_ERR_CSD_LACKING:
-		/* To be completely equivalent to user space we should add option fail_on_nospace here */
-		break;
+		if (!ireq->dentry->cluster->cfg.fail_on_nospace)
+			break;
+		fallthrough;
 	case PCS_ERR_INV_PARAMS:
 	case PCS_ERR_NOT_FOUND:
 	case PCS_ERR_NON_EMPTY_DIR:
@@ -540,14 +532,15 @@ static void ireq_on_error_(struct pcs_int_request *ireq)
 	case PCS_ERR_IS_DIR:
 	case PCS_ERR_NO_STORAGE:
 	case PCS_ERR_UNAVAIL:
+	case PCS_ERR_LEASE_REQUIRED:
+	case PCS_ERR_LEASE_EXPIRED:
+	case PCS_ERR_INTEGRITY_FAIL:
+	case PCS_ERR_LEASE_CONFLICT:
 		TRACE("fatal error:%d ireq->type:%d nodeid:%llu\n",
 		      ireq->error.value, ireq->type,
 		      ireq->dentry->inode->nodeid);
 		ireq->flags |= IREQ_F_FATAL;
 		break;
-	case PCS_ERR_LEASE_CONFLICT:
-		WARN_ON_ONCE(1);
-		break;
 	default:
 		break;
 	}
diff --git a/fs/fuse/kio/pcs/pcs_cluster.h b/fs/fuse/kio/pcs/pcs_cluster.h
index a69fb6f..8693d1b 100644
--- a/fs/fuse/kio/pcs/pcs_cluster.h
+++ b/fs/fuse/kio/pcs/pcs_cluster.h
@@ -137,7 +137,7 @@ int pcs_cc_init(struct pcs_cluster_core *cc, struct workqueue_struct *wq,
 
 static inline void pcs_cc_set_abort_timeout(struct pcs_cluster_core *cc, int timeout)
 {
-	cc->cfg.def.abort_timeout = cc->cfg.curr.abort_timeout = timeout;
+	cc->cfg.abort_timeout = timeout;
 }
 
 struct crypto_sync_skcipher;
diff --git a/fs/fuse/kio/pcs/pcs_cluster_core.c b/fs/fuse/kio/pcs/pcs_cluster_core.c
index 6df2cce..86fe185 100644
--- a/fs/fuse/kio/pcs/pcs_cluster_core.c
+++ b/fs/fuse/kio/pcs/pcs_cluster_core.c
@@ -83,14 +83,13 @@ static void pcs_mapset_fini(struct pcs_map_set *maps)
 	list_lru_destroy(&maps->dirty_lru);
 }
 
-static void init_def_mss(struct pcs_cluster_core *cc)
+static void init_cfg_mss(struct pcs_cluster_core *cc)
 {
-	cc->cfg.def.wmss = PCS_DFLT_MSS_WRITE;
-	cc->cfg.def.rmss = PCS_DFLT_MSS_READ;
-	cc->cfg.def.lmss = PCS_DFLT_MSS_LOCAL;
+	cc->cfg.wmss = PCS_DFLT_MSS_WRITE;
+	cc->cfg.rmss = PCS_DFLT_MSS_READ;
+	cc->cfg.lmss = PCS_DFLT_MSS_LOCAL;
 }
 
-
 static void cc_workqueue_handler(struct work_struct *w)
 {
 	LIST_HEAD(queue);
@@ -193,15 +192,11 @@ int pcs_cc_init(struct pcs_cluster_core *cc, struct workqueue_struct *wq,
 	memset(&cc->cfg,   0, sizeof(cc->cfg));
 	memset(&cc->op,	   0, sizeof(cc->op));
 
-	init_def_mss(cc);
-	cc->cfg.def.kernel_cache_en = 1;
-	cc->cfg.curr = cc->cfg.def;
-	cc->cfg.sn = PCS_CONFIG_SEQ_ANY;
+	init_cfg_mss(cc);
 
-	cc->io_tweaks = 0;
-	cc->netlat_cutoff = PCS_MAX_NETWORK_LATENCY*1000;
-	cc->iolat_cutoff = PCS_MAX_IO_LATENCY*1000;
-	cc->abort_callback = NULL;
+	cc->cfg.netlat_cutoff = PCS_MAX_NETWORK_LATENCY*1000;
+	cc->cfg.iolat_cutoff = PCS_MAX_IO_LATENCY*1000;
+	cc->cfg.use_unix_socket = 1;
 
 	TRACE("Ok cc->{ cl_id:" CLUSTER_ID_FMT ", node_id:" NODE_FMT ", f:%x}\n",
 	      CLUSTER_ID_ARGS(cc->eng.cluster_id), NODE_ARGS(cc->eng.local_id),
diff --git a/fs/fuse/kio/pcs/pcs_cs.c b/fs/fuse/kio/pcs/pcs_cs.c
index efa69cd..7bf6288 100644
--- a/fs/fuse/kio/pcs/pcs_cs.c
+++ b/fs/fuse/kio/pcs/pcs_cs.c
@@ -225,7 +225,7 @@ struct pcs_cs *pcs_cs_find_create(struct pcs_cs_set *csset, PCS_NODE_ID_T *id, P
 				}
 			}
 		}
-		if (flags & CS_FL_LOCAL_SOCK)
+		if ((flags & CS_FL_LOCAL_SOCK) && cc_from_csset(csset)->cfg.use_unix_socket)
 			rpc->flags |= PCS_RPC_F_LOCAL;
 		else
 			rpc->flags &= ~PCS_RPC_F_LOCAL;
diff --git a/fs/fuse/kio/pcs/pcs_cs_accel.c b/fs/fuse/kio/pcs/pcs_cs_accel.c
index 37e9782..6e8efae 100644
--- a/fs/fuse/kio/pcs/pcs_cs_accel.c
+++ b/fs/fuse/kio/pcs/pcs_cs_accel.c
@@ -1352,10 +1352,6 @@ int pcs_csa_register(struct pcs_cluster_core * cc, PCS_NODE_ID_T cs_id, struct c
 	cs->csa_ctx = csa_ctx;
 	spin_unlock(&cs->lock);
 	fd_install(fd, file);
-
-	/* Not good, but handy, people will forget this, no doubts */
-	if (!cs_io_locality)
-		cs_io_locality = 1;
 	return fd;
 
 out:
diff --git a/fs/fuse/kio/pcs/pcs_map.c b/fs/fuse/kio/pcs/pcs_map.c
index fc707c9..4aba8e7 100644
--- a/fs/fuse/kio/pcs/pcs_map.c
+++ b/fs/fuse/kio/pcs/pcs_map.c
@@ -1440,7 +1440,8 @@ static int worth_to_grow(struct pcs_int_request *ireq, struct pcs_cs * cs)
 	if (ireq->type == PCS_IREQ_FLUSH)
 		return 0;
 
-	return ktime_to_us(ktime_sub(ktime_get(), ireq->ts_sent)) < cc_from_csset(cs->css)->netlat_cutoff;
+	return ktime_to_us(ktime_sub(ktime_get(), ireq->ts_sent)) <
+	       cc_from_csset(cs->css)->cfg.netlat_cutoff;
 }
 
 static void pcs_cs_deaccount(struct pcs_int_request *ireq, struct pcs_cs * cs, int error)
@@ -1458,7 +1459,7 @@ static void pcs_cs_deaccount(struct pcs_int_request *ireq, struct pcs_cs * cs, i
 		cost = PCS_CS_FLUSH_WEIGHT;
 
 	if (!error) {
-		int iolat_cutoff = cc_from_csset(cs->css)->iolat_cutoff;
+		int iolat_cutoff = cc_from_csset(cs->css)->cfg.iolat_cutoff;
 
 		if (cs->last_latency > iolat_cutoff && ireq->type != PCS_IREQ_FLUSH) {
 			unsigned int clamp;
@@ -1756,22 +1757,16 @@ static int get_io_locality(struct pcs_cluster_core *cc)
 {
 	int io_locality;
 
-	io_locality = cs_io_locality;
+	io_locality = READ_ONCE(cs_io_locality);
 	if (io_locality == 0)
-		io_locality = cc->cfg.curr.io_locality;
+		io_locality = READ_ONCE(cc->cfg.io_locality);
 
 	return io_locality;
 }
 
 static unsigned int get_io_tweaks(struct pcs_cluster_core *cc)
 {
-	unsigned int io_tweaks;
-
-	io_tweaks = cc->io_tweaks;
-	if (io_tweaks == 0)
-		io_tweaks = cc->cfg.curr.io_tweaks;
-
-	return io_tweaks;
+	return READ_ONCE(cc->cfg.io_tweaks);
 }
 
 static int select_cs_for_read(struct pcs_cluster_core *cc, struct pcs_cs_list * csl, int is_seq, unsigned int pos, PCS_NODE_ID_T banned_cs)
@@ -2039,13 +2034,14 @@ static int pcs_cslist_submit_read(struct pcs_int_request *ireq, struct pcs_cs_li
 			return 0;
 	}
 
-	if (allot < ireq->dentry->cluster->cfg.curr.lmss)
-		allot = ireq->dentry->cluster->cfg.curr.lmss;
+	iochunk = READ_ONCE(ireq->dentry->cluster->cfg.lmss);
+	if (allot < iochunk)
+		allot = iochunk;
 
 	if (test_bit(CS_SF_LOCAL, &cs->state))
-		iochunk = ireq->dentry->cluster->cfg.curr.lmss;
+		iochunk = READ_ONCE(ireq->dentry->cluster->cfg.lmss);
 	else
-		iochunk = ireq->dentry->cluster->cfg.curr.rmss;
+		iochunk = READ_ONCE(ireq->dentry->cluster->cfg.rmss);
 
 	for (;;) {
 		struct pcs_int_request * sreq = ireq;
@@ -2161,11 +2157,12 @@ static int pcs_cslist_submit_write(struct pcs_int_request *ireq, struct pcs_cs_l
 	unsigned int iochunk;
 	int i;
 	int allot;
+	unsigned int lmss;
 	struct pcs_cs * congested_cs = NULL;
 	u64 congested = 0;
 
 	ireq->iochunk.cs_index = 0;
-	iochunk = ireq->dentry->cluster->cfg.curr.lmss;
+	iochunk = lmss = READ_ONCE(ireq->dentry->cluster->cfg.lmss);
 
 restart:
 	allot = ireq->iochunk.size;
@@ -2196,11 +2193,11 @@ static int pcs_cslist_submit_write(struct pcs_int_request *ireq, struct pcs_cs_l
 			ireq->tok_reserved |= (1ULL << i);
 
 		if (!(test_bit(CS_SF_LOCAL, &cs->state)))
-			iochunk = ireq->dentry->cluster->cfg.curr.wmss;
+			iochunk = READ_ONCE(ireq->dentry->cluster->cfg.wmss);
 	}
 
-	if (allot < ireq->dentry->cluster->cfg.curr.lmss)
-		allot = ireq->dentry->cluster->cfg.curr.lmss;
+	if (allot < lmss)
+		allot = lmss;
 
 	if (congested) {
 		int queued;
diff --git a/fs/fuse/kio/pcs/pcs_req.h b/fs/fuse/kio/pcs/pcs_req.h
index ce3a976b..e43d28e 100644
--- a/fs/fuse/kio/pcs/pcs_req.h
+++ b/fs/fuse/kio/pcs/pcs_req.h
@@ -272,6 +272,10 @@ struct pcs_clnt_config
 	int		local_sndbuf;
 	int		tcp_sndbuf;
 	int		tcp_rcvbuf;
+	int		iolat_cutoff;
+	int		netlat_cutoff;
+	int		use_unix_socket;
+	int		fail_on_nospace;
 };
 
 struct pcs_cluster_core
@@ -297,17 +301,7 @@ struct pcs_cluster_core
 
 	struct pcs_fuse_stat	stat;
 
-	struct {
-		struct pcs_clnt_config	def;
-		struct pcs_clnt_config	curr;
-		PCS_CONFIG_SEQ_T	sn;
-		int			in_progress;
-	} cfg;
-
-	int			io_tweaks;
-	int			iolat_cutoff;
-	int			netlat_cutoff;
-	int			use_unix_socket;
+	struct pcs_clnt_config	cfg;
 
 	/*
 	 * Our cluster core may be integrated onto the various implementations by customizing the following request processing methods.
@@ -319,7 +313,6 @@ struct pcs_cluster_core
 		int  (*ireq_check_redo)(struct pcs_int_request *);
 	} op;
 
-	int (*abort_callback)(struct pcs_cluster_core *cc, struct pcs_int_request *ireq);
 	struct fuse_conn *fc;
 	spinlock_t		lock;
 
diff --git a/fs/fuse/kio/pcs/pcs_rpc.h b/fs/fuse/kio/pcs/pcs_rpc.h
index 613b711..f132743 100644
--- a/fs/fuse/kio/pcs/pcs_rpc.h
+++ b/fs/fuse/kio/pcs/pcs_rpc.h
@@ -184,9 +184,6 @@ struct pcs_rpc_engine
 	u64			mem_pressure_thresh;
 	u64			mem_limit;
 
-	int			local_sndbuf;
-	int			tcp_sndbuf;
-	int			tcp_rcvbuf;
 	struct delayed_work	stat_work;
 	int			max_connections;
 	int			max_gc_index;
diff --git a/fs/fuse/kio/pcs/pcs_rpc_clnt.c b/fs/fuse/kio/pcs/pcs_rpc_clnt.c
index cfc81c0..81b6101 100644
--- a/fs/fuse/kio/pcs/pcs_rpc_clnt.c
+++ b/fs/fuse/kio/pcs/pcs_rpc_clnt.c
@@ -154,7 +154,7 @@ struct pcs_rpc *pcs_rpc_clnt_create(struct pcs_rpc_engine *eng, PCS_NODE_ID_T *p
 	pcs_rpc_set_peer_id(ep, peer_id, PCS_NODE_ROLE_CS);
 	pcs_rpc_set_address(ep, peer_addr);
 
-	if (flags & CS_FL_LOCAL_SOCK)
+	if ((flags & CS_FL_LOCAL_SOCK) && cc_from_rpc(eng)->cfg.use_unix_socket)
 		ep->flags |= PCS_RPC_F_LOCAL;
 	else
 		ep->flags &= ~PCS_RPC_F_LOCAL;
diff --git a/fs/fuse/kio/pcs/pcs_sock_conn.c b/fs/fuse/kio/pcs/pcs_sock_conn.c
index 13823da..bce2d89 100644
--- a/fs/fuse/kio/pcs/pcs_sock_conn.c
+++ b/fs/fuse/kio/pcs/pcs_sock_conn.c
@@ -33,6 +33,35 @@ static inline void pcs_sock_cork(struct socket *sock)
 	tcp_sock_set_cork(sock->sk, true);
 }
 
+static inline void set_sock_parameters(struct socket *sock, struct pcs_cluster_core *cc)
+{
+	if (sock->sk->sk_family == PF_INET || sock->sk->sk_family == PF_INET6) {
+		unsigned int sndbuf = READ_ONCE(cc->cfg.tcp_sndbuf);
+		unsigned int rcvbuf = READ_ONCE(cc->cfg.tcp_rcvbuf);
+
+		if (sndbuf || rcvbuf) {
+			lock_sock(sock->sk);
+			if (sndbuf) {
+				sock->sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
+				WRITE_ONCE(sock->sk->sk_sndbuf,
+					   max_t(int, sndbuf * 2, SOCK_MIN_SNDBUF));
+			}
+			if (rcvbuf) {
+				sock->sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
+				WRITE_ONCE(sock->sk->sk_rcvbuf,
+					   max_t(int, rcvbuf * 2, SOCK_MIN_RCVBUF));
+			}
+			release_sock(sock->sk);
+		}
+	} else if (sock->sk->sk_family == PF_UNIX) {
+		unsigned int sndbuf = READ_ONCE(cc->cfg.local_sndbuf);
+
+		if (sndbuf)
+			WRITE_ONCE(sock->sk->sk_sndbuf,
+				   max_t(int, sndbuf * 2, SOCK_MIN_SNDBUF));
+	}
+}
+
 void pcs_sockconnect_start(struct pcs_rpc *ep)
 {
 	struct pcs_sockio *sio;
@@ -75,6 +104,7 @@ void pcs_sockconnect_start(struct pcs_rpc *ep)
 		pcs_sock_cork(sock);
 		sio->flags |= PCS_SOCK_F_CORK;
 	}
+	set_sock_parameters(sock, container_of(ep->eng, struct pcs_cluster_core, eng));
 
 	TRACE(PEER_FMT " ->state:%d sock:%p\n", PEER_ARGS(ep), ep->state, sock);
 	cancel_delayed_work(&ep->timer_work);
-- 
1.8.3.1



More information about the Devel mailing list