All of lore.kernel.org
 help / color / mirror / Atom feed
From: Matthew Wilcox <willy@infradead.org>
To: linux-fsdevel@vger.kernel.org
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.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
Subject: [PATCH v6 15/16] iomap: Convert from readpages to readahead
Date: Mon, 17 Feb 2020 10:46:08 -0800	[thread overview]
Message-ID: <20200217184613.19668-28-willy@infradead.org> (raw)
In-Reply-To: <20200217184613.19668-1-willy@infradead.org>

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

Use the new readahead operation in iomap.  Convert XFS and ZoneFS to
use it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 fs/iomap/buffered-io.c | 116 ++++++++++++++++-------------------------
 fs/iomap/trace.h       |   2 +-
 fs/xfs/xfs_aops.c      |  13 ++---
 fs/zonefs/super.c      |   7 ++-
 include/linux/iomap.h  |   3 +-
 5 files changed, 54 insertions(+), 87 deletions(-)

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index cb3511eb152a..2bfcd5242264 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -214,9 +214,8 @@ iomap_read_end_io(struct bio *bio)
 struct iomap_readpage_ctx {
 	struct page		*cur_page;
 	bool			cur_page_in_bio;
-	bool			is_readahead;
 	struct bio		*bio;
-	struct list_head	*pages;
+	struct readahead_control *rac;
 };
 
 static void
@@ -307,11 +306,11 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
 		if (ctx->bio)
 			submit_bio(ctx->bio);
 
-		if (ctx->is_readahead) /* same as readahead_gfp_mask */
+		if (ctx->rac) /* same as readahead_gfp_mask */
 			gfp |= __GFP_NORETRY | __GFP_NOWARN;
 		ctx->bio = bio_alloc(gfp, min(BIO_MAX_PAGES, nr_vecs));
 		ctx->bio->bi_opf = REQ_OP_READ;
-		if (ctx->is_readahead)
+		if (ctx->rac)
 			ctx->bio->bi_opf |= REQ_RAHEAD;
 		ctx->bio->bi_iter.bi_sector = sector;
 		bio_set_dev(ctx->bio, iomap->bdev);
@@ -367,104 +366,77 @@ iomap_readpage(struct page *page, const struct iomap_ops *ops)
 }
 EXPORT_SYMBOL_GPL(iomap_readpage);
 
-static struct page *
-iomap_next_page(struct inode *inode, struct list_head *pages, loff_t pos,
-		loff_t length, loff_t *done)
-{
-	while (!list_empty(pages)) {
-		struct page *page = lru_to_page(pages);
-
-		if (page_offset(page) >= (u64)pos + length)
-			break;
-
-		list_del(&page->lru);
-		if (!add_to_page_cache_lru(page, inode->i_mapping, page->index,
-				GFP_NOFS))
-			return page;
-
-		/*
-		 * If we already have a page in the page cache at index we are
-		 * done.  Upper layers don't care if it is uptodate after the
-		 * readpages call itself as every page gets checked again once
-		 * actually needed.
-		 */
-		*done += PAGE_SIZE;
-		put_page(page);
-	}
-
-	return NULL;
-}
-
 static loff_t
-iomap_readpages_actor(struct inode *inode, loff_t pos, loff_t length,
+iomap_readahead_actor(struct inode *inode, loff_t pos, loff_t length,
 		void *data, struct iomap *iomap, struct iomap *srcmap)
 {
 	struct iomap_readpage_ctx *ctx = data;
-	loff_t done, ret;
+	loff_t ret, done = 0;
 
-	for (done = 0; done < length; done += ret) {
-		if (ctx->cur_page && offset_in_page(pos + done) == 0) {
-			if (!ctx->cur_page_in_bio)
-				unlock_page(ctx->cur_page);
-			put_page(ctx->cur_page);
-			ctx->cur_page = NULL;
-		}
+	while (done < length) {
 		if (!ctx->cur_page) {
-			ctx->cur_page = iomap_next_page(inode, ctx->pages,
-					pos, length, &done);
-			if (!ctx->cur_page)
-				break;
+			ctx->cur_page = readahead_page(ctx->rac);
 			ctx->cur_page_in_bio = false;
 		}
 		ret = iomap_readpage_actor(inode, pos + done, length - done,
 				ctx, iomap, srcmap);
+		if (WARN_ON(ret == 0))
+			break;
+		done += ret;
+		if (offset_in_page(pos + done) == 0) {
+			readahead_next(ctx->rac);
+			if (!ctx->cur_page_in_bio)
+				unlock_page(ctx->cur_page);
+			put_page(ctx->cur_page);
+			ctx->cur_page = NULL;
+		}
 	}
 
 	return done;
 }
 
-int
-iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops)
+/**
+ * iomap_readahead - Attempt to read pages from a file.
+ * @rac: Describes the pages to be read.
+ * @ops: The operations vector for the filesystem.
+ *
+ * This function is for filesystems to call to implement their readahead
+ * address_space operation.
+ *
+ * Context: The file is pinned by the caller, and the pages to be read are
+ * all locked and have an elevated refcount.  This function will unlock
+ * the pages (once I/O has completed on them, or I/O has been determined to
+ * not be necessary).  It will also decrease the refcount once the pages
+ * have been submitted for I/O.  After this point, the page may be removed
+ * from the page cache, and should not be referenced.
+ */
+void iomap_readahead(struct readahead_control *rac, const struct iomap_ops *ops)
 {
+	struct inode *inode = rac->mapping->host;
 	struct iomap_readpage_ctx ctx = {
-		.pages		= pages,
-		.is_readahead	= true,
+		.rac	= rac,
 	};
-	loff_t pos = page_offset(list_entry(pages->prev, struct page, lru));
-	loff_t last = page_offset(list_entry(pages->next, struct page, lru));
-	loff_t length = last - pos + PAGE_SIZE, ret = 0;
+	loff_t pos = readahead_offset(rac);
+	loff_t length = readahead_length(rac);
 
-	trace_iomap_readpages(mapping->host, nr_pages);
+	trace_iomap_readahead(inode, readahead_count(rac));
 
 	while (length > 0) {
-		ret = iomap_apply(mapping->host, pos, length, 0, ops,
-				&ctx, iomap_readpages_actor);
+		loff_t ret = iomap_apply(inode, pos, length, 0, ops,
+				&ctx, iomap_readahead_actor);
 		if (ret <= 0) {
 			WARN_ON_ONCE(ret == 0);
-			goto done;
+			break;
 		}
 		pos += ret;
 		length -= ret;
 	}
-	ret = 0;
-done:
+
 	if (ctx.bio)
 		submit_bio(ctx.bio);
-	if (ctx.cur_page) {
-		if (!ctx.cur_page_in_bio)
-			unlock_page(ctx.cur_page);
-		put_page(ctx.cur_page);
-	}
-
-	/*
-	 * Check that we didn't lose a page due to the arcance calling
-	 * conventions..
-	 */
-	WARN_ON_ONCE(!ret && !list_empty(ctx.pages));
-	return ret;
+	BUG_ON(ctx.cur_page);
 }
-EXPORT_SYMBOL_GPL(iomap_readpages);
+EXPORT_SYMBOL_GPL(iomap_readahead);
 
 /*
  * iomap_is_partially_uptodate checks whether blocks within a page are
diff --git a/fs/iomap/trace.h b/fs/iomap/trace.h
index 6dc227b8c47e..d6ba705f938a 100644
--- a/fs/iomap/trace.h
+++ b/fs/iomap/trace.h
@@ -39,7 +39,7 @@ DEFINE_EVENT(iomap_readpage_class, name,	\
 	TP_PROTO(struct inode *inode, int nr_pages), \
 	TP_ARGS(inode, nr_pages))
 DEFINE_READPAGE_EVENT(iomap_readpage);
-DEFINE_READPAGE_EVENT(iomap_readpages);
+DEFINE_READPAGE_EVENT(iomap_readahead);
 
 DECLARE_EVENT_CLASS(iomap_page_class,
 	TP_PROTO(struct inode *inode, struct page *page, unsigned long off,
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index 58e937be24ce..6e68eeb50b07 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -621,14 +621,11 @@ xfs_vm_readpage(
 	return iomap_readpage(page, &xfs_read_iomap_ops);
 }
 
-STATIC int
-xfs_vm_readpages(
-	struct file		*unused,
-	struct address_space	*mapping,
-	struct list_head	*pages,
-	unsigned		nr_pages)
+STATIC void
+xfs_vm_readahead(
+	struct readahead_control	*rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &xfs_read_iomap_ops);
+	iomap_readahead(rac, &xfs_read_iomap_ops);
 }
 
 static int
@@ -644,7 +641,7 @@ xfs_iomap_swapfile_activate(
 
 const struct address_space_operations xfs_address_space_operations = {
 	.readpage		= xfs_vm_readpage,
-	.readpages		= xfs_vm_readpages,
+	.readahead		= xfs_vm_readahead,
 	.writepage		= xfs_vm_writepage,
 	.writepages		= xfs_vm_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index 8bc6ef82d693..8327a01d3bac 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -78,10 +78,9 @@ static int zonefs_readpage(struct file *unused, struct page *page)
 	return iomap_readpage(page, &zonefs_iomap_ops);
 }
 
-static int zonefs_readpages(struct file *unused, struct address_space *mapping,
-			    struct list_head *pages, unsigned int nr_pages)
+static void zonefs_readahead(struct readahead_control *rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &zonefs_iomap_ops);
+	iomap_readahead(rac, &zonefs_iomap_ops);
 }
 
 /*
@@ -128,7 +127,7 @@ static int zonefs_writepages(struct address_space *mapping,
 
 static const struct address_space_operations zonefs_file_aops = {
 	.readpage		= zonefs_readpage,
-	.readpages		= zonefs_readpages,
+	.readahead		= zonefs_readahead,
 	.writepage		= zonefs_writepage,
 	.writepages		= zonefs_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 8b09463dae0d..bc20bd04c2a2 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -155,8 +155,7 @@ loff_t iomap_apply(struct inode *inode, loff_t pos, loff_t length,
 ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
 		const struct iomap_ops *ops);
 int iomap_readpage(struct page *page, const struct iomap_ops *ops);
-int iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops);
+void iomap_readahead(struct readahead_control *, const struct iomap_ops *ops);
 int iomap_set_page_dirty(struct page *page);
 int iomap_is_partially_uptodate(struct page *page, unsigned long from,
 		unsigned long count);
-- 
2.25.0


WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org>
To: ocfs2-devel@oss.oracle.com
Subject: [Ocfs2-devel] [PATCH v6 15/16] iomap: Convert from readpages to readahead
Date: Mon, 17 Feb 2020 10:46:08 -0800	[thread overview]
Message-ID: <20200217184613.19668-28-willy@infradead.org> (raw)
In-Reply-To: <20200217184613.19668-1-willy@infradead.org>

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

Use the new readahead operation in iomap.  Convert XFS and ZoneFS to
use it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 fs/iomap/buffered-io.c | 116 ++++++++++++++++-------------------------
 fs/iomap/trace.h       |   2 +-
 fs/xfs/xfs_aops.c      |  13 ++---
 fs/zonefs/super.c      |   7 ++-
 include/linux/iomap.h  |   3 +-
 5 files changed, 54 insertions(+), 87 deletions(-)

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index cb3511eb152a..2bfcd5242264 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -214,9 +214,8 @@ iomap_read_end_io(struct bio *bio)
 struct iomap_readpage_ctx {
 	struct page		*cur_page;
 	bool			cur_page_in_bio;
-	bool			is_readahead;
 	struct bio		*bio;
-	struct list_head	*pages;
+	struct readahead_control *rac;
 };
 
 static void
@@ -307,11 +306,11 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
 		if (ctx->bio)
 			submit_bio(ctx->bio);
 
-		if (ctx->is_readahead) /* same as readahead_gfp_mask */
+		if (ctx->rac) /* same as readahead_gfp_mask */
 			gfp |= __GFP_NORETRY | __GFP_NOWARN;
 		ctx->bio = bio_alloc(gfp, min(BIO_MAX_PAGES, nr_vecs));
 		ctx->bio->bi_opf = REQ_OP_READ;
-		if (ctx->is_readahead)
+		if (ctx->rac)
 			ctx->bio->bi_opf |= REQ_RAHEAD;
 		ctx->bio->bi_iter.bi_sector = sector;
 		bio_set_dev(ctx->bio, iomap->bdev);
@@ -367,104 +366,77 @@ iomap_readpage(struct page *page, const struct iomap_ops *ops)
 }
 EXPORT_SYMBOL_GPL(iomap_readpage);
 
-static struct page *
-iomap_next_page(struct inode *inode, struct list_head *pages, loff_t pos,
-		loff_t length, loff_t *done)
-{
-	while (!list_empty(pages)) {
-		struct page *page = lru_to_page(pages);
-
-		if (page_offset(page) >= (u64)pos + length)
-			break;
-
-		list_del(&page->lru);
-		if (!add_to_page_cache_lru(page, inode->i_mapping, page->index,
-				GFP_NOFS))
-			return page;
-
-		/*
-		 * If we already have a page in the page cache at index we are
-		 * done.  Upper layers don't care if it is uptodate after the
-		 * readpages call itself as every page gets checked again once
-		 * actually needed.
-		 */
-		*done += PAGE_SIZE;
-		put_page(page);
-	}
-
-	return NULL;
-}
-
 static loff_t
-iomap_readpages_actor(struct inode *inode, loff_t pos, loff_t length,
+iomap_readahead_actor(struct inode *inode, loff_t pos, loff_t length,
 		void *data, struct iomap *iomap, struct iomap *srcmap)
 {
 	struct iomap_readpage_ctx *ctx = data;
-	loff_t done, ret;
+	loff_t ret, done = 0;
 
-	for (done = 0; done < length; done += ret) {
-		if (ctx->cur_page && offset_in_page(pos + done) == 0) {
-			if (!ctx->cur_page_in_bio)
-				unlock_page(ctx->cur_page);
-			put_page(ctx->cur_page);
-			ctx->cur_page = NULL;
-		}
+	while (done < length) {
 		if (!ctx->cur_page) {
-			ctx->cur_page = iomap_next_page(inode, ctx->pages,
-					pos, length, &done);
-			if (!ctx->cur_page)
-				break;
+			ctx->cur_page = readahead_page(ctx->rac);
 			ctx->cur_page_in_bio = false;
 		}
 		ret = iomap_readpage_actor(inode, pos + done, length - done,
 				ctx, iomap, srcmap);
+		if (WARN_ON(ret == 0))
+			break;
+		done += ret;
+		if (offset_in_page(pos + done) == 0) {
+			readahead_next(ctx->rac);
+			if (!ctx->cur_page_in_bio)
+				unlock_page(ctx->cur_page);
+			put_page(ctx->cur_page);
+			ctx->cur_page = NULL;
+		}
 	}
 
 	return done;
 }
 
-int
-iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops)
+/**
+ * iomap_readahead - Attempt to read pages from a file.
+ * @rac: Describes the pages to be read.
+ * @ops: The operations vector for the filesystem.
+ *
+ * This function is for filesystems to call to implement their readahead
+ * address_space operation.
+ *
+ * Context: The file is pinned by the caller, and the pages to be read are
+ * all locked and have an elevated refcount.  This function will unlock
+ * the pages (once I/O has completed on them, or I/O has been determined to
+ * not be necessary).  It will also decrease the refcount once the pages
+ * have been submitted for I/O.  After this point, the page may be removed
+ * from the page cache, and should not be referenced.
+ */
+void iomap_readahead(struct readahead_control *rac, const struct iomap_ops *ops)
 {
+	struct inode *inode = rac->mapping->host;
 	struct iomap_readpage_ctx ctx = {
-		.pages		= pages,
-		.is_readahead	= true,
+		.rac	= rac,
 	};
-	loff_t pos = page_offset(list_entry(pages->prev, struct page, lru));
-	loff_t last = page_offset(list_entry(pages->next, struct page, lru));
-	loff_t length = last - pos + PAGE_SIZE, ret = 0;
+	loff_t pos = readahead_offset(rac);
+	loff_t length = readahead_length(rac);
 
-	trace_iomap_readpages(mapping->host, nr_pages);
+	trace_iomap_readahead(inode, readahead_count(rac));
 
 	while (length > 0) {
-		ret = iomap_apply(mapping->host, pos, length, 0, ops,
-				&ctx, iomap_readpages_actor);
+		loff_t ret = iomap_apply(inode, pos, length, 0, ops,
+				&ctx, iomap_readahead_actor);
 		if (ret <= 0) {
 			WARN_ON_ONCE(ret == 0);
-			goto done;
+			break;
 		}
 		pos += ret;
 		length -= ret;
 	}
-	ret = 0;
-done:
+
 	if (ctx.bio)
 		submit_bio(ctx.bio);
-	if (ctx.cur_page) {
-		if (!ctx.cur_page_in_bio)
-			unlock_page(ctx.cur_page);
-		put_page(ctx.cur_page);
-	}
-
-	/*
-	 * Check that we didn't lose a page due to the arcance calling
-	 * conventions..
-	 */
-	WARN_ON_ONCE(!ret && !list_empty(ctx.pages));
-	return ret;
+	BUG_ON(ctx.cur_page);
 }
-EXPORT_SYMBOL_GPL(iomap_readpages);
+EXPORT_SYMBOL_GPL(iomap_readahead);
 
 /*
  * iomap_is_partially_uptodate checks whether blocks within a page are
diff --git a/fs/iomap/trace.h b/fs/iomap/trace.h
index 6dc227b8c47e..d6ba705f938a 100644
--- a/fs/iomap/trace.h
+++ b/fs/iomap/trace.h
@@ -39,7 +39,7 @@ DEFINE_EVENT(iomap_readpage_class, name,	\
 	TP_PROTO(struct inode *inode, int nr_pages), \
 	TP_ARGS(inode, nr_pages))
 DEFINE_READPAGE_EVENT(iomap_readpage);
-DEFINE_READPAGE_EVENT(iomap_readpages);
+DEFINE_READPAGE_EVENT(iomap_readahead);
 
 DECLARE_EVENT_CLASS(iomap_page_class,
 	TP_PROTO(struct inode *inode, struct page *page, unsigned long off,
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index 58e937be24ce..6e68eeb50b07 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -621,14 +621,11 @@ xfs_vm_readpage(
 	return iomap_readpage(page, &xfs_read_iomap_ops);
 }
 
-STATIC int
-xfs_vm_readpages(
-	struct file		*unused,
-	struct address_space	*mapping,
-	struct list_head	*pages,
-	unsigned		nr_pages)
+STATIC void
+xfs_vm_readahead(
+	struct readahead_control	*rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &xfs_read_iomap_ops);
+	iomap_readahead(rac, &xfs_read_iomap_ops);
 }
 
 static int
@@ -644,7 +641,7 @@ xfs_iomap_swapfile_activate(
 
 const struct address_space_operations xfs_address_space_operations = {
 	.readpage		= xfs_vm_readpage,
-	.readpages		= xfs_vm_readpages,
+	.readahead		= xfs_vm_readahead,
 	.writepage		= xfs_vm_writepage,
 	.writepages		= xfs_vm_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index 8bc6ef82d693..8327a01d3bac 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -78,10 +78,9 @@ static int zonefs_readpage(struct file *unused, struct page *page)
 	return iomap_readpage(page, &zonefs_iomap_ops);
 }
 
-static int zonefs_readpages(struct file *unused, struct address_space *mapping,
-			    struct list_head *pages, unsigned int nr_pages)
+static void zonefs_readahead(struct readahead_control *rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &zonefs_iomap_ops);
+	iomap_readahead(rac, &zonefs_iomap_ops);
 }
 
 /*
@@ -128,7 +127,7 @@ static int zonefs_writepages(struct address_space *mapping,
 
 static const struct address_space_operations zonefs_file_aops = {
 	.readpage		= zonefs_readpage,
-	.readpages		= zonefs_readpages,
+	.readahead		= zonefs_readahead,
 	.writepage		= zonefs_writepage,
 	.writepages		= zonefs_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 8b09463dae0d..bc20bd04c2a2 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -155,8 +155,7 @@ loff_t iomap_apply(struct inode *inode, loff_t pos, loff_t length,
 ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
 		const struct iomap_ops *ops);
 int iomap_readpage(struct page *page, const struct iomap_ops *ops);
-int iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops);
+void iomap_readahead(struct readahead_control *, const struct iomap_ops *ops);
 int iomap_set_page_dirty(struct page *page);
 int iomap_is_partially_uptodate(struct page *page, unsigned long from,
 		unsigned long count);
-- 
2.25.0

WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org>
To: linux-fsdevel@vger.kernel.org
Cc: linux-xfs@vger.kernel.org, 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-ext4@vger.kernel.org, linux-erofs@lists.ozlabs.org,
	linux-btrfs@vger.kernel.org
Subject: [f2fs-dev] [PATCH v6 15/16] iomap: Convert from readpages to readahead
Date: Mon, 17 Feb 2020 10:46:08 -0800	[thread overview]
Message-ID: <20200217184613.19668-28-willy@infradead.org> (raw)
In-Reply-To: <20200217184613.19668-1-willy@infradead.org>

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

Use the new readahead operation in iomap.  Convert XFS and ZoneFS to
use it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 fs/iomap/buffered-io.c | 116 ++++++++++++++++-------------------------
 fs/iomap/trace.h       |   2 +-
 fs/xfs/xfs_aops.c      |  13 ++---
 fs/zonefs/super.c      |   7 ++-
 include/linux/iomap.h  |   3 +-
 5 files changed, 54 insertions(+), 87 deletions(-)

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index cb3511eb152a..2bfcd5242264 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -214,9 +214,8 @@ iomap_read_end_io(struct bio *bio)
 struct iomap_readpage_ctx {
 	struct page		*cur_page;
 	bool			cur_page_in_bio;
-	bool			is_readahead;
 	struct bio		*bio;
-	struct list_head	*pages;
+	struct readahead_control *rac;
 };
 
 static void
@@ -307,11 +306,11 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
 		if (ctx->bio)
 			submit_bio(ctx->bio);
 
-		if (ctx->is_readahead) /* same as readahead_gfp_mask */
+		if (ctx->rac) /* same as readahead_gfp_mask */
 			gfp |= __GFP_NORETRY | __GFP_NOWARN;
 		ctx->bio = bio_alloc(gfp, min(BIO_MAX_PAGES, nr_vecs));
 		ctx->bio->bi_opf = REQ_OP_READ;
-		if (ctx->is_readahead)
+		if (ctx->rac)
 			ctx->bio->bi_opf |= REQ_RAHEAD;
 		ctx->bio->bi_iter.bi_sector = sector;
 		bio_set_dev(ctx->bio, iomap->bdev);
@@ -367,104 +366,77 @@ iomap_readpage(struct page *page, const struct iomap_ops *ops)
 }
 EXPORT_SYMBOL_GPL(iomap_readpage);
 
