Hi, On Mon, Jan 13, 2020 at 07:37:42AM -0800, Matthew Wilcox wrote: > From: "Matthew Wilcox (Oracle)" <willy@xxxxxxxxxxxxx> > > This will replace ->readpages with a saner interface: > - No return type (errors are ignored for read ahead anyway) > - Pages are already in the page cache when ->readpages is called > - Pages are passed in a pagevec instead of a linked list > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > --- > Documentation/filesystems/locking.rst | 8 +++++- > Documentation/filesystems/vfs.rst | 9 ++++++ > include/linux/fs.h | 3 ++ > mm/readahead.c | 40 ++++++++++++++++++++++++++- > 4 files changed, 58 insertions(+), 2 deletions(-) > > diff --git a/Documentation/filesystems/locking.rst b/Documentation/filesystems/locking.rst > index 5057e4d9dcd1..1e2f1186fd1a 100644 > --- a/Documentation/filesystems/locking.rst > +++ b/Documentation/filesystems/locking.rst > @@ -239,6 +239,8 @@ prototypes:: > int (*readpage)(struct file *, struct page *); > int (*writepages)(struct address_space *, struct writeback_control *); > int (*set_page_dirty)(struct page *page); > + int (*readahead)(struct file *, struct address_space *, > + struct pagevec *, pgoff_t index); Shouldn't this be no return type? Just trying to map your commit message to the code. > int (*readpages)(struct file *filp, struct address_space *mapping, > struct list_head *pages, unsigned nr_pages); > int (*write_begin)(struct file *, struct address_space *mapping, > @@ -271,7 +273,8 @@ writepage: yes, unlocks (see below) > readpage: yes, unlocks > writepages: > set_page_dirty no > -readpages: > +readpages: no > +readahead: yes, unlocks > write_begin: locks the page exclusive > write_end: yes, unlocks exclusive > bmap: > @@ -298,6 +301,9 @@ completion. > ->readpages() populates the pagecache with the passed pages and starts > I/O against them. They come unlocked upon I/O completion. > > +->readahead() starts I/O against the pages. They come unlocked upon > +I/O completion. > + > ->writepage() is used for two purposes: for "memory cleansing" and for > "sync". These are quite different operations and the behaviour may differ > depending upon the mode. > diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst > index 7d4d09dd5e6d..63d0f0dbbf9c 100644 > --- a/Documentation/filesystems/vfs.rst > +++ b/Documentation/filesystems/vfs.rst > @@ -706,6 +706,8 @@ cache in your filesystem. The following members are defined: > int (*readpage)(struct file *, struct page *); > int (*writepages)(struct address_space *, struct writeback_control *); > int (*set_page_dirty)(struct page *page); > + int (*readahead)(struct file *, struct address_space *, > + struct pagevec *, pgoff_t index); Same here? Maybe I just miss the point, in the case, sorry for the noise. Thanks, Daniel