aboutsummaryrefslogtreecommitdiffstats
path: root/mm/filemap.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/filemap.c')
-rw-r--r--mm/filemap.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index 9b39a2390b9e..742034e56100 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2070,10 +2070,17 @@ generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
2070 loff_t size; 2070 loff_t size;
2071 2071
2072 size = i_size_read(inode); 2072 size = i_size_read(inode);
2073 retval = filemap_write_and_wait_range(mapping, iocb->ki_pos, 2073 if (iocb->ki_flags & IOCB_NOWAIT) {
2074 iocb->ki_pos + count - 1); 2074 if (filemap_range_has_page(mapping, iocb->ki_pos,
2075 if (retval < 0) 2075 iocb->ki_pos + count - 1))
2076 goto out; 2076 return -EAGAIN;
2077 } else {
2078 retval = filemap_write_and_wait_range(mapping,
2079 iocb->ki_pos,
2080 iocb->ki_pos + count - 1);
2081 if (retval < 0)
2082 goto out;
2083 }
2077 2084
2078 file_accessed(file); 2085 file_accessed(file);
2079 2086
@@ -2674,6 +2681,9 @@ inline ssize_t generic_write_checks(struct kiocb *iocb, struct iov_iter *from)
2674 2681
2675 pos = iocb->ki_pos; 2682 pos = iocb->ki_pos;
2676 2683
2684 if ((iocb->ki_flags & IOCB_NOWAIT) && !(iocb->ki_flags & IOCB_DIRECT))
2685 return -EINVAL;
2686
2677 if (limit != RLIM_INFINITY) { 2687 if (limit != RLIM_INFINITY) {
2678 if (iocb->ki_pos >= limit) { 2688 if (iocb->ki_pos >= limit) {
2679 send_sig(SIGXFSZ, current, 0); 2689 send_sig(SIGXFSZ, current, 0);
@@ -2742,9 +2752,17 @@ generic_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
2742 write_len = iov_iter_count(from); 2752 write_len = iov_iter_count(from);
2743 end = (pos + write_len - 1) >> PAGE_SHIFT; 2753 end = (pos + write_len - 1) >> PAGE_SHIFT;
2744 2754
2745 written = filemap_write_and_wait_range(mapping, pos, pos + write_len - 1); 2755 if (iocb->ki_flags & IOCB_NOWAIT) {
2746 if (written) 2756 /* If there are pages to writeback, return */
2747 goto out; 2757 if (filemap_range_has_page(inode->i_mapping, pos,
2758 pos + iov_iter_count(from)))
2759 return -EAGAIN;
2760 } else {
2761 written = filemap_write_and_wait_range(mapping, pos,
2762 pos + write_len - 1);
2763 if (written)
2764 goto out;
2765 }
2748 2766
2749 /* 2767 /*
2750 * After a write we want buffered reads to be sure to go to disk to get 2768 * After a write we want buffered reads to be sure to go to disk to get