Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/fs/io_uring.c b/fs/io_uring.c
- index 405be10da73d..a2974d560246 100644
- --- a/fs/io_uring.c
- +++ b/fs/io_uring.c
- @@ -1773,8 +1773,15 @@ static int io_read(struct io_kiocb *req, struct io_kiocb **nxt,
- iov_count = iov_iter_count(&iter);
- ret = rw_verify_area(READ, file, &kiocb->ki_pos, iov_count);
- if (!ret) {
- + struct inode *inode = file_inode(req->file);
- + off_t start = req->rw.ki_pos >> PAGE_SHIFT;
- + off_t end = (req->rw.ki_pos + io_size - 1) >> PAGE_SHIFT;
- + bool do_inval = false;
- ssize_t ret2;
- + if (force_nonblock && (kiocb->ki_flags & IOCB_DROPBEHIND))
- + do_inval = true;
- +
- if (file->f_op->read_iter)
- ret2 = call_read_iter(file, kiocb, &iter);
- else
- @@ -1795,6 +1802,9 @@ static int io_read(struct io_kiocb *req, struct io_kiocb **nxt,
- /* Catch -EAGAIN return for forced non-blocking submission */
- if (!force_nonblock || ret2 != -EAGAIN) {
- kiocb_done(kiocb, ret2, nxt, req->in_async);
- + if (force_nonblock)
- + invalidate_inode_pages2_range(inode->i_mapping,
- + start, end);
- } else {
- copy_iov:
- ret = io_setup_async_io(req, io_size, iovec,
- diff --git a/include/linux/fs.h b/include/linux/fs.h
- index 98e0349adb52..647f7e38927c 100644
- --- a/include/linux/fs.h
- +++ b/include/linux/fs.h
- @@ -314,6 +314,7 @@ enum rw_hint {
- #define IOCB_SYNC (1 << 5)
- #define IOCB_WRITE (1 << 6)
- #define IOCB_NOWAIT (1 << 7)
- +#define IOCB_DROPBEHIND (1 << 8)
- struct kiocb {
- struct file *ki_filp;
- @@ -3418,6 +3419,8 @@ static inline int kiocb_set_rw_flags(struct kiocb *ki, rwf_t flags)
- ki->ki_flags |= (IOCB_DSYNC | IOCB_SYNC);
- if (flags & RWF_APPEND)
- ki->ki_flags |= IOCB_APPEND;
- + if (flags & RWF_DROPBEHIND)
- + ki->ki_flags |= IOCB_DROPBEHIND;
- return 0;
- }
- diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
- index 379a612f8f1d..f4ac77da2429 100644
- --- a/include/uapi/linux/fs.h
- +++ b/include/uapi/linux/fs.h
- @@ -299,8 +299,11 @@ typedef int __bitwise __kernel_rwf_t;
- /* per-IO O_APPEND */
- #define RWF_APPEND ((__force __kernel_rwf_t)0x00000010)
- +/* drop behind cached IO */
- +#define RWF_DROPBEHIND ((__force __kernel_rwf_t)0x00000020)
- +
- /* mask of flags supported by the kernel */
- #define RWF_SUPPORTED (RWF_HIPRI | RWF_DSYNC | RWF_SYNC | RWF_NOWAIT |\
- - RWF_APPEND)
- + RWF_APPEND | RWF_DROPBEHIND)
- #endif /* _UAPI_LINUX_FS_H */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement