Ack On Tue, Jul 30, 2024 at 12:42 PM Liu Kui <kui....@virtuozzo.com> wrote: > > Response to userspace requests should not be analyzed and translated > to msg->errors. Instead the entire response message should be just > passed to userspace and let userspace handle it. > > Fix the issue that userspace krpcio getting aborted by PCS_RPC_ERROR_RESP > response. > > Signed-off-by: Liu Kui <kui....@virtuozzo.com> > --- > fs/fuse/kio/pcs/pcs_krpc.c | 11 ++++++----- > fs/fuse/kio/pcs/pcs_krpc.h | 3 ++- > fs/fuse/kio/pcs/pcs_rpc.c | 7 +++++++ > 3 files changed, 15 insertions(+), 6 deletions(-) > > diff --git a/fs/fuse/kio/pcs/pcs_krpc.c b/fs/fuse/kio/pcs/pcs_krpc.c > index 567d8a0c884f..f61e8e2c813f 100644 > --- a/fs/fuse/kio/pcs/pcs_krpc.c > +++ b/fs/fuse/kio/pcs/pcs_krpc.c > @@ -105,7 +105,8 @@ static void krpc_msg_get_response_iter(struct pcs_msg > *msg, int offset, > struct pcs_msg *req = msg->private; > struct krpc_req *kreq = req->private2; > > - if (!(kreq->flags & KRPC_REQ_F_RESP_BUFF)) { > + if (!(kreq->flags & KRPC_REQ_F_RESP_BUFF) || > + (kreq->flags & KRPC_REQ_F_ERR_RESP)) { > /* No data payload */ > BUG_ON(msg->size > PAGE_SIZE); > > @@ -148,16 +149,16 @@ struct pcs_msg *krpc_get_hdr(struct pcs_rpc *ep, struct > pcs_rpc_hdr *h) > if (msg == NULL) > return NULL; > > - req_h = (struct pcs_rpc_hdr *)msg_inline_head(msg); > - if (req_h->type != (h->type & ~PCS_RPC_DIRECTION)) > - return NULL; > - > kreq = msg->private2; > > resp = pcs_rpc_alloc_input_msg(ep, sizeof(struct pcs_rpc_hdr)); > if (!resp) > return NULL; > > + req_h = (struct pcs_rpc_hdr *)msg_inline_head(msg); > + if (req_h->type != (h->type & ~PCS_RPC_DIRECTION)) > + kreq->flags |= KRPC_REQ_F_ERR_RESP; > + > memcpy(resp->_inline_buffer, h, sizeof(struct pcs_rpc_hdr)); > memcpy(kreq->hdr_buf, h, sizeof(struct pcs_rpc_hdr)); > resp->size = h->len; > diff --git a/fs/fuse/kio/pcs/pcs_krpc.h b/fs/fuse/kio/pcs/pcs_krpc.h > index 6c0ef20ebc99..8100dfb2629d 100644 > --- a/fs/fuse/kio/pcs/pcs_krpc.h > +++ b/fs/fuse/kio/pcs/pcs_krpc.h > @@ -93,7 +93,8 @@ struct krpc_req { > > #define KRPC_REQ_F_ALIGNMENT PCS_KRPC_MSG_F_ALIGNMENT > #define KRPC_REQ_F_RESP_BUFF PCS_KRPC_MSG_F_RESP_BUFF /* data buff > is for read response */ > -#define KRPC_REQ_F_ABORTED 0x10000 > +#define KRPC_REQ_F_ABORTED 0x10000 > +#define KRPC_REQ_F_ERR_RESP 0x20000 > int flags; > > struct pcs_msg msg; > diff --git a/fs/fuse/kio/pcs/pcs_rpc.c b/fs/fuse/kio/pcs/pcs_rpc.c > index deebc1dddf1b..f990f0f30609 100644 > --- a/fs/fuse/kio/pcs/pcs_rpc.c > +++ b/fs/fuse/kio/pcs/pcs_rpc.c > @@ -484,6 +484,12 @@ static void handle_response(struct pcs_rpc * ep, struct > pcs_msg * msg) > pcs_msg_del_calendar(req); > list_del(&req->list); > > + /* don't try to interpret response to request from userspace */ > + if (!(h->xid.origin.val & PCS_NODE_ALT_MASK)) { > + req->response = msg; > + goto skip; > + } > + > if (h->type == PCS_RPC_ERROR_RESP) { > struct pcs_rpc_error_resp * eh = (struct pcs_rpc_error_resp > *)msg->_inline_buffer; > > @@ -502,6 +508,7 @@ static void handle_response(struct pcs_rpc * ep, struct > pcs_msg * msg) > req->response = msg; > } > > +skip: > if (ep->ops->hook_response) > ep->ops->hook_response(ep, req); > > -- > 2.39.3 (Apple Git-146)
_______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel