[PATCH v2 00/16] Allow readpage to return a locked page

From: Matthew Wilcox (Oracle)
Date: Fri Oct 09 2020 - 10:32:24 EST


Linus recently made the page lock more fair. That means that the old
pattern where we returned from ->readpage with the page unlocked and
then attempted to re-lock it will send us to the back of the queue for
this page's lock.

A further benefit is that a synchronous readpage implementation allows
us to return an error to someone who might actually care about it.
There's no need to SetPageError, but I don't want to learn about how
a dozen filesystems handle I/O errors (hint: they're all different),
so I have not attempted to change that. Except for iomap.

Ideally all filesystems would return from ->readpage with the page
Uptodate and Locked, but it's a bit painful to convert all the
asynchronous readpage implementations to synchronous. The first 14
filesystems converted are already synchronous. The last two patches
convert iomap to synchronous readpage.

This patchset is against iomap-for-next. Andrew, it would make merging
the THP patchset much easier if you could merge at least the first patch
adding AOP_UPDATED_PAGE during the merge window which opens next week.

Matthew Wilcox (Oracle) (16):
mm: Add AOP_UPDATED_PAGE return value
mm: Inline wait_on_page_read into its one caller
9p: Tell the VFS that readpage was synchronous
afs: Tell the VFS that readpage was synchronous
ceph: Tell the VFS that readpage was synchronous
cifs: Tell the VFS that readpage was synchronous
cramfs: Tell the VFS that readpage was synchronous
ecryptfs: Tell the VFS that readpage was synchronous
fuse: Tell the VFS that readpage was synchronous
hostfs: Tell the VFS that readpage was synchronous
jffs2: Tell the VFS that readpage was synchronous
ubifs: Tell the VFS that readpage was synchronous
udf: Tell the VFS that readpage was synchronous
vboxsf: Tell the VFS that readpage was synchronous
iomap: Inline iomap_iop_set_range_uptodate into its one caller
iomap: Make readpage synchronous

Documentation/filesystems/locking.rst | 7 +-
Documentation/filesystems/vfs.rst | 21 ++++--
fs/9p/vfs_addr.c | 6 +-
fs/afs/file.c | 3 +-
fs/ceph/addr.c | 9 +--
fs/cifs/file.c | 8 ++-
fs/cramfs/inode.c | 5 +-
fs/ecryptfs/mmap.c | 11 ++--
fs/fuse/file.c | 2 +
fs/hostfs/hostfs_kern.c | 2 +
fs/iomap/buffered-io.c | 92 ++++++++++++++-------------
fs/jffs2/file.c | 6 +-
fs/ubifs/file.c | 16 +++--
fs/udf/file.c | 3 +-
fs/vboxsf/file.c | 2 +
include/linux/fs.h | 5 ++
mm/filemap.c | 33 +++++-----
17 files changed, 135 insertions(+), 96 deletions(-)

--
2.28.0