[Devel] [PATCH RHEL9 COMMIT] fs/fuse/krpc: prevent krpc request from crossing reconnect

Konstantin Khorenko khorenko at virtuozzo.com
Fri Mar 28 23:51:02 MSK 2025


The commit is pushed to "branch-rh9-5.14.0-427.44.1.vz9.80.x-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh9-5.14.0-427.44.1.vz9.80.23
------>
commit f1b3519cb9cb2dcac93a92d9ae362cfdd740f4d2
Author: Alexey Kuznetsov <kuznet at virtuozzo.com>
Date:   Fri Mar 28 20:01:13 2025 +0800

    fs/fuse/krpc: prevent krpc request from crossing reconnect
    
    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>
    
    Feature: fuse: kRPC - single RPC for kernel and userspace
---
 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 58a9ceebfee2..28c6104d7dc3 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 8021b0262560..15d9f77aa401 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;
 };


More information about the Devel mailing list