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.19
------>
commit b29b3a7a24abe13d2aee4a256c13f3a045b65d1a
Author: Liu Kui <kui....@virtuozzo.com>
Date:   Fri Feb 28 22:47:26 2025 +0800

    fs/fuse: clear splice buffers from response to a killed request
    
    Normally we just ignore the response to a killed request, however
    if there are splice buffers returned with the response, we must
    clear these splice buffers before returning them to userspace.
    
    Fixed #VSTOR-100385
    https://virtuozzo.atlassian.net/browse/VSTOR-100385
    
    Signed-off-by: Liu Kui <kui....@virtuozzo.com>
    Acked-by: Alexey Kuznetsov <kuz...@virtuozzo.com>
    
    Feature: fuse: enhanced splice support
---
 fs/fuse/dev.c | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index cc6b9f348cf6..118613f17b10 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -1986,6 +1986,11 @@ static int copy_out_args(struct fuse_copy_state *cs, 
struct fuse_args *args,
 {
        unsigned reqsize = sizeof(struct fuse_out_header);
 
+       if (unlikely(args->killed)) {
+               cs->req->out.h.error = -EIO;
+               return 0;
+       }
+
        reqsize += fuse_len_args(args->out_numargs, args->out_args);
 
        if (reqsize < nbytes || (reqsize > nbytes && !args->out_argvar))
@@ -2081,6 +2086,9 @@ static int copy_out_splices(struct fuse_copy_state *cs, 
struct fuse_args *args,
                                int ioff = pipe->bufs[tail & mask].offset;
                                int ilen = pipe->bufs[tail & mask].len;
 
+                               if (unlikely(args->killed))
+                                       goto skip_copy;
+
                                while (ilen > 0) {
                                        int copy = ilen;
 
@@ -2105,6 +2113,7 @@ static int copy_out_splices(struct fuse_copy_state *cs, 
struct fuse_args *args,
                                        ioff += copy;
                                        ilen -= copy;
                                }
+skip_copy:
                                put_page(ipage);
                                pipe->bufs[tail & mask].ops = NULL;
                                pipe->bufs[tail & mask].page = NULL;
@@ -2119,7 +2128,9 @@ static int copy_out_splices(struct fuse_copy_state *cs, 
struct fuse_args *args,
                }
        }
 
-       if (args->page_zeroing && didx < ap->num_pages) {
+       if (unlikely(args->killed)) {
+               cs->req->out.h.error = -EIO;
+       } else if (args->page_zeroing && didx < ap->num_pages) {
                if (doff < dend) {
                        void *dst = kmap_atomic(dpage);
 
@@ -2159,6 +2170,11 @@ static int copy_out_krpczc(struct fuse_copy_state *cs, 
struct fuse_args *args,
        void *dst;
        int err;
 
+       if (unlikely(args->killed)) {
+               cs->req->out.h.error = -EIO;
+               return 0;
+       }
+
        if (args->out_numargs != 1 || !args->out_pages)
                return -EINVAL;
 
@@ -2338,10 +2354,7 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
        if (!req->args->page_replace)
                cs->move_pages = 0;
 
-       if (req->args->killed) {
-               err = 0;
-               req->out.h.error = -EIO;
-       } else if (oh.error == FUSE_OUT_SPLICES) {
+       if (oh.error == FUSE_OUT_SPLICES) {
                req->out.h.error = 0;
                err = copy_out_splices(cs, req->args, nbytes);
        } else if (oh.error == FUSE_OUT_KRPCZC) {
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to