[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200507185725.15840-1-mk@cm4all.com>
Date: Thu, 7 May 2020 20:57:25 +0200
From: Max Kellermann <mk@...all.com>
To: axboe@...nel.dk, linux-fsdevel@...r.kernel.org
Cc: linux-kernel@...r.kernel.org, Max Kellermann <mk@...all.com>,
stable@...r.kernel.org
Subject: [PATCH] fs/io_uring: fix O_PATH fds in openat, openat2, statx
If an operation's flag `needs_file` is set, the function
io_req_set_file() calls io_file_get() to obtain a `struct file*`.
This fails for `O_PATH` file descriptors, because those have no
`struct file*`, causing io_req_set_file() to throw `-EBADF`. This
breaks the operations `openat`, `openat2` and `statx`, where `O_PATH`
file descriptors are commonly used.
The solution is to simply remove `needs_file` (and the accompanying
flag `fd_non_reg`). This flag was never needed because those
operations use numeric file descriptor and don't use the `struct
file*` obtained by io_req_set_file().
Signed-off-by: Max Kellermann <mk@...all.com>
Cc: stable@...r.kernel.org
---
fs/io_uring.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index a46de2cfc28e..d24f8e33323c 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -693,8 +693,6 @@ static const struct io_op_def io_op_defs[] = {
.needs_file = 1,
},
[IORING_OP_OPENAT] = {
- .needs_file = 1,
- .fd_non_neg = 1,
.file_table = 1,
.needs_fs = 1,
},
@@ -708,8 +706,6 @@ static const struct io_op_def io_op_defs[] = {
},
[IORING_OP_STATX] = {
.needs_mm = 1,
- .needs_file = 1,
- .fd_non_neg = 1,
.needs_fs = 1,
},
[IORING_OP_READ] = {
@@ -739,8 +735,6 @@ static const struct io_op_def io_op_defs[] = {
.unbound_nonreg_file = 1,
},
[IORING_OP_OPENAT2] = {
- .needs_file = 1,
- .fd_non_neg = 1,
.file_table = 1,
.needs_fs = 1,
},
--
2.20.1
Powered by blists - more mailing lists