-static struct page *
-iomap_next_page(struct inode *inode, struct list_head *pages, loff_t pos,
-		loff_t length, loff_t *done)
-{
-	while (!list_empty(pages)) {
-		struct page *page = lru_to_page(pages);
-
-		if (page_offset(page) >= (u64)pos + length)
-			break;
-
-		list_del(&page->lru);
-		if (!add_to_page_cache_lru(page, inode->i_mapping, page->index,
-				GFP_NOFS))
-			return page;
-
-		/*
-		 * If we already have a page in the page cache at index we are
-		 * done.  Upper layers don't care if it is uptodate after the
-		 * readpages call itself as every page gets checked again once
-		 * actually needed.
-		 */
-		*done += PAGE_SIZE;
-		put_page(page);
-	}
-
-	return NULL;
-}
-
 static loff_t
-iomap_readpages_actor(struct inode *inode, loff_t pos, loff_t length,
+iomap_readahead_actor(struct inode *inode, loff_t pos, loff_t length,
 		void *data, struct iomap *iomap, struct iomap *srcmap)
 {
 	struct iomap_readpage_ctx *ctx = data;
-	loff_t done, ret;
+	loff_t ret, done = 0;
 
-	for (done = 0; done < length; done += ret) {
-		if (ctx->cur_page && offset_in_page(pos + done) == 0) {
-			if (!ctx->cur_page_in_bio)
-				unlock_page(ctx->cur_page);
-			put_page(ctx->cur_page);
-			ctx->cur_page = NULL;
-		}
+	while (done < length) {
 		if (!ctx->cur_page) {
-			ctx->cur_page = iomap_next_page(inode, ctx->pages,
-					pos, length, &done);
-			if (!ctx->cur_page)
-				break;
+			ctx->cur_page = readahead_page(ctx->rac);
 			ctx->cur_page_in_bio = false;
 		}
 		ret = iomap_readpage_actor(inode, pos + done, length - done,
 				ctx, iomap, srcmap);
+		if (WARN_ON(ret == 0))
+			break;
+		done += ret;
+		if (offset_in_page(pos + done) == 0) {
+			readahead_next(ctx->rac);
+			if (!ctx->cur_page_in_bio)
+				unlock_page(ctx->cur_page);
+			put_page(ctx->cur_page);
+			ctx->cur_page = NULL;
+		}
 	}
 
 	return done;
 }
 
-int
-iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops)
+/**
+ * iomap_readahead - Attempt to read pages from a file.
+ * @rac: Describes the pages to be read.
+ * @ops: The operations vector for the filesystem.
+ *
+ * This function is for filesystems to call to implement their readahead
+ * address_space operation.
+ *
+ * Context: The file is pinned by the caller, and the pages to be read are
+ * all locked and have an elevated refcount.  This function will unlock
+ * the pages (once I/O has completed on them, or I/O has been determined to
+ * not be necessary).  It will also decrease the refcount once the pages
+ * have been submitted for I/O.  After this point, the page may be removed
+ * from the page cache, and should not be referenced.
+ */
+void iomap_readahead(struct readahead_control *rac, const struct iomap_ops *ops)
 {
+	struct inode *inode = rac->mapping->host;
 	struct iomap_readpage_ctx ctx = {
-		.pages		= pages,
-		.is_readahead	= true,
+		.rac	= rac,
 	};
-	loff_t pos = page_offset(list_entry(pages->prev, struct page, lru));
-	loff_t last = page_offset(list_entry(pages->next, struct page, lru));
-	loff_t length = last - pos + PAGE_SIZE, ret = 0;
+	loff_t pos = readahead_offset(rac);
+	loff_t length = readahead_length(rac);
 
-	trace_iomap_readpages(mapping->host, nr_pages);
+	trace_iomap_readahead(inode, readahead_count(rac));
 
 	while (length > 0) {
-		ret = iomap_apply(mapping->host, pos, length, 0, ops,
-				&ctx, iomap_readpages_actor);
+		loff_t ret = iomap_apply(inode, pos, length, 0, ops,
+				&ctx, iomap_readahead_actor);
 		if (ret <= 0) {
 			WARN_ON_ONCE(ret == 0);
-			goto done;
+			break;
 		}
 		pos += ret;
 		length -= ret;
 	}
-	ret = 0;
-done:
+
 	if (ctx.bio)
 		submit_bio(ctx.bio);
-	if (ctx.cur_page) {
-		if (!ctx.cur_page_in_bio)
-			unlock_page(ctx.cur_page);
-		put_page(ctx.cur_page);
-	}
-
-	/*
-	 * Check that we didn't lose a page due to the arcance calling
-	 * conventions..
-	 */
-	WARN_ON_ONCE(!ret && !list_empty(ctx.pages));
-	return ret;
+	BUG_ON(ctx.cur_page);
 }
-EXPORT_SYMBOL_GPL(iomap_readpages);
+EXPORT_SYMBOL_GPL(iomap_readahead);
 
 /*
  * iomap_is_partially_uptodate checks whether blocks within a page are
diff --git a/fs/iomap/trace.h b/fs/iomap/trace.h
index 6dc227b8c47e..d6ba705f938a 100644
--- a/fs/iomap/trace.h
+++ b/fs/iomap/trace.h
@@ -39,7 +39,7 @@ DEFINE_EVENT(iomap_readpage_class, name,	\
 	TP_PROTO(struct inode *inode, int nr_pages), \
 	TP_ARGS(inode, nr_pages))
 DEFINE_READPAGE_EVENT(iomap_readpage);
-DEFINE_READPAGE_EVENT(iomap_readpages);
+DEFINE_READPAGE_EVENT(iomap_readahead);
 
 DECLARE_EVENT_CLASS(iomap_page_class,
 	TP_PROTO(struct inode *inode, struct page *page, unsigned long off,
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index 58e937be24ce..6e68eeb50b07 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -621,14 +621,11 @@ xfs_vm_readpage(
 	return iomap_readpage(page, &xfs_read_iomap_ops);
 }
 
-STATIC int
-xfs_vm_readpages(
-	struct file		*unused,
-	struct address_space	*mapping,
-	struct list_head	*pages,
-	unsigned		nr_pages)
+STATIC void
+xfs_vm_readahead(
+	struct readahead_control	*rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &xfs_read_iomap_ops);
+	iomap_readahead(rac, &xfs_read_iomap_ops);
 }
 
 static int
@@ -644,7 +641,7 @@ xfs_iomap_swapfile_activate(
 
 const struct address_space_operations xfs_address_space_operations = {
 	.readpage		= xfs_vm_readpage,
-	.readpages		= xfs_vm_readpages,
+	.readahead		= xfs_vm_readahead,
 	.writepage		= xfs_vm_writepage,
 	.writepages		= xfs_vm_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index 8bc6ef82d693..8327a01d3bac 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -78,10 +78,9 @@ static int zonefs_readpage(struct file *unused, struct page *page)
 	return iomap_readpage(page, &zonefs_iomap_ops);
 }
 
-static int zonefs_readpages(struct file *unused, struct address_space *mapping,
-			    struct list_head *pages, unsigned int nr_pages)
+static void zonefs_readahead(struct readahead_control *rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &zonefs_iomap_ops);
+	iomap_readahead(rac, &zonefs_iomap_ops);
 }
 
 /*
@@ -128,7 +127,7 @@ static int zonefs_writepages(struct address_space *mapping,
 
 static const struct address_space_operations zonefs_file_aops = {
 	.readpage		= zonefs_readpage,
-	.readpages		= zonefs_readpages,
+	.readahead		= zonefs_readahead,
 	.writepage		= zonefs_writepage,
 	.writepages		= zonefs_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 8b09463dae0d..bc20bd04c2a2 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -155,8 +155,7 @@ loff_t iomap_apply(struct inode *inode, loff_t pos, loff_t length,
 ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
 		const struct iomap_ops *ops);
 int iomap_readpage(struct page *page, const struct iomap_ops *ops);
-int iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops);
+void iomap_readahead(struct readahead_control *, const struct iomap_ops *ops);
 int iomap_set_page_dirty(struct page *page);
 int iomap_is_partially_uptodate(struct page *page, unsigned long from,
 		unsigned long count);
-- 
2.25.0



_______________________________________________
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: linux-fsdevel@vger.kernel.org
Cc: linux-xfs@vger.kernel.org, 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-ext4@vger.kernel.org, linux-erofs@lists.ozlabs.org,
	linux-btrfs@vger.kernel.org
Subject: [PATCH v6 15/16] iomap: Convert from readpages to readahead
Date: Mon, 17 Feb 2020 10:46:08 -0800	[thread overview]
Message-ID: <20200217184613.19668-28-willy@infradead.org> (raw)
In-Reply-To: <20200217184613.19668-1-willy@infradead.org>

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

Use the new readahead operation in iomap.  Convert XFS and ZoneFS to
use it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 fs/iomap/buffered-io.c | 116 ++++++++++++++++-------------------------
 fs/iomap/trace.h       |   2 +-
 fs/xfs/xfs_aops.c      |  13 ++---
 fs/zonefs/super.c      |   7 ++-
 include/linux/iomap.h  |   3 +-
 5 files changed, 54 insertions(+), 87 deletions(-)

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index cb3511eb152a..2bfcd5242264 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -214,9 +214,8 @@ iomap_read_end_io(struct bio *bio)
 struct iomap_readpage_ctx {
 	struct page		*cur_page;
 	bool			cur_page_in_bio;
-	bool			is_readahead;
 	struct bio		*bio;
-	struct list_head	*pages;
+	struct readahead_control *rac;
 };
 
 static void
@@ -307,11 +306,11 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
 		if (ctx->bio)
 			submit_bio(ctx->bio);
 
-		if (ctx->is_readahead) /* same as readahead_gfp_mask */
+		if (ctx->rac) /* same as readahead_gfp_mask */
 			gfp |= __GFP_NORETRY | __GFP_NOWARN;
 		ctx->bio = bio_alloc(gfp, min(BIO_MAX_PAGES, nr_vecs));
 		ctx->bio->bi_opf = REQ_OP_READ;
-		if (ctx->is_readahead)
+		if (ctx->rac)
 			ctx->bio->bi_opf |= REQ_RAHEAD;
 		ctx->bio->bi_iter.bi_sector = sector;
 		bio_set_dev(ctx->bio, iomap->bdev);
@@ -367,104 +366,77 @@ iomap_readpage(struct page *page, const struct iomap_ops *ops)
 }
 EXPORT_SYMBOL_GPL(iomap_readpage);
 
