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....@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) _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel