[Devel] [PATCH VZ9 7/7] fs/fuse/krpc: prevent krpc request from crossing reconnect
Alexey Kuznetsov
kuznet at virtuozzo.com
Fri Mar 28 15:01:13 MSK 2025
Do it with already existing generation id. kreq stores genid
of connection at time of enqueue, and if it races with reconnect,
it is rejected.
Signed-off-by: Alexey Kuznetsov <kuznet at virtuozzo.com>
---
fs/fuse/kio/pcs/pcs_krpc.c | 5 ++++-
fs/fuse/kio/pcs/pcs_krpc.h | 1 +
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/fs/fuse/kio/pcs/pcs_krpc.c b/fs/fuse/kio/pcs/pcs_krpc.c
index a0e0799..786cef2 100644
--- a/fs/fuse/kio/pcs/pcs_krpc.c
+++ b/fs/fuse/kio/pcs/pcs_krpc.c
@@ -581,7 +581,8 @@ static int kreq_make_sendmsg(struct krpc_req *kreq)
msg->get_iter = krpc_msg_get_data;
spin_lock(&krpc->lock);
- if (krpc->state != PCS_KRPC_STATE_CONNECTED) {
+ if (krpc->state != PCS_KRPC_STATE_CONNECTED ||
+ krpc->gen != kreq->gen) {
spin_unlock(&krpc->lock);
res = -ECONNABORTED;
goto err_free_data_chunk;
@@ -826,6 +827,8 @@ static long pcs_krpc_ioctl(struct file *file, unsigned int cmd, unsigned long ar
if (!kreq)
return -ENOMEM;
+ kreq->gen = ctx->gen;
+
if (copy_from_user(&kreq->iocmsg, (void __user *)arg, sizeof(kreq->iocmsg))) {
krpc_req_free(kreq);
return -EFAULT;
diff --git a/fs/fuse/kio/pcs/pcs_krpc.h b/fs/fuse/kio/pcs/pcs_krpc.h
index 8021b02..15d9f77 100644
--- a/fs/fuse/kio/pcs/pcs_krpc.h
+++ b/fs/fuse/kio/pcs/pcs_krpc.h
@@ -130,6 +130,7 @@ struct krpc_req {
struct krpc_completion completion;
+ u32 gen;
struct llist_node llist_link;
struct pcs_krpc_ioc_sendmsg iocmsg;
};
--
1.8.3.1
More information about the Devel
mailing list