1 // 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>
7 #include <uapi/linux/io_uring.h>
9 #include "../fs/internal.h"
19 struct filename
*filename
;
20 struct statx __user
*buffer
;
23 int io_statx_prep(struct io_kiocb
*req
, const struct io_uring_sqe
*sqe
)
25 struct io_statx
*sx
= io_kiocb_to_cmd(req
, struct io_statx
);
26 const char __user
*path
;
28 if (sqe
->buf_index
|| sqe
->splice_fd_in
)
30 if (req
->flags
& REQ_F_FIXED_FILE
)
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
);
39 sx
->filename
= getname_uflags(path
, sx
->flags
);
41 if (IS_ERR(sx
->filename
)) {
42 int ret
= PTR_ERR(sx
->filename
);
48 req
->flags
|= REQ_F_NEED_CLEANUP
;
49 req
->flags
|= REQ_F_FORCE_ASYNC
;
53 int io_statx(struct io_kiocb
*req
, unsigned int issue_flags
)
55 struct io_statx
*sx
= io_kiocb_to_cmd(req
, struct io_statx
);
58 WARN_ON_ONCE(issue_flags
& IO_URING_F_NONBLOCK
);
60 ret
= do_statx(sx
->dfd
, sx
->filename
, sx
->flags
, sx
->mask
, sx
->buffer
);
61 io_req_set_res(req
, ret
, 0);
65 void io_statx_cleanup(struct io_kiocb
*req
)
67 struct io_statx
*sx
= io_kiocb_to_cmd(req
, struct io_statx
);
70 putname(sx
->filename
);