1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
3 #include <linux/errno.h>
5 #include <linux/file.h>
7 #include <linux/slab.h>
8 #include <linux/namei.h>
9 #include <linux/io_uring.h>
10 #include <linux/fsnotify.h>
12 #include <uapi/linux/io_uring.h>
25 int io_sfr_prep(struct io_kiocb
*req
, const struct io_uring_sqe
*sqe
)
27 struct io_sync
*sync
= io_kiocb_to_cmd(req
, struct io_sync
);
29 if (unlikely(sqe
->addr
|| sqe
->buf_index
|| sqe
->splice_fd_in
))
32 sync
->off
= READ_ONCE(sqe
->off
);
33 sync
->len
= READ_ONCE(sqe
->len
);
34 sync
->flags
= READ_ONCE(sqe
->sync_range_flags
);
35 req
->flags
|= REQ_F_FORCE_ASYNC
;
40 int io_sync_file_range(struct io_kiocb
*req
, unsigned int issue_flags
)
42 struct io_sync
*sync
= io_kiocb_to_cmd(req
, struct io_sync
);
45 /* sync_file_range always requires a blocking context */
46 WARN_ON_ONCE(issue_flags
& IO_URING_F_NONBLOCK
);
48 ret
= sync_file_range(req
->file
, sync
->off
, sync
->len
, sync
->flags
);
49 io_req_set_res(req
, ret
, 0);
53 int io_fsync_prep(struct io_kiocb
*req
, const struct io_uring_sqe
*sqe
)
55 struct io_sync
*sync
= io_kiocb_to_cmd(req
, struct io_sync
);
57 if (unlikely(sqe
->addr
|| sqe
->buf_index
|| sqe
->splice_fd_in
))
60 sync
->flags
= READ_ONCE(sqe
->fsync_flags
);
61 if (unlikely(sync
->flags
& ~IORING_FSYNC_DATASYNC
))
64 sync
->off
= READ_ONCE(sqe
->off
);
65 sync
->len
= READ_ONCE(sqe
->len
);
66 req
->flags
|= REQ_F_FORCE_ASYNC
;
70 int io_fsync(struct io_kiocb
*req
, unsigned int issue_flags
)
72 struct io_sync
*sync
= io_kiocb_to_cmd(req
, struct io_sync
);
73 loff_t end
= sync
->off
+ sync
->len
;
76 /* fsync always requires a blocking context */
77 WARN_ON_ONCE(issue_flags
& IO_URING_F_NONBLOCK
);
79 ret
= vfs_fsync_range(req
->file
, sync
->off
, end
> 0 ? end
: LLONG_MAX
,
80 sync
->flags
& IORING_FSYNC_DATASYNC
);
81 io_req_set_res(req
, ret
, 0);
85 int io_fallocate_prep(struct io_kiocb
*req
, const struct io_uring_sqe
*sqe
)
87 struct io_sync
*sync
= io_kiocb_to_cmd(req
, struct io_sync
);
89 if (sqe
->buf_index
|| sqe
->rw_flags
|| sqe
->splice_fd_in
)
92 sync
->off
= READ_ONCE(sqe
->off
);
93 sync
->len
= READ_ONCE(sqe
->addr
);
94 sync
->mode
= READ_ONCE(sqe
->len
);
95 req
->flags
|= REQ_F_FORCE_ASYNC
;
99 int io_fallocate(struct io_kiocb
*req
, unsigned int issue_flags
)
101 struct io_sync
*sync
= io_kiocb_to_cmd(req
, struct io_sync
);
104 /* fallocate always requiring blocking context */
105 WARN_ON_ONCE(issue_flags
& IO_URING_F_NONBLOCK
);
107 ret
= vfs_fallocate(req
->file
, sync
->mode
, sync
->off
, sync
->len
);
109 fsnotify_modify(req
->file
);
110 io_req_set_res(req
, ret
, 0);