fuse_dev_do_read() answers a request that does not fit the server's
buffer with -EIO, except for FUSE_SETXATTR, which gets -E2BIG since the
value may legitimately be larger than the buffer and setxattr(2) reports
that to userspace.

Over io-uring the copy fails with -EIO for every opcode, so the two
transports report different errnos for the same condition.  Map that
-EIO to -E2BIG for SETXATTR.

Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Xiang Mei <[email protected]>
---
 fs/fuse/dev_uring.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/fs/fuse/dev_uring.c b/fs/fuse/dev_uring.c
index c6dd420c4034..6351f2470e09 100644
--- a/fs/fuse/dev_uring.c
+++ b/fs/fuse/dev_uring.c
@@ -893,6 +893,8 @@ static int fuse_uring_args_to_ring(struct fuse_req *req,
        fuse_copy_finish(&cs);
        if (err) {
                pr_info_ratelimited("%s fuse_copy_args failed\n", __func__);
+               if (err == -EIO && args->opcode == FUSE_SETXATTR)
+                       err = -E2BIG;
                return err;
        }
 
-- 
2.43.0


Reply via email to