-static struct page *
-iomap_next_page(struct inode *inode, struct list_head *pages, loff_t pos,
-		loff_t length, loff_t *done)
-{
-	while (!list_empty(pages)) {
-		struct page *page = lru_to_page(pages);
-
-		if (page_offset(page) >= (u64)pos + length)
-			break;
-
-		list_del(&page->lru);
-		if (!add_to_page_cache_lru(page, inode->i_mapping, page->index,
-				GFP_NOFS))
-			return page;
-
-		/*
-		 * If we already have a page in the page cache at index we are
-		 * done.  Upper layers don't care if it is uptodate after the
-		 * readpages call itself as every page gets checked again once
-		 * actually needed.
-		 */
-		*done += PAGE_SIZE;
-		put_page(page);
-	}
-
-	return NULL;
-}
-
 static loff_t
-iomap_readpages_actor(struct inode *inode, loff_t pos, loff_t length,
+iomap_readahead_actor(struct inode *inode, loff_t pos, loff_t length,
 		void *data, struct iomap *iomap, struct iomap *srcmap)
 {
 	struct iomap_readpage_ctx *ctx = data;
-	loff_t done, ret;
+	loff_t ret, done = 0;
 
-	for (done = 0; done < length; done += ret) {
-		if (ctx->cur_page && offset_in_page(pos + done) == 0) {
-			if (!ctx->cur_page_in_bio)
-				unlock_page(ctx->cur_page);
-			put_page(ctx->cur_page);
-			ctx->cur_page = NULL;
-		}
+	while (done < length) {
 		if (!ctx->cur_page) {
-			ctx->cur_page = iomap_next_page(inode, ctx->pages,
-					pos, length, &done);
-			if (!ctx->cur_page)
-				break;
+			ctx->cur_page = readahead_page(ctx->rac);
 			ctx->cur_page_in_bio = false;
 		}
 		ret = iomap_readpage_actor(inode, pos + done, length - done,
 				ctx, iomap, srcmap);
+		if (WARN_ON(ret == 0))
+			break;
+		done += ret;
+		if (offset_in_page(pos + done) == 0) {
+			readahead_next(ctx->rac);
+			if (!ctx->cur_page_in_bio)
+				unlock_page(ctx->cur_page);
+			put_page(ctx->cur_page);
+			ctx->cur_page = NULL;
+		}
 	}
 
 	return done;
 }
 
-int
-iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops)
+/**
+ * iomap_readahead - Attempt to read pages from a file.
+ * @rac: Describes the pages to be read.
+ * @ops: The operations vector for the filesystem.
+ *
+ * This function is for filesystems to call to implement their readahead
+ * address_space operation.
+ *
+ * Context: The file is pinned by the caller, and the pages to be read are
+ * all locked and have an elevated refcount.  This function will unlock
+ * the pages (once I/O has completed on them, or I/O has been determined to
+ * not be necessary).  It will also decrease the refcount once the pages
+ * have been submitted for I/O.  After this point, the page may be removed
+ * from the page cache, and should not be referenced.
+ */
+void iomap_readahead(struct readahead_control *rac, const struct iomap_ops *ops)
 {
+	struct inode *inode = rac->mapping->host;
 	struct iomap_readpage_ctx ctx = {
-		.pages		= pages,
-		.is_readahead	= true,
+		.rac	= rac,
 	};
-	loff_t pos = page_offset(list_entry(pages->prev, struct page, lru));
-	loff_t last = page_offset(list_entry(pages->next, struct page, lru));
-	loff_t length = last - pos + PAGE_SIZE, ret = 0;
+	loff_t pos = readahead_offset(rac);
+	loff_t length = readahead_length(rac);
 
-	trace_iomap_readpages(mapping->host, nr_pages);
+	trace_iomap_readahead(inode, readahead_count(rac));
 
 	while (length > 0) {
-		ret = iomap_apply(mapping->host, pos, length, 0, ops,
-				&ctx, iomap_readpages_actor);
+		loff_t ret = iomap_apply(inode, pos, length, 0, ops,
+				&ctx, iomap_readahead_actor);
 		if (ret <= 0) {
 			WARN_ON_ONCE(ret == 0);
-			goto done;
+			break;
 		}
 		pos += ret;
 		length -= ret;
 	}
-	ret = 0;
-done:
+
 	if (ctx.bio)
 		submit_bio(ctx.bio);
-	if (ctx.cur_page) {
-		if (!ctx.cur_page_in_bio)
-			unlock_page(ctx.cur_page);
-		put_page(ctx.cur_page);
-	}
-
-	/*
-	 * Check that we didn't lose a page due to the arcance calling
-	 * conventions..
-	 */
-	WARN_ON_ONCE(!ret && !list_empty(ctx.pages));
-	return ret;
+	BUG_ON(ctx.cur_page);
 }
-EXPORT_SYMBOL_GPL(iomap_readpages);
+EXPORT_SYMBOL_GPL(iomap_readahead);
 
 /*
  * iomap_is_partially_uptodate checks whether blocks within a page are
diff --git a/fs/iomap/trace.h b/fs/iomap/trace.h
index 6dc227b8c47e..d6ba705f938a 100644
--- a/fs/iomap/trace.h
+++ b/fs/iomap/trace.h
@@ -39,7 +39,7 @@ DEFINE_EVENT(iomap_readpage_class, name,	\
 	TP_PROTO(struct inode *inode, int nr_pages), \
 	TP_ARGS(inode, nr_pages))
 DEFINE_READPAGE_EVENT(iomap_readpage);
-DEFINE_READPAGE_EVENT(iomap_readpages);
+DEFINE_READPAGE_EVENT(iomap_readahead);
 
 DECLARE_EVENT_CLASS(iomap_page_class,
 	TP_PROTO(struct inode *inode, struct page *page, unsigned long off,
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index 58e937be24ce..6e68eeb50b07 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -621,14 +621,11 @@ xfs_vm_readpage(
 	return iomap_readpage(page, &xfs_read_iomap_ops);
 }
 
-STATIC int
-xfs_vm_readpages(
-	struct file		*unused,
-	struct address_space	*mapping,
-	struct list_head	*pages,
-	unsigned		nr_pages)
+STATIC void
+xfs_vm_readahead(
+	struct readahead_control	*rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &xfs_read_iomap_ops);
+	iomap_readahead(rac, &xfs_read_iomap_ops);
 }
 
 static int
@@ -644,7 +641,7 @@ xfs_iomap_swapfile_activate(
 
 const struct address_space_operations xfs_address_space_operations = {
 	.readpage		= xfs_vm_readpage,
-	.readpages		= xfs_vm_readpages,
+	.readahead		= xfs_vm_readahead,
 	.writepage		= xfs_vm_writepage,
 	.writepages		= xfs_vm_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index 8bc6ef82d693..8327a01d3bac 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -78,10 +78,9 @@ static int zonefs_readpage(struct file *unused, struct page *page)
 	return iomap_readpage(page, &zonefs_iomap_ops);
 }
 
-static int zonefs_readpages(struct file *unused, struct address_space *mapping,
-			    struct list_head *pages, unsigned int nr_pages)
+static void zonefs_readahead(struct readahead_control *rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &zonefs_iomap_ops);
+	iomap_readahead(rac, &zonefs_iomap_ops);
 }
 
 /*
@@ -128,7 +127,7 @@ static int zonefs_writepages(struct address_space *mapping,
 
 static const struct address_space_operations zonefs_file_aops = {
 	.readpage		= zonefs_readpage,
-	.readpages		= zonefs_readpages,
+	.readahead		= zonefs_readahead,
 	.writepage		= zonefs_writepage,
 	.writepages		= zonefs_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 8b09463dae0d..bc20bd04c2a2 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -155,8 +155,7 @@ loff_t iomap_apply(struct inode *inode, loff_t pos, loff_t length,
 ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
 		const struct iomap_ops *ops);
 int iomap_readpage(struct page *page, const struct iomap_ops *ops);
-int iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops);
+void iomap_readahead(struct readahead_control *, const struct iomap_ops *ops);
 int iomap_set_page_dirty(struct page *page);
 int iomap_is_partially_uptodate(struct page *page, unsigned long from,
 		unsigned long count);
-- 
2.25.0


WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox <willy@infradead.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH v6 15/16] iomap: Convert from readpages to readahead
Date: Mon, 17 Feb 2020 10:46:08 -0800	[thread overview]
Message-ID: <20200217184613.19668-28-willy@infradead.org> (raw)
In-Reply-To: <20200217184613.19668-1-willy@infradead.org>

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

Use the new readahead operation in iomap.  Convert XFS and ZoneFS to
use it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 fs/iomap/buffered-io.c | 116 ++++++++++++++++-------------------------
 fs/iomap/trace.h       |   2 +-
 fs/xfs/xfs_aops.c      |  13 ++---
 fs/zonefs/super.c      |   7 ++-
 include/linux/iomap.h  |   3 +-
 5 files changed, 54 insertions(+), 87 deletions(-)

diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
index cb3511eb152a..2bfcd5242264 100644
--- a/fs/iomap/buffered-io.c
+++ b/fs/iomap/buffered-io.c
@@ -214,9 +214,8 @@ iomap_read_end_io(struct bio *bio)
 struct iomap_readpage_ctx {
 	struct page		*cur_page;
 	bool			cur_page_in_bio;
-	bool			is_readahead;
 	struct bio		*bio;
-	struct list_head	*pages;
+	struct readahead_control *rac;
 };
 
 static void
@@ -307,11 +306,11 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
 		if (ctx->bio)
 			submit_bio(ctx->bio);
 
-		if (ctx->is_readahead) /* same as readahead_gfp_mask */
+		if (ctx->rac) /* same as readahead_gfp_mask */
 			gfp |= __GFP_NORETRY | __GFP_NOWARN;
 		ctx->bio = bio_alloc(gfp, min(BIO_MAX_PAGES, nr_vecs));
 		ctx->bio->bi_opf = REQ_OP_READ;
-		if (ctx->is_readahead)
+		if (ctx->rac)
 			ctx->bio->bi_opf |= REQ_RAHEAD;
 		ctx->bio->bi_iter.bi_sector = sector;
 		bio_set_dev(ctx->bio, iomap->bdev);
@@ -367,104 +366,77 @@ iomap_readpage(struct page *page, const struct iomap_ops *ops)
 }
 EXPORT_SYMBOL_GPL(iomap_readpage);
 
