[Devel] [PATCH VZ9 1/3] fs/fuse kio: return msg completion error properly to userspace on kRPC

Liu Kui kui.liu at virtuozzo.com
Tue Jan 21 11:32:15 MSK 2025


Currently if a msg is completed in error, the error is not properly
returned to userspace making userspace unable to process such error
correctly. Thus userspace has to abort the connection whenever there's
a msg completing in error. Even non-fatal error such as the response
timeout error would result in abortion of the connecion, which is just
a wrong behaivor.

By passing the response timeout error to userspace, it allows userspace
to solely rely on the kill timer in kernel rpc for waiting for response.
Acting this way can remove the possibility that a userpsace request is
completed before its corresponding request completes in kernel space,
thus addressing two issues that could otherwise happen, 1) userspace
receives a stale response from kernel. 2) kernel access buffs that have
been released in userspace.

Related to #VSTOR-97762
Signed-off-by: Liu Kui <kui.liu at virtuozzo.com>
---
 fs/fuse/kio/pcs/pcs_krpc.c      | 10 +++-------
 fs/fuse/kio/pcs/pcs_krpc_prot.h | 10 +++++++---
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/fs/fuse/kio/pcs/pcs_krpc.c b/fs/fuse/kio/pcs/pcs_krpc.c
index 45ec3cb3207c..2ab1450a0005 100644
--- a/fs/fuse/kio/pcs/pcs_krpc.c
+++ b/fs/fuse/kio/pcs/pcs_krpc.c
@@ -279,21 +279,17 @@ static int pcs_krpc_ioctl_recv_msg(struct pcs_krpc *krpc, struct pcs_krpc_ioc_re
 	krpc->nr_completion--;
 	spin_unlock(&krpc->lock);
 
-	if (comp->result) {
-		res -= comp->result;
-		goto out;
-	}
-
 	res = 1;
 	iocmsg->xid = comp->xid;
-	if (comp->xid == 0) {
+	if (comp->xid == 0) { /* request */
 		BUG_ON(!comp->data_len);
 		BUG_ON(iocmsg->buf.len < comp->data_len);
 		if (copy_to_user((void __user *)iocmsg->buf.addr, comp->_data_buf, comp->data_len))
 			res = -EFAULT;
+	} else { /* response */
+		iocmsg->result = comp->result;
 	}
 
-out:
 	krpc_completion_free(comp);
 	return res;
 }
diff --git a/fs/fuse/kio/pcs/pcs_krpc_prot.h b/fs/fuse/kio/pcs/pcs_krpc_prot.h
index 81caa1d53669..812f778a6a06 100644
--- a/fs/fuse/kio/pcs/pcs_krpc_prot.h
+++ b/fs/fuse/kio/pcs/pcs_krpc_prot.h
@@ -7,8 +7,9 @@
  * kRPC version:
  * v1: Initial krpc support
  * v2: Support zerocopy read
+ * v3: Return error code to userspace
  */
-#define PCS_KRPC_VERSION 2
+#define PCS_KRPC_VERSION 3
 
 /* Device ioctls: */
 #define PCS_KRPC_IOC_MAGIC  255
@@ -50,14 +51,17 @@ struct pcs_krpc_ioc_sendmsg {
 	u64		xid;				/* context id */
 	u32		msg_size;			/* total size of the msg */
 	u16		timeout;			/* timeout */
-	u8		flags;				/* alignment,  */
+	u8		flags;				/* alignment */
 	u8		nr_data_chunks;		/* total number of data chunks */
 	struct pcs_krpc_buf_desc hdr_chunk;	/* the buf holding msg header */
 };
 
 struct pcs_krpc_ioc_recvmsg {
 	u64		xid;	/* context id */
-	struct pcs_krpc_buf_desc buf;	/* for cs congestion notification and rpc keep waiting msg.*/
+	union {
+		u32	result;	/* for response msg */
+		struct pcs_krpc_buf_desc buf;	/* for request msg */
+	};
 };
 
 #endif
-- 
2.39.5 (Apple Git-154)



More information about the Devel mailing list