blob: d8fc933d3f593586954cf71cae00fb29d4a5a394 [file] [log] [blame]
Jens Axboee0da14d2022-05-25 06:12:18 -06001// SPDX-License-Identifier: GPL-2.0
2#include <linux/kernel.h>
3#include <linux/errno.h>
4#include <linux/file.h>
5#include <linux/io_uring.h>
6
7#include <uapi/linux/io_uring.h>
8
9#include "../fs/internal.h"
10
Jens Axboee0da14d2022-05-25 06:12:18 -060011#include "io_uring.h"
12#include "statx.h"
13
14struct io_statx {
15 struct file *file;
16 int dfd;
17 unsigned int mask;
18 unsigned int flags;
19 struct filename *filename;
20 struct statx __user *buffer;
21};
22
23int io_statx_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
24{
Stefan Metzmacherf2ccb5a2022-08-11 09:11:15 +020025 struct io_statx *sx = io_kiocb_to_cmd(req, struct io_statx);
Jens Axboee0da14d2022-05-25 06:12:18 -060026 const char __user *path;
27
28 if (sqe->buf_index || sqe->splice_fd_in)
29 return -EINVAL;
30 if (req->flags & REQ_F_FIXED_FILE)
31 return -EBADF;
32
33 sx->dfd = READ_ONCE(sqe->fd);
34 sx->mask = READ_ONCE(sqe->len);
35 path = u64_to_user_ptr(READ_ONCE(sqe->addr));
36 sx->buffer = u64_to_user_ptr(READ_ONCE(sqe->addr2));
37 sx->flags = READ_ONCE(sqe->statx_flags);
38
39 sx->filename = getname_flags(path,
40 getname_statx_lookup_flags(sx->flags),
41 NULL);
42
43 if (IS_ERR(sx->filename)) {
44 int ret = PTR_ERR(sx->filename);
45
46 sx->filename = NULL;
47 return ret;
48 }
49
50 req->flags |= REQ_F_NEED_CLEANUP;
51 return 0;
52}
53
54int io_statx(struct io_kiocb *req, unsigned int issue_flags)
55{
Stefan Metzmacherf2ccb5a2022-08-11 09:11:15 +020056 struct io_statx *sx = io_kiocb_to_cmd(req, struct io_statx);
Jens Axboee0da14d2022-05-25 06:12:18 -060057 int ret;
58
59 if (issue_flags & IO_URING_F_NONBLOCK)
60 return -EAGAIN;
61
62 ret = do_statx(sx->dfd, sx->filename, sx->flags, sx->mask, sx->buffer);
63 io_req_set_res(req, ret, 0);
64 return IOU_OK;
65}
66
67void io_statx_cleanup(struct io_kiocb *req)
68{
Stefan Metzmacherf2ccb5a2022-08-11 09:11:15 +020069 struct io_statx *sx = io_kiocb_to_cmd(req, struct io_statx);
Jens Axboee0da14d2022-05-25 06:12:18 -060070
71 if (sx->filename)
72 putname(sx->filename);
73}