All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthew Wilcox <willy@infradead.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>,
	linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org,
	linux-erofs@lists.ozlabs.org, linux-ext4@vger.kernel.org,
	linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com,
	ocfs2-devel@oss.oracle.com, linux-xfs@vger.kernel.org,
	John Hubbard <jhubbard@nvidia.com>,
	Christoph Hellwig <hch@lst.de>,
	William Kucharski <william.kucharski@oracle.com>
Subject: [PATCH v11 11/25] mm: Add readahead address space operation
Date: Tue, 14 Apr 2020 08:02:19 -0700	[thread overview]
Message-ID: <20200414150233.24495-12-willy@infradead.org> (raw)
In-Reply-To: <20200414150233.24495-1-willy@infradead.org>

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

This replaces ->readpages with a saner interface:
 - Return void instead of an ignored error code.
 - Page cache is already populated with locked pages when ->readahead
   is called.
 - New arguments can be passed to the implementation without changing
   all the filesystems that use a common helper function like
   mpage_readahead().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
---
 Documentation/filesystems/locking.rst |  6 +++++-
 Documentation/filesystems/vfs.rst     | 15 +++++++++++++++
 include/linux/fs.h                    |  2 ++
 mm/readahead.c                        | 12 ++++++++++--
 4 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/Documentation/filesystems/locking.rst b/Documentation/filesystems/locking.rst
index 5057e4d9dcd1..0af2e0e11461 100644
--- a/Documentation/filesystems/locking.rst
+++ b/Documentation/filesystems/locking.rst
@@ -239,6 +239,7 @@ prototypes::
 	int (*readpage)(struct file *, struct page *);
 	int (*writepages)(struct address_space *, struct writeback_control *);
 	int (*set_page_dirty)(struct page *page);
+	void (*readahead)(struct readahead_control *);
 	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 +272,8 @@ writepage:		yes, unlocks (see below)
 readpage:		yes, unlocks
 writepages:
 set_page_dirty		no
-readpages:
+readahead:		yes, unlocks
+readpages:		no
 write_begin:		locks the page		 exclusive
 write_end:		yes, unlocks		 exclusive
 bmap:
@@ -295,6 +297,8 @@ the request handler (/dev/loop).
 ->readpage() unlocks the page, either synchronously or via I/O
 completion.
 
+->readahead() unlocks the pages that I/O is attempted on like ->readpage().
+
 ->readpages() populates the pagecache with the passed pages and starts
 I/O against them.  They come unlocked upon I/O completion.
 
diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst
index 7d4d09dd5e6d..ed17771c212b 100644
--- a/Documentation/filesystems/vfs.rst
+++ b/Documentation/filesystems/vfs.rst
@@ -706,6 +706,7 @@ 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);
+		void (*readahead)(struct readahead_control *);
 		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,
@@ -781,12 +782,26 @@ cache in your filesystem.  The following members are defined:
 	If defined, it should set the PageDirty flag, and the
 	PAGECACHE_TAG_DIRTY tag in the radix tree.
 
+``readahead``
+	Called by the VM to read pages associated with the address_space
+	object.  The pages are consecutive in the page cache and are
+	locked.  The implementation should decrement the page refcount
+	after starting I/O on each page.  Usually the page will be
+	unlocked by the I/O completion handler.  If the filesystem decides
+	to stop attempting I/O before reaching the end of the readahead
+	window, it can simply return.  The caller will decrement the page
+	refcount and unlock the remaining pages for you.  Set PageUptodate
+	if the I/O completes successfully.  Setting PageError on any page
+	will be ignored; simply unlock the page if an I/O error occurs.
+
 ``readpages``
 	called by the VM to read pages associated with the address_space
 	object.  This is essentially just a vector version of readpage.
 	Instead of just one page, several pages are requested.
 	readpages is only used for read-ahead, so read errors are
 	ignored.  If anything goes wrong, feel free to give up.
