Skip to content

Commit 631f871

Browse files
author
Andreas Gruenbacher
committed
fs/iomap: Fix buffered write page prefaulting
When part of the user buffer passed to generic_perform_write() or iomap_file_buffered_write() cannot be faulted in for reading, the entire write currently fails. The correct behavior would be to write all the data that can be written, up to the point of failure. Commit a629459 ("iov_iter: Turn iov_iter_fault_in_readable into fault_in_iov_iter_readable") gave us the information needed, so fix the page prefaulting in generic_perform_write() and iomap_write_iter() to only bail out when no pages could be faulted in. We already factor in that pages that are faulted in may no longer be resident by the time they are accessed. Paging out pages has the same effect as not faulting in those pages in the first place, so the code can already deal with that. Signed-off-by: Andreas Gruenbacher <[email protected]> Reviewed-by: Catalin Marinas <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]>
1 parent 42eb8fd commit 631f871

File tree

2 files changed

+2
-2
lines changed

2 files changed

+2
-2
lines changed

fs/iomap/buffered-io.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
750750
* same page as we're writing to, without it being marked
751751
* up-to-date.
752752
*/
753-
if (unlikely(fault_in_iov_iter_readable(i, bytes))) {
753+
if (unlikely(fault_in_iov_iter_readable(i, bytes) == bytes)) {
754754
status = -EFAULT;
755755
break;
756756
}

mm/filemap.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3743,7 +3743,7 @@ ssize_t generic_perform_write(struct file *file,
37433743
* same page as we're writing to, without it being marked
37443744
* up-to-date.
37453745
*/
3746-
if (unlikely(fault_in_iov_iter_readable(i, bytes))) {
3746+
if (unlikely(fault_in_iov_iter_readable(i, bytes) == bytes)) {
37473747
status = -EFAULT;
37483748
break;
37493749
}

0 commit comments

Comments
 (0)