-static struct page *
-iomap_next_page(struct inode *inode, struct list_head *pages, loff_t pos,
-		loff_t length, loff_t *done)
-{
-	while (!list_empty(pages)) {
-		struct page *page = lru_to_page(pages);
-
-		if (page_offset(page) >= (u64)pos + length)
-			break;
-
-		list_del(&page->lru);
-		if (!add_to_page_cache_lru(page, inode->i_mapping, page->index,
-				GFP_NOFS))
-			return page;
-
-		/*
-		 * If we already have a page in the page cache at index we are
-		 * done.  Upper layers don't care if it is uptodate after the
-		 * readpages call itself as every page gets checked again once
-		 * actually needed.
-		 */
-		*done += PAGE_SIZE;
-		put_page(page);
-	}
-
-	return NULL;
-}
-
 static loff_t
-iomap_readpages_actor(struct inode *inode, loff_t pos, loff_t length,
+iomap_readahead_actor(struct inode *inode, loff_t pos, loff_t length,
 		void *data, struct iomap *iomap, struct iomap *srcmap)
 {
 	struct iomap_readpage_ctx *ctx = data;
-	loff_t done, ret;
+	loff_t ret, done = 0;
 
-	for (done = 0; done < length; done += ret) {
-		if (ctx->cur_page && offset_in_page(pos + done) == 0) {
-			if (!ctx->cur_page_in_bio)
-				unlock_page(ctx->cur_page);
-			put_page(ctx->cur_page);
-			ctx->cur_page = NULL;
-		}
+	while (done < length) {
 		if (!ctx->cur_page) {
-			ctx->cur_page = iomap_next_page(inode, ctx->pages,
-					pos, length, &done);
-			if (!ctx->cur_page)
-				break;
+			ctx->cur_page = readahead_page(ctx->rac);
 			ctx->cur_page_in_bio = false;
 		}
 		ret = iomap_readpage_actor(inode, pos + done, length - done,
 				ctx, iomap, srcmap);
+		if (WARN_ON(ret == 0))
+			break;
+		done += ret;
+		if (offset_in_page(pos + done) == 0) {
+			readahead_next(ctx->rac);
+			if (!ctx->cur_page_in_bio)
+				unlock_page(ctx->cur_page);
+			put_page(ctx->cur_page);
+			ctx->cur_page = NULL;
+		}
 	}
 
 	return done;
 }
 
-int
-iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops)
+/**
+ * iomap_readahead - Attempt to read pages from a file.
+ * @rac: Describes the pages to be read.
+ * @ops: The operations vector for the filesystem.
+ *
+ * This function is for filesystems to call to implement their readahead
+ * address_space operation.
+ *
+ * Context: The file is pinned by the caller, and the pages to be read are
+ * all locked and have an elevated refcount.  This function will unlock
+ * the pages (once I/O has completed on them, or I/O has been determined to
+ * not be necessary).  It will also decrease the refcount once the pages
+ * have been submitted for I/O.  After this point, the page may be removed
+ * from the page cache, and should not be referenced.
+ */
+void iomap_readahead(struct readahead_control *rac, const struct iomap_ops *ops)
 {
+	struct inode *inode = rac->mapping->host;
 	struct iomap_readpage_ctx ctx = {
-		.pages		= pages,
-		.is_readahead	= true,
+		.rac	= rac,
 	};
-	loff_t pos = page_offset(list_entry(pages->prev, struct page, lru));
-	loff_t last = page_offset(list_entry(pages->next, struct page, lru));
-	loff_t length = last - pos + PAGE_SIZE, ret = 0;
+	loff_t pos = readahead_offset(rac);
+	loff_t length = readahead_length(rac);
 
-	trace_iomap_readpages(mapping->host, nr_pages);
+	trace_iomap_readahead(inode, readahead_count(rac));
 
 	while (length > 0) {
-		ret = iomap_apply(mapping->host, pos, length, 0, ops,
-				&ctx, iomap_readpages_actor);
+		loff_t ret = iomap_apply(inode, pos, length, 0, ops,
+				&ctx, iomap_readahead_actor);
 		if (ret <= 0) {
 			WARN_ON_ONCE(ret == 0);
-			goto done;
+			break;
 		}
 		pos += ret;
 		length -= ret;
 	}
-	ret = 0;
-done:
+
 	if (ctx.bio)
 		submit_bio(ctx.bio);
-	if (ctx.cur_page) {
-		if (!ctx.cur_page_in_bio)
-			unlock_page(ctx.cur_page);
-		put_page(ctx.cur_page);
-	}
-
-	/*
-	 * Check that we didn't lose a page due to the arcance calling
-	 * conventions..
-	 */
-	WARN_ON_ONCE(!ret && !list_empty(ctx.pages));
-	return ret;
+	BUG_ON(ctx.cur_page);
 }
-EXPORT_SYMBOL_GPL(iomap_readpages);
+EXPORT_SYMBOL_GPL(iomap_readahead);
 
 /*
  * iomap_is_partially_uptodate checks whether blocks within a page are
diff --git a/fs/iomap/trace.h b/fs/iomap/trace.h
index 6dc227b8c47e..d6ba705f938a 100644
--- a/fs/iomap/trace.h
+++ b/fs/iomap/trace.h
@@ -39,7 +39,7 @@ DEFINE_EVENT(iomap_readpage_class, name,	\
 	TP_PROTO(struct inode *inode, int nr_pages), \
 	TP_ARGS(inode, nr_pages))
 DEFINE_READPAGE_EVENT(iomap_readpage);
-DEFINE_READPAGE_EVENT(iomap_readpages);
+DEFINE_READPAGE_EVENT(iomap_readahead);
 
 DECLARE_EVENT_CLASS(iomap_page_class,
 	TP_PROTO(struct inode *inode, struct page *page, unsigned long off,
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index 58e937be24ce..6e68eeb50b07 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -621,14 +621,11 @@ xfs_vm_readpage(
 	return iomap_readpage(page, &xfs_read_iomap_ops);
 }
 
-STATIC int
-xfs_vm_readpages(
-	struct file		*unused,
-	struct address_space	*mapping,
-	struct list_head	*pages,
-	unsigned		nr_pages)
+STATIC void
+xfs_vm_readahead(
+	struct readahead_control	*rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &xfs_read_iomap_ops);
+	iomap_readahead(rac, &xfs_read_iomap_ops);
 }
 
 static int
@@ -644,7 +641,7 @@ xfs_iomap_swapfile_activate(
 
 const struct address_space_operations xfs_address_space_operations = {
 	.readpage		= xfs_vm_readpage,
-	.readpages		= xfs_vm_readpages,
+	.readahead		= xfs_vm_readahead,
 	.writepage		= xfs_vm_writepage,
 	.writepages		= xfs_vm_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/fs/zonefs/super.c b/fs/zonefs/super.c
index 8bc6ef82d693..8327a01d3bac 100644
--- a/fs/zonefs/super.c
+++ b/fs/zonefs/super.c
@@ -78,10 +78,9 @@ static int zonefs_readpage(struct file *unused, struct page *page)
 	return iomap_readpage(page, &zonefs_iomap_ops);
 }
 
-static int zonefs_readpages(struct file *unused, struct address_space *mapping,
-			    struct list_head *pages, unsigned int nr_pages)
+static void zonefs_readahead(struct readahead_control *rac)
 {
-	return iomap_readpages(mapping, pages, nr_pages, &zonefs_iomap_ops);
+	iomap_readahead(rac, &zonefs_iomap_ops);
 }
 
 /*
@@ -128,7 +127,7 @@ static int zonefs_writepages(struct address_space *mapping,
 
 static const struct address_space_operations zonefs_file_aops = {
 	.readpage		= zonefs_readpage,
-	.readpages		= zonefs_readpages,
+	.readahead		= zonefs_readahead,
 	.writepage		= zonefs_writepage,
 	.writepages		= zonefs_writepages,
 	.set_page_dirty		= iomap_set_page_dirty,
diff --git a/include/linux/iomap.h b/include/linux/iomap.h
index 8b09463dae0d..bc20bd04c2a2 100644
--- a/include/linux/iomap.h
+++ b/include/linux/iomap.h
@@ -155,8 +155,7 @@ loff_t iomap_apply(struct inode *inode, loff_t pos, loff_t length,
 ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
 		const struct iomap_ops *ops);
 int iomap_readpage(struct page *page, const struct iomap_ops *ops);
-int iomap_readpages(struct address_space *mapping, struct list_head *pages,
-		unsigned nr_pages, const struct iomap_ops *ops);
+void iomap_readahead(struct readahead_control *, const struct iomap_ops *ops);
 int iomap_set_page_dirty(struct page *page);
 int iomap_is_partially_uptodate(struct page *page, unsigned long from,
 		unsigned long count);
-- 
2.25.0




  parent reply	other threads:[~2020-02-17 18:49 UTC|newest]

Thread overview: 555+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-17 18:45 [PATCH v6 00/19] Change readahead API Matthew Wilcox
2020-02-17 18:45 ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45 ` Matthew Wilcox
2020-02-17 18:45 ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45 ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:45 ` [PATCH v6 01/19] mm: Return void from various readahead functions Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  4:47   ` Dave Chinner
2020-02-18  4:47     ` [Cluster-devel] " Dave Chinner
2020-02-18  4:47     ` Dave Chinner
2020-02-18  4:47     ` [f2fs-dev] " Dave Chinner
2020-02-18  4:47     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 21:05   ` John Hubbard
2020-02-18 21:05     ` [Cluster-devel] " John Hubbard
2020-02-18 21:05     ` John Hubbard
2020-02-18 21:05     ` [f2fs-dev] " John Hubbard
2020-02-18 21:05     ` [Ocfs2-devel] " John Hubbard
2020-02-18 21:21     ` Matthew Wilcox
2020-02-18 21:21       ` [Cluster-devel] " Matthew Wilcox
2020-02-18 21:21       ` Matthew Wilcox
2020-02-18 21:21       ` [f2fs-dev] " Matthew Wilcox
2020-02-18 21:21       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18 21:52       ` John Hubbard
2020-02-18 21:52         ` [Cluster-devel] " John Hubbard
2020-02-18 21:52         ` John Hubbard
2020-02-18 21:52         ` [f2fs-dev] " John Hubbard
2020-02-18 21:52         ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 02/19] mm: Ignore return value of ->readpages Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  4:48   ` Dave Chinner
2020-02-18  4:48     ` [Cluster-devel] " Dave Chinner
2020-02-18  4:48     ` Dave Chinner
2020-02-18  4:48     ` [f2fs-dev] " Dave Chinner
2020-02-18  4:48     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 21:33   ` John Hubbard
2020-02-18 21:33     ` [Cluster-devel] " John Hubbard
2020-02-18 21:33     ` John Hubbard
2020-02-18 21:33     ` [f2fs-dev] " John Hubbard
2020-02-18 21:33     ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 03/19] mm: Use readahead_control to pass arguments Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  5:03   ` Dave Chinner
2020-02-18  5:03     ` [Cluster-devel] " Dave Chinner
2020-02-18  5:03     ` Dave Chinner
2020-02-18  5:03     ` [f2fs-dev] " Dave Chinner
2020-02-18  5:03     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 13:56     ` Matthew Wilcox
2020-02-18 13:56       ` [Cluster-devel] " Matthew Wilcox
2020-02-18 13:56       ` Matthew Wilcox
2020-02-18 13:56       ` [f2fs-dev] " Matthew Wilcox
2020-02-18 13:56       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18 22:46       ` Dave Chinner
2020-02-18 22:46         ` [Cluster-devel] " Dave Chinner
2020-02-18 22:46         ` Dave Chinner
2020-02-18 22:46         ` [f2fs-dev] " Dave Chinner
2020-02-18 22:46         ` [Ocfs2-devel] " Dave Chinner
2020-02-18 22:52         ` Matthew Wilcox
2020-02-18 22:52           ` [Cluster-devel] " Matthew Wilcox
2020-02-18 22:52           ` Matthew Wilcox
2020-02-18 22:52           ` [f2fs-dev] " Matthew Wilcox
2020-02-18 22:52           ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18 22:22   ` John Hubbard
2020-02-18 22:22     ` [Cluster-devel] " John Hubbard
2020-02-18 22:22     ` John Hubbard
2020-02-18 22:22     ` [f2fs-dev] " John Hubbard
2020-02-18 22:22     ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 04/19] mm: Rearrange readahead loop Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  5:08   ` Dave Chinner
2020-02-18  5:08     ` [Cluster-devel] " Dave Chinner
2020-02-18  5:08     ` Dave Chinner
2020-02-18  5:08     ` [f2fs-dev] " Dave Chinner
2020-02-18  5:08     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 13:57     ` Matthew Wilcox
2020-02-18 13:57       ` [Cluster-devel] " Matthew Wilcox
2020-02-18 13:57       ` Matthew Wilcox
2020-02-18 13:57       ` [f2fs-dev] " Matthew Wilcox
2020-02-18 13:57       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18 22:48       ` Dave Chinner
2020-02-18 22:48         ` [Cluster-devel] " Dave Chinner
2020-02-18 22:48         ` Dave Chinner
2020-02-18 22:48         ` [f2fs-dev] " Dave Chinner
2020-02-18 22:48         ` [Ocfs2-devel] " Dave Chinner
2020-02-18 22:33   ` John Hubbard
2020-02-18 22:33     ` [Cluster-devel] " John Hubbard
2020-02-18 22:33     ` John Hubbard
2020-02-18 22:33     ` [f2fs-dev] " John Hubbard
2020-02-18 22:33     ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 04/16] mm: Tweak readahead loop slightly Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18 22:57   ` John Hubbard
2020-02-18 22:57     ` [Cluster-devel] " John Hubbard
2020-02-18 22:57     ` John Hubbard
2020-02-18 22:57     ` [f2fs-dev] " John Hubbard
2020-02-18 22:57     ` [Ocfs2-devel] " John Hubbard
2020-02-18 23:00     ` John Hubbard
2020-02-18 23:00       ` [Cluster-devel] " John Hubbard
2020-02-18 23:00       ` John Hubbard
2020-02-18 23:00       ` [f2fs-dev] " John Hubbard
2020-02-18 23:00       ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 05/16] mm: Put readahead pages in cache earlier Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:45 ` [PATCH v6 05/19] mm: Remove 'page_offset' from readahead loop Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  5:14   ` Dave Chinner
2020-02-18  5:14     ` [Cluster-devel] " Dave Chinner
2020-02-18  5:14     ` Dave Chinner
2020-02-18  5:14     ` [f2fs-dev] " Dave Chinner
2020-02-18  5:14     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 23:08   ` John Hubbard
2020-02-18 23:08     ` [Cluster-devel] " John Hubbard
2020-02-18 23:08     ` John Hubbard
2020-02-18 23:08     ` [f2fs-dev] " John Hubbard
2020-02-18 23:08     ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 06/16] mm: Add readahead address space operation Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:45 ` [PATCH v6 06/19] mm: rename readahead loop variable to 'i' Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  5:33   ` Dave Chinner
2020-02-18  5:33     ` [Cluster-devel] " Dave Chinner
2020-02-18  5:33     ` Dave Chinner
2020-02-18  5:33     ` [f2fs-dev] " Dave Chinner
2020-02-18  5:33     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 23:11   ` John Hubbard
2020-02-18 23:11     ` [Cluster-devel] " John Hubbard
2020-02-18 23:11     ` John Hubbard
2020-02-18 23:11     ` [f2fs-dev] " John Hubbard
2020-02-18 23:11     ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 07/16] mm: Add page_cache_readahead_limit Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:45 ` [PATCH v6 07/19] mm: Put readahead pages in cache earlier Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  6:14   ` Dave Chinner
2020-02-18  6:14     ` [Cluster-devel] " Dave Chinner
2020-02-18  6:14     ` Dave Chinner
2020-02-18  6:14     ` [f2fs-dev] " Dave Chinner
2020-02-18  6:14     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 15:42     ` Matthew Wilcox
2020-02-18 15:42       ` [Cluster-devel] " Matthew Wilcox
2020-02-18 15:42       ` Matthew Wilcox
2020-02-18 15:42       ` [f2fs-dev] " Matthew Wilcox
2020-02-18 15:42       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  0:59       ` Dave Chinner
2020-02-19  0:59         ` [Cluster-devel] " Dave Chinner
2020-02-19  0:59         ` Dave Chinner
2020-02-19  0:59         ` [f2fs-dev] " Dave Chinner
2020-02-19  0:59         ` [Ocfs2-devel] " Dave Chinner
2020-02-19  0:01   ` John Hubbard
2020-02-19  0:01     ` [Cluster-devel] " John Hubbard
2020-02-19  0:01     ` John Hubbard
2020-02-19  0:01     ` [f2fs-dev] " John Hubbard
2020-02-19  0:01     ` [Ocfs2-devel] " John Hubbard
2020-02-19  1:02     ` Matthew Wilcox
2020-02-19  1:02       ` [Cluster-devel] " Matthew Wilcox
2020-02-19  1:02       ` Matthew Wilcox
2020-02-19  1:02       ` [f2fs-dev] " Matthew Wilcox
2020-02-19  1:02       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  1:13       ` John Hubbard
2020-02-19  1:13         ` [Cluster-devel] " John Hubbard
2020-02-19  1:13         ` John Hubbard
2020-02-19  1:13         ` [f2fs-dev] " John Hubbard
2020-02-19  1:13         ` [Ocfs2-devel] " John Hubbard
2020-02-19  3:24       ` John Hubbard
2020-02-19  3:24         ` [Cluster-devel] " John Hubbard
2020-02-19  3:24         ` John Hubbard
2020-02-19  3:24         ` [f2fs-dev] " John Hubbard
2020-02-19  3:24         ` [Ocfs2-devel] " John Hubbard
2020-02-19 14:41     ` Matthew Wilcox
2020-02-19 14:41       ` [Cluster-devel] " Matthew Wilcox
2020-02-19 14:41       ` Matthew Wilcox
2020-02-19 14:41       ` [f2fs-dev] " Matthew Wilcox
2020-02-19 14:41       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19 14:52       ` Christoph Hellwig
2020-02-19 14:52         ` [Cluster-devel] " Christoph Hellwig
2020-02-19 14:52         ` Christoph Hellwig
2020-02-19 14:52         ` [f2fs-dev] " Christoph Hellwig
2020-02-19 14:52         ` [Ocfs2-devel] " Christoph Hellwig
2020-02-19 15:01         ` Matthew Wilcox
2020-02-19 15:01           ` [Cluster-devel] " Matthew Wilcox
2020-02-19 15:01           ` Matthew Wilcox
2020-02-19 15:01           ` [f2fs-dev] " Matthew Wilcox
2020-02-19 15:01           ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19 20:24           ` John Hubbard
2020-02-19 20:24             ` [Cluster-devel] " John Hubbard
2020-02-19 20:24             ` John Hubbard
2020-02-19 20:24             ` [f2fs-dev] " John Hubbard
2020-02-19 20:24             ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 08/16] fs: Convert mpage_readpages to mpage_readahead Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:45 ` [PATCH v6 08/19] mm: Add readahead address space operation Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  6:21   ` Dave Chinner
2020-02-18  6:21     ` [Cluster-devel] " Dave Chinner
2020-02-18  6:21     ` Dave Chinner
2020-02-18  6:21     ` [f2fs-dev] " Dave Chinner
2020-02-18  6:21     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 16:10     ` Matthew Wilcox
2020-02-18 16:10       ` [Cluster-devel] " Matthew Wilcox
2020-02-18 16:10       ` Matthew Wilcox
2020-02-18 16:10       ` [f2fs-dev] " Matthew Wilcox
2020-02-18 16:10       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  1:04       ` Dave Chinner
2020-02-19  1:04         ` [Cluster-devel] " Dave Chinner
2020-02-19  1:04         ` Dave Chinner
2020-02-19  1:04         ` [f2fs-dev] " Dave Chinner
2020-02-19  1:04         ` [Ocfs2-devel] " Dave Chinner
2020-02-19  0:12   ` John Hubbard
2020-02-19  0:12     ` [Cluster-devel] " John Hubbard
2020-02-19  0:12     ` John Hubbard
2020-02-19  0:12     ` [f2fs-dev] " John Hubbard
2020-02-19  0:12     ` [Ocfs2-devel] " John Hubbard
2020-02-19  3:10   ` Eric Biggers
2020-02-19  3:10     ` [Cluster-devel] " Eric Biggers
2020-02-19  3:10     ` Eric Biggers
2020-02-19  3:10     ` [f2fs-dev] " Eric Biggers
2020-02-19  3:10     ` [Ocfs2-devel] " Eric Biggers
2020-02-19  3:35     ` Eric Biggers
2020-02-19  3:35       ` [Cluster-devel] " Eric Biggers
2020-02-19  3:35       ` Eric Biggers
2020-02-19  3:35       ` [f2fs-dev] " Eric Biggers
2020-02-19  3:35       ` [Ocfs2-devel] " Eric Biggers
2020-02-19 16:52     ` Matthew Wilcox
2020-02-19 16:52       ` [Cluster-devel] " Matthew Wilcox
2020-02-19 16:52       ` Matthew Wilcox
2020-02-19 16:52       ` [f2fs-dev] " Matthew Wilcox
2020-02-19 16:52       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:45 ` [PATCH v6 09/16] btrfs: Convert from readpages to readahead Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:45 ` [PATCH v6 09/19] mm: Add page_cache_readahead_limit Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  6:31   ` Dave Chinner
2020-02-18  6:31     ` [Cluster-devel] " Dave Chinner
2020-02-18  6:31     ` Dave Chinner
2020-02-18  6:31     ` [f2fs-dev] " Dave Chinner
2020-02-18  6:31     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 19:54     ` Matthew Wilcox
2020-02-18 19:54       ` [Cluster-devel] " Matthew Wilcox
2020-02-18 19:54       ` Matthew Wilcox
2020-02-18 19:54       ` [f2fs-dev] " Matthew Wilcox
2020-02-18 19:54       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  1:08       ` Dave Chinner
2020-02-19  1:08         ` [Cluster-devel] " Dave Chinner
2020-02-19  1:08         ` Dave Chinner
2020-02-19  1:08         ` [f2fs-dev] " Dave Chinner
2020-02-19  1:08         ` [Ocfs2-devel] " Dave Chinner
2020-02-19  1:32   ` John Hubbard
2020-02-19  1:32     ` [Cluster-devel] " John Hubbard
2020-02-19  1:32     ` John Hubbard
2020-02-19  1:32     ` [f2fs-dev] " John Hubbard
2020-02-19  1:32     ` [Ocfs2-devel] " John Hubbard
2020-02-19  2:23     ` Matthew Wilcox
2020-02-19  2:23       ` [Cluster-devel] " Matthew Wilcox
2020-02-19  2:23       ` Matthew Wilcox
2020-02-19  2:23       ` [f2fs-dev] " Matthew Wilcox
2020-02-19  2:23       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  2:46       ` John Hubbard
2020-02-19  2:46         ` [Cluster-devel] " John Hubbard
2020-02-19  2:46         ` John Hubbard
2020-02-19  2:46         ` [f2fs-dev] " John Hubbard
2020-02-19  2:46         ` [Ocfs2-devel] " John Hubbard
2020-02-17 18:45 ` [PATCH v6 10/16] erofs: Convert uncompressed files from readpages to readahead Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:45 ` [PATCH v6 10/19] fs: Convert mpage_readpages to mpage_readahead Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  1:51   ` Joseph Qi
2020-02-18  1:51     ` [Cluster-devel] " Joseph Qi
2020-02-18  1:51     ` Joseph Qi
2020-02-18  1:51     ` [f2fs-dev] " Joseph Qi
2020-02-18  1:51     ` Joseph Qi
2020-02-18  6:37   ` Dave Chinner
2020-02-18  6:37     ` [Cluster-devel] " Dave Chinner
2020-02-18  6:37     ` Dave Chinner
2020-02-18  6:37     ` [f2fs-dev] " Dave Chinner
2020-02-18  6:37     ` [Ocfs2-devel] " Dave Chinner
2020-02-19  2:48   ` John Hubbard
2020-02-19  2:48     ` [Cluster-devel] " John Hubbard
2020-02-19  2:48     ` John Hubbard
2020-02-19  2:48     ` [f2fs-dev] " John Hubbard
2020-02-19  2:48     ` [Ocfs2-devel] " John Hubbard
2020-02-19  3:28   ` Eric Biggers
2020-02-19  3:28     ` [Cluster-devel] " Eric Biggers
2020-02-19  3:28     ` Eric Biggers
2020-02-19  3:28     ` [f2fs-dev] " Eric Biggers
2020-02-19  3:28     ` [Ocfs2-devel] " Eric Biggers
2020-02-19  3:47     ` Matthew Wilcox
2020-02-19  3:47       ` [Cluster-devel] " Matthew Wilcox
2020-02-19  3:47       ` Matthew Wilcox
2020-02-19  3:47       ` [f2fs-dev] " Matthew Wilcox
2020-02-19  3:47       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:55       ` Eric Biggers
2020-02-19  3:55         ` [Cluster-devel] " Eric Biggers
2020-02-19  3:55         ` Eric Biggers
2020-02-19  3:55         ` [f2fs-dev] " Eric Biggers
2020-02-19  3:55         ` [Ocfs2-devel] " Eric Biggers
2020-02-17 18:45 ` [PATCH v6 11/19] btrfs: Convert from readpages to readahead Matthew Wilcox
2020-02-17 18:45   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:45   ` Matthew Wilcox
2020-02-17 18:45   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:45   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  6:57   ` Dave Chinner
2020-02-18  6:57     ` [Cluster-devel] " Dave Chinner
2020-02-18  6:57     ` Dave Chinner
2020-02-18  6:57     ` [f2fs-dev] " Dave Chinner
2020-02-18  6:57     ` [Ocfs2-devel] " Dave Chinner
2020-02-18 21:12     ` Matthew Wilcox
2020-02-18 21:12       ` [Cluster-devel] " Matthew Wilcox
2020-02-18 21:12       ` Matthew Wilcox
2020-02-18 21:12       ` [f2fs-dev] " Matthew Wilcox
2020-02-18 21:12       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  1:23       ` Dave Chinner
2020-02-19  1:23         ` [Cluster-devel] " Dave Chinner
2020-02-19  1:23         ` Dave Chinner
2020-02-19  1:23         ` [f2fs-dev] " Dave Chinner
2020-02-19  1:23         ` [Ocfs2-devel] " Dave Chinner
2020-02-17 18:46 ` [PATCH v6 11/16] erofs: Convert compressed files " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  2:34   ` Gao Xiang
2020-02-19  2:34     ` [Cluster-devel] " Gao Xiang
2020-02-19  2:34     ` Gao Xiang
2020-02-19  2:34     ` [f2fs-dev] " Gao Xiang
2020-02-19  2:34     ` [Ocfs2-devel] " Gao Xiang
2020-02-17 18:46 ` [PATCH v6 12/19] erofs: Convert uncompressed " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  2:39   ` Gao Xiang
2020-02-19  2:39     ` [Cluster-devel] " Gao Xiang
2020-02-19  2:39     ` Gao Xiang
2020-02-19  2:39     ` [f2fs-dev] " Gao Xiang
2020-02-19  2:39     ` [Ocfs2-devel] " Gao Xiang
2020-02-19  3:04   ` Dave Chinner
2020-02-19  3:04     ` [Cluster-devel] " Dave Chinner
2020-02-19  3:04     ` Dave Chinner
2020-02-19  3:04     ` [f2fs-dev] " Dave Chinner
2020-02-19  3:04     ` [Ocfs2-devel] " Dave Chinner
2020-02-17 18:46 ` [PATCH v6 12/16] ext4: Convert " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:46 ` [PATCH v6 13/19] erofs: Convert compressed files " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:08   ` Dave Chinner
2020-02-19  3:08     ` [Cluster-devel] " Dave Chinner
2020-02-19  3:08     ` Dave Chinner
2020-02-19  3:08     ` [f2fs-dev] " Dave Chinner
2020-02-19  3:08     ` [Ocfs2-devel] " Dave Chinner
2020-02-17 18:46 ` [PATCH v6 13/16] f2fs: Convert " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:46 ` [PATCH v6 14/19] ext4: " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:16   ` Dave Chinner
2020-02-19  3:16     ` [Cluster-devel] " Dave Chinner
2020-02-19  3:16     ` Dave Chinner
2020-02-19  3:16     ` [f2fs-dev] " Dave Chinner
2020-02-19  3:16     ` [Ocfs2-devel] " Dave Chinner
2020-02-19  3:29   ` Eric Biggers
2020-02-19  3:29     ` [Cluster-devel] " Eric Biggers
2020-02-19  3:29     ` Eric Biggers
2020-02-19  3:29     ` [f2fs-dev] " Eric Biggers
2020-02-19  3:29     ` [Ocfs2-devel] " Eric Biggers
2020-02-17 18:46 ` [PATCH v6 14/16] fuse: " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:46 ` [PATCH v6 15/19] f2fs: " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:46 ` Matthew Wilcox [this message]
2020-02-17 18:46   ` [Cluster-devel] [PATCH v6 15/16] iomap: " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:46 ` [PATCH v6 16/19] fuse: " Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:22   ` Dave Chinner
2020-02-19  3:22     ` [Cluster-devel] " Dave Chinner
2020-02-19  3:22     ` Dave Chinner
2020-02-19  3:22     ` [f2fs-dev] " Dave Chinner
2020-02-19  3:22     ` [Ocfs2-devel] " Dave Chinner
2020-02-17 18:46 ` [PATCH v6 16/16] mm: Use memalloc_nofs_save in readahead path Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:46 ` [PATCH v6 17/19] iomap: Restructure iomap_readpages_actor Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:17   ` John Hubbard
2020-02-19  3:17     ` [Cluster-devel] " John Hubbard
2020-02-19  3:17     ` John Hubbard
2020-02-19  3:17     ` [f2fs-dev] " John Hubbard
2020-02-19  3:17     ` [Ocfs2-devel] " John Hubbard
2020-02-19  5:35     ` Matthew Wilcox
2020-02-19  5:35       ` [Cluster-devel] " Matthew Wilcox
2020-02-19  5:35       ` Matthew Wilcox
2020-02-19  5:35       ` [f2fs-dev] " Matthew Wilcox
2020-02-19  5:35       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:29   ` Dave Chinner
2020-02-19  3:29     ` [Cluster-devel] " Dave Chinner
2020-02-19  3:29     ` Dave Chinner
2020-02-19  3:29     ` [f2fs-dev] " Dave Chinner
2020-02-19  3:29     ` [Ocfs2-devel] " Dave Chinner
2020-02-19  6:04     ` Matthew Wilcox
2020-02-19  6:04       ` [Cluster-devel] " Matthew Wilcox
2020-02-19  6:04       ` Matthew Wilcox
2020-02-19  6:04       ` [f2fs-dev] " Matthew Wilcox
2020-02-19  6:04       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  6:40       ` Dave Chinner
2020-02-19  6:40         ` [Cluster-devel] " Dave Chinner
2020-02-19  6:40         ` Dave Chinner
2020-02-19  6:40         ` [f2fs-dev] " Dave Chinner
2020-02-19  6:40         ` [Ocfs2-devel] " Dave Chinner
2020-02-19 17:06         ` Matthew Wilcox
2020-02-19 17:06           ` [Cluster-devel] " Matthew Wilcox
2020-02-19 17:06           ` Matthew Wilcox
2020-02-19 17:06           ` [f2fs-dev] " Matthew Wilcox
2020-02-19 17:06           ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:46 ` [PATCH v6 18/19] iomap: Convert from readpages to readahead Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:40   ` Dave Chinner
2020-02-19  3:40     ` [Cluster-devel] " Dave Chinner
2020-02-19  3:40     ` Dave Chinner
2020-02-19  3:40     ` [f2fs-dev] " Dave Chinner
2020-02-19  3:40     ` [Ocfs2-devel] " Dave Chinner
2020-02-17 18:46 ` [PATCH v6 19/19] mm: Use memalloc_nofs_save in readahead path Matthew Wilcox
2020-02-17 18:46   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:46   ` Matthew Wilcox
2020-02-17 18:46   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:46   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:43   ` Dave Chinner
2020-02-19  3:43     ` [Cluster-devel] " Dave Chinner
2020-02-19  3:43     ` Dave Chinner
2020-02-19  3:43     ` [f2fs-dev] " Dave Chinner
2020-02-19  3:43     ` [Ocfs2-devel] " Dave Chinner
2020-02-19  5:22     ` Matthew Wilcox
2020-02-19  5:22       ` [Cluster-devel] " Matthew Wilcox
2020-02-19  5:22       ` Matthew Wilcox
2020-02-19  5:22       ` [f2fs-dev] " Matthew Wilcox
2020-02-19  5:22       ` [Ocfs2-devel] " Matthew Wilcox
2020-02-17 18:48 ` [PATCH v6 00/19] Change readahead API Matthew Wilcox
2020-02-17 18:48   ` [Cluster-devel] " Matthew Wilcox
2020-02-17 18:48   ` Matthew Wilcox
2020-02-17 18:48   ` [f2fs-dev] " Matthew Wilcox
2020-02-17 18:48   ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18  4:56 ` Dave Chinner
2020-02-18  4:56   ` [Cluster-devel] " Dave Chinner
2020-02-18  4:56   ` Dave Chinner
2020-02-18  4:56   ` [f2fs-dev] " Dave Chinner
2020-02-18  4:56   ` [Ocfs2-devel] " Dave Chinner
2020-02-18 13:42   ` Matthew Wilcox
2020-02-18 13:42     ` [Cluster-devel] " Matthew Wilcox
2020-02-18 13:42     ` Matthew Wilcox
2020-02-18 13:42     ` [f2fs-dev] " Matthew Wilcox
2020-02-18 13:42     ` [Ocfs2-devel] " Matthew Wilcox
2020-02-18 21:26     ` Dave Chinner
2020-02-18 21:26       ` [Cluster-devel] " Dave Chinner
2020-02-18 21:26       ` Dave Chinner
2020-02-18 21:26       ` [f2fs-dev] " Dave Chinner
2020-02-18 21:26       ` [Ocfs2-devel] " Dave Chinner
2020-02-19  3:45       ` Dave Chinner
2020-02-19  3:45         ` [Cluster-devel] " Dave Chinner
2020-02-19  3:45         ` Dave Chinner
2020-02-19  3:45         ` [f2fs-dev] " Dave Chinner
2020-02-19  3:45         ` [Ocfs2-devel] " Dave Chinner
2020-02-19  3:48         ` Matthew Wilcox
2020-02-19  3:48           ` [Cluster-devel] " Matthew Wilcox
2020-02-19  3:48           ` Matthew Wilcox
2020-02-19  3:48           ` [f2fs-dev] " Matthew Wilcox
2020-02-19  3:48           ` [Ocfs2-devel] " Matthew Wilcox
2020-02-19  3:57           ` Dave Chinner
2020-02-19  3:57             ` [Cluster-devel] " Dave Chinner
2020-02-19  3:57             ` Dave Chinner
2020-02-19  3:57             ` [f2fs-dev] " Dave Chinner
2020-02-19  3:57             ` [Ocfs2-devel] " Dave Chinner
2020-02-18 20:49 ` John Hubbard
2020-02-18 20:49   ` [Cluster-devel] " John Hubbard
2020-02-18 20:49   ` John Hubbard
2020-02-18 20:49   ` [f2fs-dev] " John Hubbard
2020-02-18 20:49   ` [Ocfs2-devel] " John Hubbard

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=20200217184613.19668-28-willy@infradead.org \
    --to=willy@infradead.org \
    --cc=cluster-devel@redhat.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 \
    /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.