+	This interface is deprecated and will be removed by the end of
+	2020; implement readahead instead.
 
 ``write_begin``
 	Called by the generic buffered write code to ask the filesystem
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 4f6f59b4f22a..55c743925c40 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -292,6 +292,7 @@ enum positive_aop_returns {
 struct page;
 struct address_space;
 struct writeback_control;
+struct readahead_control;
 
 /*
  * Write life time hint values.
@@ -375,6 +376,7 @@ struct address_space_operations {
 	 */
 	int (*readpages)(struct file *filp, struct address_space *mapping,
 			struct list_head *pages, unsigned nr_pages);
+	void (*readahead)(struct readahead_control *);
 
 	int (*write_begin)(struct file *, struct address_space *mapping,
 				loff_t pos, unsigned len, unsigned flags,
diff --git a/mm/readahead.c b/mm/readahead.c
index e52b3a7b9da5..d01531ef9f3c 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -125,7 +125,14 @@ static void read_pages(struct readahead_control *rac, struct list_head *pages,
 
 	blk_start_plug(&plug);
 
-	if (aops->readpages) {
+	if (aops->readahead) {
+		aops->readahead(rac);
+		/* Clean up the remaining pages */
+		while ((page = readahead_page(rac))) {
+			unlock_page(page);
+			put_page(page);
+		}
+	} else if (aops->readpages) {
 		aops->readpages(rac->file, rac->mapping, pages,
 				readahead_count(rac));
 		/* Clean up the remaining pages */
@@ -233,7 +240,8 @@ void force_page_cache_readahead(struct address_space *mapping,
 	struct file_ra_state *ra = &filp->f_ra;
 	unsigned long max_pages;
 
-	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages))
+	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages &&
+			!mapping->a_ops->readahead))
 		return;
 
 	/*
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>,
	linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	linux-kernel@vger.kernel.org, linux-btrfs@vger.kernel.org,
	linux-erofs@lists.ozlabs.org, linux-ext4@vger.kernel.org,
	linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com,
	ocfs2-devel@oss.oracle.com, linux-xfs@vger.kernel.org,
	John Hubbard <jhubbard@nvidia.com>,
	Christoph Hellwig <hch@lst.de>,
	William Kucharski <william.kucharski@oracle.com>
Subject: [Ocfs2-devel] [PATCH v11 11/25] mm: Add readahead address space operation
Date: Tue, 14 Apr 2020 08:02:19 -0700	[thread overview]
Message-ID: <20200414150233.24495-12-willy@infradead.org> (raw)
In-Reply-To: <20200414150233.24495-1-willy@infradead.org>

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

This replaces ->readpages with a saner interface:
 - Return void instead of an ignored error code.
 - Page cache is already populated with locked pages when ->readahead
   is called.
 - New arguments can be passed to the implementation without changing
   all the filesystems that use a common helper function like
   mpage_readahead().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
---
 Documentation/filesystems/locking.rst |  6 +++++-
 Documentation/filesystems/vfs.rst     | 15 +++++++++++++++
 include/linux/fs.h                    |  2 ++
 mm/readahead.c                        | 12 ++++++++++--
 4 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/Documentation/filesystems/locking.rst b/Documentation/filesystems/locking.rst
index 5057e4d9dcd1..0af2e0e11461 100644
--- a/Documentation/filesystems/locking.rst
+++ b/Documentation/filesystems/locking.rst
@@ -239,6 +239,7 @@ prototypes::
 	int (*readpage)(struct file *, struct page *);
 	int (*writepages)(struct address_space *, struct writeback_control *);
 	int (*set_page_dirty)(struct page *page);
+	void (*readahead)(struct readahead_control *);
 	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 +272,8 @@ writepage:		yes, unlocks (see below)
 readpage:		yes, unlocks
 writepages:
 set_page_dirty		no
-readpages:
+readahead:		yes, unlocks
+readpages:		no
 write_begin:		locks the page		 exclusive
 write_end:		yes, unlocks		 exclusive
 bmap:
@@ -295,6 +297,8 @@ the request handler (/dev/loop).
 ->readpage() unlocks the page, either synchronously or via I/O
 completion.
 
+->readahead() unlocks the pages that I/O is attempted on like ->readpage().
+
 ->readpages() populates the pagecache with the passed pages and starts
 I/O against them.  They come unlocked upon I/O completion.
 
diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst
index 7d4d09dd5e6d..ed17771c212b 100644
--- a/Documentation/filesystems/vfs.rst
+++ b/Documentation/filesystems/vfs.rst
@@ -706,6 +706,7 @@ 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);
+		void (*readahead)(struct readahead_control *);
 		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,
@@ -781,12 +782,26 @@ cache in your filesystem.  The following members are defined:
 	If defined, it should set the PageDirty flag, and the
 	PAGECACHE_TAG_DIRTY tag in the radix tree.
 
+``readahead``
+	Called by the VM to read pages associated with the address_space
+	object.  The pages are consecutive in the page cache and are
+	locked.  The implementation should decrement the page refcount
+	after starting I/O on each page.  Usually the page will be
+	unlocked by the I/O completion handler.  If the filesystem decides
+	to stop attempting I/O before reaching the end of the readahead
+	window, it can simply return.  The caller will decrement the page
+	refcount and unlock the remaining pages for you.  Set PageUptodate
+	if the I/O completes successfully.  Setting PageError on any page
+	will be ignored; simply unlock the page if an I/O error occurs.
+
 ``readpages``
 	called by the VM to read pages associated with the address_space
 	object.  This is essentially just a vector version of readpage.
 	Instead of just one page, several pages are requested.
 	readpages is only used for read-ahead, so read errors are
 	ignored.  If anything goes wrong, feel free to give up.
+	This interface is deprecated and will be removed by the end of
+	2020; implement readahead instead.
 
 ``write_begin``
 	Called by the generic buffered write code to ask the filesystem
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 4f6f59b4f22a..55c743925c40 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -292,6 +292,7 @@ enum positive_aop_returns {
 struct page;
 struct address_space;
 struct writeback_control;
+struct readahead_control;
 
 /*
  * Write life time hint values.
@@ -375,6 +376,7 @@ struct address_space_operations {
 	 */
 	int (*readpages)(struct file *filp, struct address_space *mapping,
 			struct list_head *pages, unsigned nr_pages);
+	void (*readahead)(struct readahead_control *);
 
 	int (*write_begin)(struct file *, struct address_space *mapping,
 				loff_t pos, unsigned len, unsigned flags,
diff --git a/mm/readahead.c b/mm/readahead.c
index e52b3a7b9da5..d01531ef9f3c 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -125,7 +125,14 @@ static void read_pages(struct readahead_control *rac, struct list_head *pages,
 
 	blk_start_plug(&plug);
 
-	if (aops->readpages) {
+	if (aops->readahead) {
+		aops->readahead(rac);
+		/* Clean up the remaining pages */
+		while ((page = readahead_page(rac))) {
+			unlock_page(page);
+			put_page(page);
+		}
+	} else if (aops->readpages) {
 		aops->readpages(rac->file, rac->mapping, pages,
 				readahead_count(rac));
 		/* Clean up the remaining pages */
@@ -233,7 +240,8 @@ void force_page_cache_readahead(struct address_space *mapping,
 	struct file_ra_state *ra = &filp->f_ra;
 	unsigned long max_pages;
 
-	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages))
+	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages &&
+			!mapping->a_ops->readahead))
 		return;
 
 	/*
-- 
2.25.1

WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-xfs@vger.kernel.org,
	William Kucharski <william.kucharski@oracle.com>,
	John Hubbard <jhubbard@nvidia.com>,
	linux-kernel@vger.kernel.org,
	"Matthew Wilcox \(Oracle\)" <willy@infradead.org>,
	linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com,
	linux-mm@kvack.org, ocfs2-devel@oss.oracle.com,
	linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org,
	linux-erofs@lists.ozlabs.org, Christoph Hellwig <hch@lst.de>,
	linux-btrfs@vger.kernel.org
Subject: [f2fs-dev] [PATCH v11 11/25] mm: Add readahead address space operation
Date: Tue, 14 Apr 2020 08:02:19 -0700	[thread overview]
Message-ID: <20200414150233.24495-12-willy@infradead.org> (raw)
In-Reply-To: <20200414150233.24495-1-willy@infradead.org>

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

This replaces ->readpages with a saner interface:
 - Return void instead of an ignored error code.
 - Page cache is already populated with locked pages when ->readahead
   is called.
 - New arguments can be passed to the implementation without changing
   all the filesystems that use a common helper function like
   mpage_readahead().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
---
 Documentation/filesystems/locking.rst |  6 +++++-
 Documentation/filesystems/vfs.rst     | 15 +++++++++++++++
 include/linux/fs.h                    |  2 ++
 mm/readahead.c                        | 12 ++++++++++--
 4 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/Documentation/filesystems/locking.rst b/Documentation/filesystems/locking.rst
index 5057e4d9dcd1..0af2e0e11461 100644
--- a/Documentation/filesystems/locking.rst
+++ b/Documentation/filesystems/locking.rst
@@ -239,6 +239,7 @@ prototypes::
 	int (*readpage)(struct file *, struct page *);
 	int (*writepages)(struct address_space *, struct writeback_control *);
 	int (*set_page_dirty)(struct page *page);
+	void (*readahead)(struct readahead_control *);
 	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 +272,8 @@ writepage:		yes, unlocks (see below)
 readpage:		yes, unlocks
 writepages:
 set_page_dirty		no
-readpages:
+readahead:		yes, unlocks
+readpages:		no
 write_begin:		locks the page		 exclusive
 write_end:		yes, unlocks		 exclusive
 bmap:
@@ -295,6 +297,8 @@ the request handler (/dev/loop).
 ->readpage() unlocks the page, either synchronously or via I/O
 completion.
 
+->readahead() unlocks the pages that I/O is attempted on like ->readpage().
+
 ->readpages() populates the pagecache with the passed pages and starts
 I/O against them.  They come unlocked upon I/O completion.
 
diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst
index 7d4d09dd5e6d..ed17771c212b 100644
--- a/Documentation/filesystems/vfs.rst
+++ b/Documentation/filesystems/vfs.rst
@@ -706,6 +706,7 @@ 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);
+		void (*readahead)(struct readahead_control *);
 		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,
@@ -781,12 +782,26 @@ cache in your filesystem.  The following members are defined:
 	If defined, it should set the PageDirty flag, and the
 	PAGECACHE_TAG_DIRTY tag in the radix tree.
 
+``readahead``
+	Called by the VM to read pages associated with the address_space
+	object.  The pages are consecutive in the page cache and are
+	locked.  The implementation should decrement the page refcount
+	after starting I/O on each page.  Usually the page will be
+	unlocked by the I/O completion handler.  If the filesystem decides
+	to stop attempting I/O before reaching the end of the readahead
+	window, it can simply return.  The caller will decrement the page
+	refcount and unlock the remaining pages for you.  Set PageUptodate
+	if the I/O completes successfully.  Setting PageError on any page
+	will be ignored; simply unlock the page if an I/O error occurs.
+
 ``readpages``
 	called by the VM to read pages associated with the address_space
 	object.  This is essentially just a vector version of readpage.
 	Instead of just one page, several pages are requested.
 	readpages is only used for read-ahead, so read errors are
 	ignored.  If anything goes wrong, feel free to give up.
+	This interface is deprecated and will be removed by the end of
+	2020; implement readahead instead.
 
 ``write_begin``
 	Called by the generic buffered write code to ask the filesystem
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 4f6f59b4f22a..55c743925c40 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -292,6 +292,7 @@ enum positive_aop_returns {
 struct page;
 struct address_space;
 struct writeback_control;
+struct readahead_control;
 
 /*
  * Write life time hint values.
@@ -375,6 +376,7 @@ struct address_space_operations {
 	 */
 	int (*readpages)(struct file *filp, struct address_space *mapping,
 			struct list_head *pages, unsigned nr_pages);
+	void (*readahead)(struct readahead_control *);
 
 	int (*write_begin)(struct file *, struct address_space *mapping,
 				loff_t pos, unsigned len, unsigned flags,
diff --git a/mm/readahead.c b/mm/readahead.c
index e52b3a7b9da5..d01531ef9f3c 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -125,7 +125,14 @@ static void read_pages(struct readahead_control *rac, struct list_head *pages,
 
 	blk_start_plug(&plug);
 
-	if (aops->readpages) {
+	if (aops->readahead) {
+		aops->readahead(rac);
+		/* Clean up the remaining pages */
+		while ((page = readahead_page(rac))) {
+			unlock_page(page);
+			put_page(page);
+		}
+	} else if (aops->readpages) {
 		aops->readpages(rac->file, rac->mapping, pages,
 				readahead_count(rac));
 		/* Clean up the remaining pages */
@@ -233,7 +240,8 @@ void force_page_cache_readahead(struct address_space *mapping,
 	struct file_ra_state *ra = &filp->f_ra;
 	unsigned long max_pages;
 
-	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages))
+	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages &&
+			!mapping->a_ops->readahead))
 		return;
 
 	/*
-- 
2.25.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-xfs@vger.kernel.org,
	William Kucharski <william.kucharski@oracle.com>,
	John Hubbard <jhubbard@nvidia.com>,
	linux-kernel@vger.kernel.org,
	"Matthew Wilcox \(Oracle\)" <willy@infradead.org>,
	linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com,
	linux-mm@kvack.org, ocfs2-devel@oss.oracle.com,
	linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org,
	linux-erofs@lists.ozlabs.org, Christoph Hellwig <hch@lst.de>,
	linux-btrfs@vger.kernel.org
Subject: [PATCH v11 11/25] mm: Add readahead address space operation
Date: Tue, 14 Apr 2020 08:02:19 -0700	[thread overview]
Message-ID: <20200414150233.24495-12-willy@infradead.org> (raw)
In-Reply-To: <20200414150233.24495-1-willy@infradead.org>

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

This replaces ->readpages with a saner interface:
 - Return void instead of an ignored error code.
 - Page cache is already populated with locked pages when ->readahead
   is called.
 - New arguments can be passed to the implementation without changing
   all the filesystems that use a common helper function like
   mpage_readahead().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
---
 Documentation/filesystems/locking.rst |  6 +++++-
 Documentation/filesystems/vfs.rst     | 15 +++++++++++++++
 include/linux/fs.h                    |  2 ++
 mm/readahead.c                        | 12 ++++++++++--
 4 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/Documentation/filesystems/locking.rst b/Documentation/filesystems/locking.rst
index 5057e4d9dcd1..0af2e0e11461 100644
--- a/Documentation/filesystems/locking.rst
+++ b/Documentation/filesystems/locking.rst
@@ -239,6 +239,7 @@ prototypes::
 	int (*readpage)(struct file *, struct page *);
 	int (*writepages)(struct address_space *, struct writeback_control *);
 	int (*set_page_dirty)(struct page *page);
+	void (*readahead)(struct readahead_control *);
 	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 +272,8 @@ writepage:		yes, unlocks (see below)
 readpage:		yes, unlocks
 writepages:
 set_page_dirty		no
-readpages:
+readahead:		yes, unlocks
+readpages:		no
 write_begin:		locks the page		 exclusive
 write_end:		yes, unlocks		 exclusive
 bmap:
@@ -295,6 +297,8 @@ the request handler (/dev/loop).
 ->readpage() unlocks the page, either synchronously or via I/O
 completion.
 
+->readahead() unlocks the pages that I/O is attempted on like ->readpage().
+
 ->readpages() populates the pagecache with the passed pages and starts
 I/O against them.  They come unlocked upon I/O completion.
 
diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst
index 7d4d09dd5e6d..ed17771c212b 100644
--- a/Documentation/filesystems/vfs.rst
+++ b/Documentation/filesystems/vfs.rst
@@ -706,6 +706,7 @@ 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);
+		void (*readahead)(struct readahead_control *);
 		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,
@@ -781,12 +782,26 @@ cache in your filesystem.  The following members are defined:
 	If defined, it should set the PageDirty flag, and the
 	PAGECACHE_TAG_DIRTY tag in the radix tree.
 
+``readahead``
+	Called by the VM to read pages associated with the address_space
+	object.  The pages are consecutive in the page cache and are
+	locked.  The implementation should decrement the page refcount
+	after starting I/O on each page.  Usually the page will be
+	unlocked by the I/O completion handler.  If the filesystem decides
+	to stop attempting I/O before reaching the end of the readahead
+	window, it can simply return.  The caller will decrement the page
+	refcount and unlock the remaining pages for you.  Set PageUptodate
+	if the I/O completes successfully.  Setting PageError on any page
+	will be ignored; simply unlock the page if an I/O error occurs.
+
 ``readpages``
 	called by the VM to read pages associated with the address_space
 	object.  This is essentially just a vector version of readpage.
 	Instead of just one page, several pages are requested.
 	readpages is only used for read-ahead, so read errors are
 	ignored.  If anything goes wrong, feel free to give up.
+	This interface is deprecated and will be removed by the end of
+	2020; implement readahead instead.
 
 ``write_begin``
 	Called by the generic buffered write code to ask the filesystem
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 4f6f59b4f22a..55c743925c40 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -292,6 +292,7 @@ enum positive_aop_returns {
 struct page;
 struct address_space;
 struct writeback_control;
+struct readahead_control;
 
 /*
  * Write life time hint values.
@@ -375,6 +376,7 @@ struct address_space_operations {
 	 */
 	int (*readpages)(struct file *filp, struct address_space *mapping,
 			struct list_head *pages, unsigned nr_pages);
+	void (*readahead)(struct readahead_control *);
 
 	int (*write_begin)(struct file *, struct address_space *mapping,
 				loff_t pos, unsigned len, unsigned flags,
diff --git a/mm/readahead.c b/mm/readahead.c
index e52b3a7b9da5..d01531ef9f3c 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -125,7 +125,14 @@ static void read_pages(struct readahead_control *rac, struct list_head *pages,
 
 	blk_start_plug(&plug);
 
-	if (aops->readpages) {
+	if (aops->readahead) {
+		aops->readahead(rac);
+		/* Clean up the remaining pages */
+		while ((page = readahead_page(rac))) {
+			unlock_page(page);
+			put_page(page);
+		}
+	} else if (aops->readpages) {
 		aops->readpages(rac->file, rac->mapping, pages,
 				readahead_count(rac));
 		/* Clean up the remaining pages */
@@ -233,7 +240,8 @@ void force_page_cache_readahead(struct address_space *mapping,
 	struct file_ra_state *ra = &filp->f_ra;
 	unsigned long max_pages;
 
-	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages))
+	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages &&
+			!mapping->a_ops->readahead))
 		return;
 
 	/*
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH v11 11/25] mm: Add readahead address space operation
Date: Tue, 14 Apr 2020 08:02:19 -0700	[thread overview]
Message-ID: <20200414150233.24495-12-willy@infradead.org> (raw)
In-Reply-To: <20200414150233.24495-1-willy@infradead.org>

From: "Matthew Wilcox (Oracle)" <willy@infradead.org>

This replaces ->readpages with a saner interface:
 - Return void instead of an ignored error code.
 - Page cache is already populated with locked pages when ->readahead
   is called.
 - New arguments can be passed to the implementation without changing
   all the filesystems that use a common helper function like
   mpage_readahead().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: John Hubbard <jhubbard@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: William Kucharski <william.kucharski@oracle.com>
---
 Documentation/filesystems/locking.rst |  6 +++++-
 Documentation/filesystems/vfs.rst     | 15 +++++++++++++++
 include/linux/fs.h                    |  2 ++
 mm/readahead.c                        | 12 ++++++++++--
 4 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/Documentation/filesystems/locking.rst b/Documentation/filesystems/locking.rst
index 5057e4d9dcd1..0af2e0e11461 100644
--- a/Documentation/filesystems/locking.rst
+++ b/Documentation/filesystems/locking.rst
@@ -239,6 +239,7 @@ prototypes::
 	int (*readpage)(struct file *, struct page *);
 	int (*writepages)(struct address_space *, struct writeback_control *);
 	int (*set_page_dirty)(struct page *page);
+	void (*readahead)(struct readahead_control *);
 	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 +272,8 @@ writepage:		yes, unlocks (see below)
 readpage:		yes, unlocks
 writepages:
 set_page_dirty		no
-readpages:
+readahead:		yes, unlocks
+readpages:		no
 write_begin:		locks the page		 exclusive
 write_end:		yes, unlocks		 exclusive
 bmap:
@@ -295,6 +297,8 @@ the request handler (/dev/loop).
 ->readpage() unlocks the page, either synchronously or via I/O
 completion.
 
+->readahead() unlocks the pages that I/O is attempted on like ->readpage().
+
 ->readpages() populates the pagecache with the passed pages and starts
 I/O against them.  They come unlocked upon I/O completion.
 
diff --git a/Documentation/filesystems/vfs.rst b/Documentation/filesystems/vfs.rst
index 7d4d09dd5e6d..ed17771c212b 100644
--- a/Documentation/filesystems/vfs.rst
+++ b/Documentation/filesystems/vfs.rst
@@ -706,6 +706,7 @@ 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);
+		void (*readahead)(struct readahead_control *);
 		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,
@@ -781,12 +782,26 @@ cache in your filesystem.  The following members are defined:
 	If defined, it should set the PageDirty flag, and the
 	PAGECACHE_TAG_DIRTY tag in the radix tree.
 
+``readahead``
+	Called by the VM to read pages associated with the address_space
+	object.  The pages are consecutive in the page cache and are
+	locked.  The implementation should decrement the page refcount
+	after starting I/O on each page.  Usually the page will be
+	unlocked by the I/O completion handler.  If the filesystem decides
+	to stop attempting I/O before reaching the end of the readahead
+	window, it can simply return.  The caller will decrement the page
+	refcount and unlock the remaining pages for you.  Set PageUptodate
+	if the I/O completes successfully.  Setting PageError on any page
+	will be ignored; simply unlock the page if an I/O error occurs.
+
 ``readpages``
 	called by the VM to read pages associated with the address_space
 	object.  This is essentially just a vector version of readpage.
 	Instead of just one page, several pages are requested.
 	readpages is only used for read-ahead, so read errors are
 	ignored.  If anything goes wrong, feel free to give up.
+	This interface is deprecated and will be removed by the end of
+	2020; implement readahead instead.
 
 ``write_begin``
 	Called by the generic buffered write code to ask the filesystem
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 4f6f59b4f22a..55c743925c40 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -292,6 +292,7 @@ enum positive_aop_returns {
 struct page;
 struct address_space;
 struct writeback_control;
+struct readahead_control;
 
 /*
  * Write life time hint values.
@@ -375,6 +376,7 @@ struct address_space_operations {
 	 */
 	int (*readpages)(struct file *filp, struct address_space *mapping,
 			struct list_head *pages, unsigned nr_pages);
+	void (*readahead)(struct readahead_control *);
 
 	int (*write_begin)(struct file *, struct address_space *mapping,
 				loff_t pos, unsigned len, unsigned flags,
diff --git a/mm/readahead.c b/mm/readahead.c
index e52b3a7b9da5..d01531ef9f3c 100644
--- a/mm/readahead.c
+++ b/mm/readahead.c
@@ -125,7 +125,14 @@ static void read_pages(struct readahead_control *rac, struct list_head *pages,
 
 	blk_start_plug(&plug);
 
-	if (aops->readpages) {
+	if (aops->readahead) {
+		aops->readahead(rac);
+		/* Clean up the remaining pages */
+		while ((page = readahead_page(rac))) {
+			unlock_page(page);
+			put_page(page);
+		}
+	} else if (aops->readpages) {
 		aops->readpages(rac->file, rac->mapping, pages,
 				readahead_count(rac));
 		/* Clean up the remaining pages */
@@ -233,7 +240,8 @@ void force_page_cache_readahead(struct address_space *mapping,
 	struct file_ra_state *ra = &filp->f_ra;
 	unsigned long max_pages;
 
-	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages))
+	if (unlikely(!mapping->a_ops->readpage && !mapping->a_ops->readpages &&
+			!mapping->a_ops->readahead))
 		return;
 
 	/*
-- 
2.25.1




  parent reply	other threads:[~2020-04-14 15:16 UTC|newest]

Thread overview: 243+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-14 15:02 [PATCH v11 00/25] Change readahead API Matthew Wilcox
2020-04-14 15:02 ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02 ` Matthew Wilcox
2020-04-14 15:02 ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02 ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 01/25] mm: Move readahead prototypes from mm.h Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-15  9:10   ` Johannes Thumshirn
2020-04-15  9:10     ` [Cluster-devel] " Johannes Thumshirn
2020-04-15  9:10     ` Johannes Thumshirn
2020-04-15  9:10     ` [f2fs-dev] " Johannes Thumshirn
2020-04-15  9:10     ` Johannes Thumshirn
2020-04-15  9:10     ` [Ocfs2-devel] " Johannes Thumshirn
2020-04-14 15:02 ` [PATCH v11 02/25] mm: Return void from various readahead functions Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 03/25] mm: Ignore return value of ->readpages Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-15  9:17   ` Johannes Thumshirn
2020-04-15  9:17     ` [Cluster-devel] " Johannes Thumshirn
2020-04-15  9:17     ` Johannes Thumshirn
2020-04-15  9:17     ` [f2fs-dev] " Johannes Thumshirn
2020-04-15  9:17     ` Johannes Thumshirn
2020-04-15  9:17     ` [Ocfs2-devel] " Johannes Thumshirn
2020-04-14 15:02 ` [PATCH v11 04/25] mm: Move readahead nr_pages check into read_pages Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-15  9:19   ` Johannes Thumshirn
2020-04-15  9:19     ` [Cluster-devel] " Johannes Thumshirn
2020-04-15  9:19     ` Johannes Thumshirn
2020-04-15  9:19     ` [f2fs-dev] " Johannes Thumshirn
2020-04-15  9:19     ` Johannes Thumshirn
2020-04-15  9:19     ` [Ocfs2-devel] " Johannes Thumshirn
2020-04-14 15:02 ` [PATCH v11 05/25] mm: Add new readahead_control API Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-15  1:17   ` Andrew Morton
2020-04-15  1:17     ` [Cluster-devel] " Andrew Morton
2020-04-15  1:17     ` Andrew Morton
2020-04-15  1:17     ` [f2fs-dev] " Andrew Morton
2020-04-15  1:17     ` [Ocfs2-devel] " Andrew Morton
2020-04-15  2:18     ` Matthew Wilcox
2020-04-15  2:18       ` [Cluster-devel] " Matthew Wilcox
2020-04-15  2:18       ` Matthew Wilcox
2020-04-15  2:18       ` [f2fs-dev] " Matthew Wilcox
2020-04-15  2:18       ` [Ocfs2-devel] " Matthew Wilcox
2020-04-15  4:56       ` Andrew Morton
2020-04-15  4:56         ` [Cluster-devel] " Andrew Morton
2020-04-15  4:56         ` Andrew Morton
2020-04-15  4:56         ` [f2fs-dev] " Andrew Morton
2020-04-15  4:56         ` [Ocfs2-devel] " Andrew Morton
2020-04-15 11:22         ` Matthew Wilcox
2020-04-15 11:22           ` [Cluster-devel] " Matthew Wilcox
2020-04-15 11:22           ` Matthew Wilcox
2020-04-15 11:22           ` [f2fs-dev] " Matthew Wilcox
2020-04-15 11:22           ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 06/25] mm: Use readahead_control to pass arguments Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-15  9:30   ` Johannes Thumshirn
2020-04-15  9:30     ` [Cluster-devel] " Johannes Thumshirn
2020-04-15  9:30     ` Johannes Thumshirn
2020-04-15  9:30     ` [f2fs-dev] " Johannes Thumshirn
2020-04-15  9:30     ` Johannes Thumshirn
2020-04-15  9:30     ` [Ocfs2-devel] " Johannes Thumshirn
2020-04-14 15:02 ` [PATCH v11 07/25] mm: Rename various 'offset' parameters to 'index' Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 08/25] mm: rename readahead loop variable to 'i' Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-15  9:31   ` Johannes Thumshirn
2020-04-15  9:31     ` [Cluster-devel] " Johannes Thumshirn
2020-04-15  9:31     ` Johannes Thumshirn
2020-04-15  9:31     ` [f2fs-dev] " Johannes Thumshirn
2020-04-15  9:31     ` Johannes Thumshirn
2020-04-15  9:31     ` [Ocfs2-devel] " Johannes Thumshirn
2020-04-14 15:02 ` [PATCH v11 09/25] mm: Remove 'page_offset' from readahead loop Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 10/25] mm: Put readahead pages in cache earlier Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` Matthew Wilcox [this message]
2020-04-14 15:02   ` [Cluster-devel] [PATCH v11 11/25] mm: Add readahead address space operation Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 12/25] mm: Move end_index check out of readahead loop Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 13/25] mm: Add page_cache_readahead_unbounded Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 14/25] mm: Document why we don't set PageReadahead Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 15/25] mm: Use memalloc_nofs_save in readahead path Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 16/25] fs: Convert mpage_readpages to mpage_readahead Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-06-16 22:36   ` [Cluster-devel] " Andreas Gruenbacher
2020-06-16 22:36     ` Andreas Gruenbacher
2020-06-16 22:36     ` Andreas Gruenbacher
2020-06-16 22:36     ` [f2fs-dev] " Andreas Gruenbacher
2020-06-16 22:36     ` Andreas Gruenbacher
2020-06-16 22:36     ` [Ocfs2-devel] " Andreas Gruenbacher
2020-06-17  0:32     ` Matthew Wilcox
2020-06-17  0:32       ` Matthew Wilcox
2020-06-17  0:32       ` Matthew Wilcox
2020-06-17  0:32       ` [f2fs-dev] " Matthew Wilcox
2020-06-17  0:32       ` [Ocfs2-devel] " Matthew Wilcox
2020-06-17  0:57       ` Andreas Grünbacher
2020-06-17  0:57         ` Andreas Grünbacher
2020-06-17  0:57         ` Andreas Grünbacher
2020-06-17  0:57         ` [f2fs-dev] " Andreas Grünbacher
2020-06-17  0:57         ` Andreas Grünbacher
2020-06-17  0:57         ` [Ocfs2-devel] " Andreas Grünbacher
2020-06-17  2:21         ` Matthew Wilcox
2020-06-17  2:21           ` Matthew Wilcox
2020-06-17  2:21           ` Matthew Wilcox
2020-06-17  2:21           ` [f2fs-dev] " Matthew Wilcox
2020-06-17  2:21           ` [Ocfs2-devel] " Matthew Wilcox
2020-06-18 12:46           ` Andreas Gruenbacher
2020-06-18 12:46             ` Andreas Gruenbacher
2020-06-18 12:46             ` Andreas Gruenbacher
2020-06-18 12:46             ` [f2fs-dev] " Andreas Gruenbacher
2020-06-18 12:46             ` [Ocfs2-devel] " Andreas Gruenbacher
2020-06-18 15:03             ` Matthew Wilcox
2020-06-18 15:03               ` Matthew Wilcox
2020-06-18 15:03               ` Matthew Wilcox
2020-06-18 15:03               ` [f2fs-dev] " Matthew Wilcox
2020-06-18 15:03               ` [Ocfs2-devel] " Matthew Wilcox
2020-06-18 16:40               ` Andreas Gruenbacher
2020-06-18 16:40                 ` Andreas Gruenbacher
2020-06-18 16:40                 ` Andreas Gruenbacher
2020-06-18 16:40                 ` [f2fs-dev] " Andreas Gruenbacher
2020-06-18 16:40                 ` [Ocfs2-devel] " Andreas Gruenbacher
2020-04-14 15:02 ` [PATCH v11 17/25] btrfs: Convert from readpages to readahead Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 18/25] erofs: Convert uncompressed files " Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 19/25] erofs: Convert compressed " Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-21  5:42   ` Andrew Morton
2020-04-21  5:42     ` [Cluster-devel] " Andrew Morton
2020-04-21  5:42     ` Andrew Morton
2020-04-21  5:42     ` [f2fs-dev] " Andrew Morton
2020-04-21  5:42     ` [Ocfs2-devel] " Andrew Morton
2020-04-21  7:28     ` Gao Xiang
2020-04-21  7:28       ` [Cluster-devel] " Gao Xiang
2020-04-21  7:28       ` Gao Xiang via Linux-erofs
2020-04-21  7:28       ` [f2fs-dev] " Gao Xiang via Linux-f2fs-devel
2020-04-21  7:28       ` [Ocfs2-devel] " Gao Xiang
2020-04-14 15:02 ` [PATCH v11 20/25] ext4: Convert " Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 21/25] ext4: Pass the inode to ext4_mpage_readpages Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 22/25] f2fs: Convert from readpages to readahead Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 23/25] f2fs: Pass the inode to f2fs_mpage_readpages Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 15:02 ` [PATCH v11 24/25] fuse: Convert from readpages to readahead Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox
2020-04-14 22:07   ` kbuild test robot
2020-04-20 11:14   ` Miklos Szeredi
2020-04-20 11:14     ` [Cluster-devel] " Miklos Szeredi
2020-04-20 11:14     ` Miklos Szeredi
2020-04-20 11:14     ` [f2fs-dev] " Miklos Szeredi
2020-04-20 11:14     ` [Ocfs2-devel] " Miklos Szeredi
2020-04-20 11:43     ` Matthew Wilcox
2020-04-20 11:43       ` [Cluster-devel] " Matthew Wilcox
2020-04-20 11:43       ` Matthew Wilcox
2020-04-20 11:43       ` [f2fs-dev] " Matthew Wilcox
2020-04-20 11:43       ` [Ocfs2-devel] " Matthew Wilcox
2020-04-20 11:54       ` Miklos Szeredi
2020-04-20 11:54         ` [Cluster-devel] " Miklos Szeredi
2020-04-20 11:54         ` Miklos Szeredi
2020-04-20 11:54         ` [f2fs-dev] " Miklos Szeredi
2020-04-20 11:54         ` [Ocfs2-devel] " Miklos Szeredi
2020-04-14 15:02 ` [PATCH v11 25/25] iomap: " Matthew Wilcox
2020-04-14 15:02   ` [Cluster-devel] " Matthew Wilcox
2020-04-14 15:02   ` Matthew Wilcox
2020-04-14 15:02   ` [f2fs-dev] " Matthew Wilcox
2020-04-14 15:02   ` [Ocfs2-devel] " Matthew Wilcox

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200414150233.24495-12-willy@infradead.org \
    --to=willy@infradead.org \
    --cc=akpm@linux-foundation.org \
    --cc=cluster-devel@redhat.com \
    --cc=hch@lst.de \
    --cc=jhubbard@nvidia.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-erofs@lists.ozlabs.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=ocfs2-devel@oss.oracle.com \
    --cc=william.kucharski@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.