* [PATCHSET v2] io_uring: Allow relative lookups
@ 2020-02-09 17:11 Jens Axboe
2020-02-09 17:11 ` [PATCH 1/3] io-wq: add support for inheriting ->fs Jens Axboe
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Jens Axboe @ 2020-02-09 17:11 UTC (permalink / raw)
To: io-uring
Due to an oversight on my part, AT_FDCWD lookups only work when the
lookup can be done inline, not async. This patchset rectifies that,
aiming for 5.6 for this one as it would be a shame to have openat etc
without that.
Just 3 small simple patches - add io-wq support for passing in fs and
setting it, and add a ->needs_fs to the opcode table list of
requirements for opcodes that could potentially do lookups.
Last patch just ensures we allow AT_FDCWD.
--
Jens Axboe
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] io-wq: add support for inheriting ->fs
2020-02-09 17:11 [PATCHSET v2] io_uring: Allow relative lookups Jens Axboe
@ 2020-02-09 17:11 ` Jens Axboe
2020-02-11 3:31 ` Sasha Levin
2020-02-09 17:11 ` [PATCH 2/3] io_uring: grab ->fs as part of async preparation Jens Axboe
2020-02-09 17:11 ` [PATCH 3/3] io_uring: allow AT_FDCWD for non-file openat/openat2/statx Jens Axboe
2 siblings, 1 reply; 6+ messages in thread
From: Jens Axboe @ 2020-02-09 17:11 UTC (permalink / raw)
To: io-uring; +Cc: Jens Axboe, stable
Some work items need this for relative path lookup, make it available
like the other inherited credentials/mm/etc.
Cc: [email protected] # 5.3+
Signed-off-by: Jens Axboe <[email protected]>
---
fs/io-wq.c | 19 +++++++++++++++----
fs/io-wq.h | 4 +++-
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/fs/io-wq.c b/fs/io-wq.c
index cb60a42b9fdf..58b1891bcfe5 100644
--- a/fs/io-wq.c
+++ b/fs/io-wq.c
@@ -16,6 +16,7 @@
#include <linux/slab.h>
#include <linux/kthread.h>
#include <linux/rculist_nulls.h>
+#include <linux/fs_struct.h>
#include "io-wq.h"
@@ -59,6 +60,7 @@ struct io_worker {
const struct cred *cur_creds;
const struct cred *saved_creds;
struct files_struct *restore_files;
+ struct fs_struct *restore_fs;
};
#if BITS_PER_LONG == 64
@@ -141,13 +143,17 @@ static bool __io_worker_unuse(struct io_wqe *wqe, struct io_worker *worker)
worker->cur_creds = worker->saved_creds = NULL;
}
- if (current->files != worker->restore_files) {
+ if ((current->files != worker->restore_files) ||
+ (current->fs != worker->restore_fs)) {
__acquire(&wqe->lock);
spin_unlock_irq(&wqe->lock);
dropped_lock = true;
task_lock(current);
- current->files = worker->restore_files;
+ if (current->files != worker->restore_files)
+ current->files = worker->restore_files;
+ if (current->fs != worker->restore_fs)
+ current->fs = worker->restore_fs;
task_unlock(current);
}
@@ -311,6 +317,7 @@ static void io_worker_start(struct io_wqe *wqe, struct io_worker *worker)
worker->flags |= (IO_WORKER_F_UP | IO_WORKER_F_RUNNING);
worker->restore_files = current->files;
+ worker->restore_fs = current->fs;
io_wqe_inc_running(wqe, worker);
}
@@ -476,9 +483,13 @@ static void io_worker_handle_work(struct io_worker *worker)
if (work->flags & IO_WQ_WORK_CB)
work->func(&work);
- if (work->files && current->files != work->files) {
+ if ((work->files && current->files != work->files) ||
+ (work->fs && current->fs != work->fs)) {
task_lock(current);
- current->files = work->files;
+ if (work->files && current->files != work->files)
+ current->files = work->files;
+ if (work->fs && current->fs != work->fs)
+ current->fs = work->fs;
task_unlock(current);
}
if (work->mm != worker->mm)
diff --git a/fs/io-wq.h b/fs/io-wq.h
index 50b3378febf2..f152ba677d8f 100644
--- a/fs/io-wq.h
+++ b/fs/io-wq.h
@@ -74,6 +74,7 @@ struct io_wq_work {
struct files_struct *files;
struct mm_struct *mm;
const struct cred *creds;
+ struct fs_struct *fs;
unsigned flags;
};
@@ -81,10 +82,11 @@ struct io_wq_work {
do { \
(work)->list.next = NULL; \
(work)->func = _func; \
- (work)->flags = 0; \
(work)->files = NULL; \
(work)->mm = NULL; \
(work)->creds = NULL; \
+ (work)->fs = NULL; \
+ (work)->flags = 0; \
} while (0) \
typedef void (get_work_fn)(struct io_wq_work *);
--
2.25.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] io_uring: grab ->fs as part of async preparation
2020-02-09 17:11 [PATCHSET v2] io_uring: Allow relative lookups Jens Axboe
2020-02-09 17:11 ` [PATCH 1/3] io-wq: add support for inheriting ->fs Jens Axboe
@ 2020-02-09 17:11 ` Jens Axboe
2020-02-11 3:31 ` Sasha Levin
2020-02-09 17:11 ` [PATCH 3/3] io_uring: allow AT_FDCWD for non-file openat/openat2/statx Jens Axboe
2 siblings, 1 reply; 6+ messages in thread
From: Jens Axboe @ 2020-02-09 17:11 UTC (permalink / raw)
To: io-uring; +Cc: Jens Axboe, stable
This passes it in to io-wq, so it assumes the right fs_struct when
executing async work that may need to do lookups.
Cc: [email protected] # 5.3+
Signed-off-by: Jens Axboe <[email protected]>
---
fs/io_uring.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 1a3ca6577a10..2a7bb178986e 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -75,6 +75,7 @@
#include <linux/fsnotify.h>
#include <linux/fadvise.h>
#include <linux/eventpoll.h>
+#include <linux/fs_struct.h>
#define CREATE_TRACE_POINTS
#include <trace/events/io_uring.h>
@@ -611,6 +612,8 @@ struct io_op_def {
unsigned not_supported : 1;
/* needs file table */
unsigned file_table : 1;
+ /* needs ->fs */
+ unsigned needs_fs : 1;
};
static const struct io_op_def io_op_defs[] = {
@@ -653,12 +656,14 @@ static const struct io_op_def io_op_defs[] = {
.needs_mm = 1,
.needs_file = 1,
.unbound_nonreg_file = 1,
+ .needs_fs = 1,
},
[IORING_OP_RECVMSG] = {
.async_ctx = 1,
.needs_mm = 1,
.needs_file = 1,
.unbound_nonreg_file = 1,
+ .needs_fs = 1,
},
[IORING_OP_TIMEOUT] = {
.async_ctx = 1,
@@ -689,6 +694,7 @@ static const struct io_op_def io_op_defs[] = {
.needs_file = 1,
.fd_non_neg = 1,
.file_table = 1,
+ .needs_fs = 1,
},
[IORING_OP_CLOSE] = {
.needs_file = 1,
@@ -702,6 +708,7 @@ static const struct io_op_def io_op_defs[] = {
.needs_mm = 1,
.needs_file = 1,
.fd_non_neg = 1,
+ .needs_fs = 1,
},
[IORING_OP_READ] = {
.needs_mm = 1,
@@ -733,6 +740,7 @@ static const struct io_op_def io_op_defs[] = {
.needs_file = 1,
.fd_non_neg = 1,
.file_table = 1,
+ .needs_fs = 1,
},
[IORING_OP_EPOLL_CTL] = {
.unbound_nonreg_file = 1,
@@ -907,6 +915,16 @@ static inline void io_req_work_grab_env(struct io_kiocb *req,
}
if (!req->work.creds)
req->work.creds = get_current_cred();
+ if (!req->work.fs && def->needs_fs) {
+ spin_lock(¤t->fs->lock);
+ if (!current->fs->in_exec) {
+ req->work.fs = current->fs;
+ req->work.fs->users++;
+ } else {
+ req->work.flags |= IO_WQ_WORK_CANCEL;
+ }
+ spin_unlock(¤t->fs->lock);
+ }
}
static inline void io_req_work_drop_env(struct io_kiocb *req)
@@ -919,6 +937,16 @@ static inline void io_req_work_drop_env(struct io_kiocb *req)
put_cred(req->work.creds);
req->work.creds = NULL;
}
+ if (req->work.fs) {
+ struct fs_struct *fs = req->work.fs;
+
+ spin_lock(&req->work.fs->lock);
+ if (--fs->users)
+ fs = NULL;
+ spin_unlock(&req->work.fs->lock);
+ if (fs)
+ free_fs_struct(fs);
+ }
}
static inline bool io_prep_async_work(struct io_kiocb *req,
--
2.25.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] io_uring: allow AT_FDCWD for non-file openat/openat2/statx
2020-02-09 17:11 [PATCHSET v2] io_uring: Allow relative lookups Jens Axboe
2020-02-09 17:11 ` [PATCH 1/3] io-wq: add support for inheriting ->fs Jens Axboe
2020-02-09 17:11 ` [PATCH 2/3] io_uring: grab ->fs as part of async preparation Jens Axboe
@ 2020-02-09 17:11 ` Jens Axboe
2 siblings, 0 replies; 6+ messages in thread
From: Jens Axboe @ 2020-02-09 17:11 UTC (permalink / raw)
To: io-uring; +Cc: Jens Axboe
Don't just check for dirfd == -1, we should allow AT_FDCWD as well for
relative lookups.
Signed-off-by: Jens Axboe <[email protected]>
---
fs/io_uring.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/io_uring.c b/fs/io_uring.c
index 2a7bb178986e..e6247b94c29d 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -4543,7 +4543,7 @@ static int io_req_needs_file(struct io_kiocb *req, int fd)
{
if (!io_op_defs[req->opcode].needs_file)
return 0;
- if (fd == -1 && io_op_defs[req->opcode].fd_non_neg)
+ if ((fd == -1 || fd == AT_FDCWD) && io_op_defs[req->opcode].fd_non_neg)
return 0;
return 1;
}
--
2.25.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/3] io_uring: grab ->fs as part of async preparation
2020-02-09 17:11 ` [PATCH 2/3] io_uring: grab ->fs as part of async preparation Jens Axboe
@ 2020-02-11 3:31 ` Sasha Levin
0 siblings, 0 replies; 6+ messages in thread
From: Sasha Levin @ 2020-02-11 3:31 UTC (permalink / raw)
To: Sasha Levin, Jens Axboe, io-uring; +Cc: Jens Axboe, stable, stable
Hi,
[This is an automated email]
This commit has been processed because it contains a -stable tag.
The stable tag indicates that it's relevant for the following trees: 5.3+
The bot has tested the following trees: v5.5.2, v5.4.18.
v5.5.2: Failed to apply! Possible dependencies:
05f3fb3c5397 ("io_uring: avoid ring quiesce for fixed file set unregister and update")
15b71abe7b52 ("io_uring: add support for IORING_OP_OPENAT")
3a6820f2bb8a ("io_uring: add non-vectored read/write commands")
3e4827b05d2a ("io_uring: add support for epoll_ctl(2)")
4840e418c2fc ("io_uring: add IORING_OP_FADVISE")
b5dba59e0cf7 ("io_uring: add support for IORING_OP_CLOSE")
d3656344fea0 ("io_uring: add lookup table for various opcode needs")
d63d1b5edb7b ("io_uring: add support for fallocate()")
eddc7ef52a6b ("io_uring: add support for IORING_OP_STATX")
v5.4.18: Failed to apply! Possible dependencies:
15b71abe7b52 ("io_uring: add support for IORING_OP_OPENAT")
2665abfd757f ("io_uring: add support for linked SQE timeouts")
3e4827b05d2a ("io_uring: add support for epoll_ctl(2)")
3fbb51c18f5c ("io_uring: move all prep state for IORING_OP_CONNECT to prep handler")
4840e418c2fc ("io_uring: add IORING_OP_FADVISE")
561fb04a6a22 ("io_uring: replace workqueue usage with io-wq")
771b53d033e8 ("io-wq: small threadpool implementation for io_uring")
8ed8d3c3bc32 ("io_uring: any deferred command must have stable sqe data")
9adbd45d6d32 ("io_uring: add and use struct io_rw for read/writes")
ad8a48acc23c ("io_uring: make req->timeout be dynamically allocated")
b29472ee7b53 ("io_uring: make IORING_OP_TIMEOUT_REMOVE deferrable")
ba5290ccb6b5 ("io_uring: replace s->needs_lock with s->in_async")
ba816ad61fdf ("io_uring: run dependent links inline if possible")
c826bd7a743f ("io_uring: add set of tracing events")
e47293fdf989 ("io_uring: move all prep state for IORING_OP_{SEND,RECV}_MGS to prep handler")
fbf23849b172 ("io_uring: make IORING_OP_CANCEL_ASYNC deferrable")
fcb323cc53e2 ("io_uring: io_uring: add support for async work inheriting files")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
--
Thanks,
Sasha
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] io-wq: add support for inheriting ->fs
2020-02-09 17:11 ` [PATCH 1/3] io-wq: add support for inheriting ->fs Jens Axboe
@ 2020-02-11 3:31 ` Sasha Levin
0 siblings, 0 replies; 6+ messages in thread
From: Sasha Levin @ 2020-02-11 3:31 UTC (permalink / raw)
To: Sasha Levin, Jens Axboe, io-uring; +Cc: Jens Axboe, stable, stable
Hi,
[This is an automated email]
This commit has been processed because it contains a -stable tag.
The stable tag indicates that it's relevant for the following trees: 5.3+
The bot has tested the following trees: v5.5.2, v5.4.18.
v5.5.2: Failed to apply! Possible dependencies:
05f3fb3c5397 ("io_uring: avoid ring quiesce for fixed file set unregister and update")
15b71abe7b52 ("io_uring: add support for IORING_OP_OPENAT")
66f4af93da57 ("io_uring: add support for probing opcodes")
b5dba59e0cf7 ("io_uring: add support for IORING_OP_CLOSE")
d3656344fea0 ("io_uring: add lookup table for various opcode needs")
d63d1b5edb7b ("io_uring: add support for fallocate()")
eddc7ef52a6b ("io_uring: add support for IORING_OP_STATX")
f86cd20c9454 ("io_uring: fix linked command file table usage")
v5.4.18: Failed to apply! Possible dependencies:
561fb04a6a22 ("io_uring: replace workqueue usage with io-wq")
771b53d033e8 ("io-wq: small threadpool implementation for io_uring")
ba5290ccb6b5 ("io_uring: replace s->needs_lock with s->in_async")
ba816ad61fdf ("io_uring: run dependent links inline if possible")
c5def4ab8494 ("io-wq: add support for bounded vs unbunded work")
c826bd7a743f ("io_uring: add set of tracing events")
fcb323cc53e2 ("io_uring: io_uring: add support for async work inheriting files")
NOTE: The patch will not be queued to stable trees until it is upstream.
How should we proceed with this patch?
--
Thanks,
Sasha
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-02-11 3:31 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-02-09 17:11 [PATCHSET v2] io_uring: Allow relative lookups Jens Axboe
2020-02-09 17:11 ` [PATCH 1/3] io-wq: add support for inheriting ->fs Jens Axboe
2020-02-11 3:31 ` Sasha Levin
2020-02-09 17:11 ` [PATCH 2/3] io_uring: grab ->fs as part of async preparation Jens Axboe
2020-02-11 3:31 ` Sasha Levin
2020-02-09 17:11 ` [PATCH 3/3] io_uring: allow AT_FDCWD for non-file openat/openat2/statx Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox