[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