The commit is pushed to "branch-rh9-5.14.0-427.44.1.vz9.80.x-ovz" and will appear at g...@bitbucket.org:openvz/vzkernel.git after rh9-5.14.0-427.44.1.vz9.80.4 ------> commit 9c0bf00a1e6c9a3b63aa484af888d25dea466edf Author: Liu Kui <kui....@virtuozzo.com> Date: Wed Jan 22 17:44:34 2025 +0800
fs/fuse kio: return msg completion error properly to userspace on kRPC 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 https://virtuozzo.atlassian.net/browse/VSTOR-97762 Signed-off-by: Liu Kui <kui....@virtuozzo.com> Acked-by: Alexey Kuznetsov <kuz...@virtuozzo.com> Feature: fuse: kRPC - single RPC for kernel and userspace --- 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 f52be006b91d..2a359f910904 100644 --- a/fs/fuse/kio/pcs/pcs_krpc.c +++ b/fs/fuse/kio/pcs/pcs_krpc.c @@ -284,21 +284,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 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel