[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