This adds a helper, __io_open_prep(), which does the part of preparing for an open that is shared between openat*() and open_by_handle_at(). It excludes reading in the user path or file handle--this will be done by functions specific to the kind of open(). Signed-off-by: Thomas Bertschinger --- io_uring/openclose.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/io_uring/openclose.c b/io_uring/openclose.c index 884a66e56643..4da2afdb9773 100644 --- a/io_uring/openclose.c +++ b/io_uring/openclose.c @@ -58,11 +58,10 @@ static bool io_openat_force_async(struct io_open *open) return open->how.flags & (O_TRUNC | O_CREAT | __O_TMPFILE); } -static int __io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) +/* Prep for open that is common to both openat*() and open_by_handle_at() */ +static int __io_open_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) { struct io_open *open = io_kiocb_to_cmd(req, struct io_open); - const char __user *fname; - int ret; if (unlikely(sqe->buf_index)) return -EINVAL; @@ -74,6 +73,29 @@ static int __io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe open->how.flags |= O_LARGEFILE; open->dfd = READ_ONCE(sqe->fd); + + open->file_slot = READ_ONCE(sqe->file_index); + if (open->file_slot && (open->how.flags & O_CLOEXEC)) + return -EINVAL; + + open->nofile = rlimit(RLIMIT_NOFILE); + + if (io_openat_force_async(open)) + req->flags |= REQ_F_FORCE_ASYNC; + + return 0; +} + +static int __io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) +{ + struct io_open *open = io_kiocb_to_cmd(req, struct io_open); + const char __user *fname; + int ret; + + ret = __io_open_prep(req, sqe); + if (ret) + return ret; + fname = u64_to_user_ptr(READ_ONCE(sqe->addr)); open->filename = getname(fname); if (IS_ERR(open->filename)) { @@ -82,14 +104,7 @@ static int __io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe return ret; } - open->file_slot = READ_ONCE(sqe->file_index); - if (open->file_slot && (open->how.flags & O_CLOEXEC)) - return -EINVAL; - - open->nofile = rlimit(RLIMIT_NOFILE); req->flags |= REQ_F_NEED_CLEANUP; - if (io_openat_force_async(open)) - req->flags |= REQ_F_FORCE_ASYNC; return 0; } -- 2.51.0