[PATCH v8 2/2] fuse: return -E2BIG for an oversized SETXATTR over io-uring
From: Xiang Mei
Date: Thu Sep 10 2026 - 19:51:33 EST
fuse_dev_do_read() returns -E2BIG when a SETXATTR does not fit the
server's buffer, since the value may legitimately be that large. The
io-uring transport fails the copy with -EIO instead. Map it so both
transports agree.
Assisted-by: Claude:claude-opus-4-8
Reviewed-by: Joanne Koong <joannelkoong@xxxxxxxxx>
Signed-off-by: Xiang Mei <xmei5@xxxxxxx>
---
v7: new patch, all that is left of the v6 bounds check
v8: comment on why -EIO is unambiguous here; add Reviewed-by
fs/fuse/dev_uring.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/fs/fuse/dev_uring.c b/fs/fuse/dev_uring.c
index c6dd420c4034..460776cd69cd 100644
--- a/fs/fuse/dev_uring.c
+++ b/fs/fuse/dev_uring.c
@@ -893,6 +893,12 @@ 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__);
+ /*
+ * fuse-uring does not use pipe buffers, so -EIO here can only
+ * mean the in-args did not fit ent->payload
+ */
+ if (err == -EIO && args->opcode == FUSE_SETXATTR)
+ err = -E2BIG;
return err;
}
--
2.43.0