Skip to content

Commit 08a1d26

Browse files
committed
io_uring: ensure openat sets O_LARGEFILE if needed
OPENAT2 correctly sets O_LARGEFILE if it has to, but that escaped the OPENAT opcode. Dmitry reports that his test case that compares openat() and IORING_OP_OPENAT sees failures on large files: *** sync openat openat succeeded sync write at offset 0 write succeeded sync write at offset 4294967296 write succeeded *** sync openat openat succeeded io_uring write at offset 0 write succeeded io_uring write at offset 4294967296 write succeeded *** io_uring openat openat succeeded sync write at offset 0 write succeeded sync write at offset 4294967296 write failed: File too large *** io_uring openat openat succeeded io_uring write at offset 0 write succeeded io_uring write at offset 4294967296 write failed: File too large Ensure we set O_LARGEFILE, if force_o_largefile() is true. Cc: [email protected] # v5.6 Fixes: 15b71ab ("io_uring: add support for IORING_OP_OPENAT") Reported-by: Dmitry Kadashev <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent f7fe934 commit 08a1d26

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

fs/io_uring.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2957,6 +2957,8 @@ static int io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
29572957
req->open.how.mode = READ_ONCE(sqe->len);
29582958
fname = u64_to_user_ptr(READ_ONCE(sqe->addr));
29592959
req->open.how.flags = READ_ONCE(sqe->open_flags);
2960+
if (force_o_largefile())
2961+
req->open.how.flags |= O_LARGEFILE;
29602962

29612963
req->open.filename = getname(fname);
29622964
if (IS_ERR(req->open.filename)) {

0 commit comments

Comments
 (0)