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

