linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/10] Cleanup unnecessary get_extent parameters
@ 2017-11-06 19:30 David Sterba
  2017-11-06 19:30 ` [PATCH 01/10] btrfs: sink get_extent parameter to extent_writepages David Sterba
                   ` (10 more replies)
  0 siblings, 11 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:30 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

There are several functions that take a generic get_extent parameter, but not
all of them use it to distinguish between btree_get_exnent (for metadata) and
btrfs_get_extent (for data). This is namely extent_read_full_page and
__do_readpage.

The rest can be cleaned up so that the desired get_extent callback is used
directly. The patchset does that incrementally so each change is clear.

The difference in binary code size is not that impressive:
  text    data     bss     dec     hex filename
985353   75124   18560 1079037  1076fd pre/btrfs.ko
985193   75124   18560 1078877  10765d post/btrfs.ko

but the estimated stack consumption savings are about 64 bytes, and it could be
more if we calculate cummulative effect when more than one reduced function is
in the callchain:

-extent_io.c:btree_write_cache_pages                      288 static
+extent_io.c:btree_write_cache_pages                      280 static
-extent_io.c:extent_fiemap                                264 dynamic,bounded
+extent_io.c:extent_fiemap                                256 dynamic,bounded
-extent_io.c:extent_readpages                             264 dynamic,bounded
+extent_io.c:extent_readpages                             248 dynamic,bounded
-extent_io.c:extent_write_full_page                       56 static
+extent_io.c:extent_write_full_page                       48 static
-extent_io.c:extent_write_locked_range                    200 static
+extent_io.c:extent_write_locked_range                    192 static
-extent_io.c:extent_writepages                            56 static
+extent_io.c:extent_writepages                            48 static
-extent_io.c:get_extent_skip_holes                        64 static
+extent_io.c:get_extent_skip_holes                        56 static

(calculated with gcc -fstack-usage)

David Sterba (10):

  btrfs: sink get_extent parameter to extent_writepages
  btrfs: sink get_extent parameter to extent_write_locked_range
  btrfs: sink get_extent parameter to extent_write_full_page
  btrfs: drop get_extent from extent_page_data
  btrfs: sink get_extent parameter to extent_fiemap
  btrfs: sink get_extent parameter to get_extent_skip_holes
  btrfs: sink get_extent parameter to extent_readpages
  btrfs: sink get_extent parameter to __extent_readpages
  btrfs: sink get_extent parameter to __do_contiguous_readpages
  btrfs: sink get_extent parameter to read_extent_buffer_pages

 fs/btrfs/disk-io.c   |  8 ++++----
 fs/btrfs/disk-io.h   |  3 +++
 fs/btrfs/extent_io.c | 55 ++++++++++++++++++++--------------------------------
 fs/btrfs/extent_io.h | 12 ++++--------
 fs/btrfs/inode.c     | 10 ++++------
 5 files changed, 36 insertions(+), 52 deletions(-)

-- 
2.14.3


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 01/10] btrfs: sink get_extent parameter to extent_writepages
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
@ 2017-11-06 19:30 ` David Sterba
  2017-11-06 19:30 ` [PATCH 02/10] btrfs: sink get_extent parameter to extent_write_locked_range David Sterba
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:30 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

There's only one caller.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 3 +--
 fs/btrfs/extent_io.h | 1 -
 fs/btrfs/inode.c     | 2 +-
 3 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index ea412243c68d..12305542ed2b 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4131,14 +4131,13 @@ int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
 
 int extent_writepages(struct extent_io_tree *tree,
 		      struct address_space *mapping,
-		      get_extent_t *get_extent,
 		      struct writeback_control *wbc)
 {
 	int ret = 0;
 	struct extent_page_data epd = {
 		.bio = NULL,
 		.tree = tree,
-		.get_extent = get_extent,
+		.get_extent = btrfs_get_extent,
 		.extent_locked = 0,
 		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
 	};
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index d8b27af7101e..7e1b730045c5 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -407,7 +407,6 @@ int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
 			      int mode);
 int extent_writepages(struct extent_io_tree *tree,
 		      struct address_space *mapping,
-		      get_extent_t *get_extent,
 		      struct writeback_control *wbc);
 int btree_write_cache_pages(struct address_space *mapping,
 			    struct writeback_control *wbc);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 88cd15fc34d4..d626f209b22f 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8884,7 +8884,7 @@ static int btrfs_writepages(struct address_space *mapping,
 	struct extent_io_tree *tree;
 
 	tree = &BTRFS_I(mapping->host)->io_tree;
-	return extent_writepages(tree, mapping, btrfs_get_extent, wbc);
+	return extent_writepages(tree, mapping, wbc);
 }
 
 static int
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 02/10] btrfs: sink get_extent parameter to extent_write_locked_range
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
  2017-11-06 19:30 ` [PATCH 01/10] btrfs: sink get_extent parameter to extent_writepages David Sterba
@ 2017-11-06 19:30 ` David Sterba
  2017-11-06 19:30 ` [PATCH 03/10] btrfs: sink get_extent parameter to extent_write_full_page David Sterba
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:30 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

There's only one caller.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 5 ++---
 fs/btrfs/extent_io.h | 3 +--
 fs/btrfs/inode.c     | 1 -
 3 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 12305542ed2b..42ecd975e074 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4087,8 +4087,7 @@ int extent_write_full_page(struct extent_io_tree *tree, struct page *page,
 }
 
 int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
-			      u64 start, u64 end, get_extent_t *get_extent,
-			      int mode)
+			      u64 start, u64 end, int mode)
 {
 	int ret = 0;
 	struct address_space *mapping = inode->i_mapping;
@@ -4099,7 +4098,7 @@ int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
 	struct extent_page_data epd = {
 		.bio = NULL,
 		.tree = tree,
-		.get_extent = get_extent,
+		.get_extent = btrfs_get_extent,
 		.extent_locked = 1,
 		.sync_io = mode == WB_SYNC_ALL,
 	};
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index 7e1b730045c5..a1f74d9b8dda 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -403,8 +403,7 @@ int extent_write_full_page(struct extent_io_tree *tree, struct page *page,
 			  get_extent_t *get_extent,
 			  struct writeback_control *wbc);
 int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
-			      u64 start, u64 end, get_extent_t *get_extent,
-			      int mode);
+			      u64 start, u64 end, int mode);
 int extent_writepages(struct extent_io_tree *tree,
 		      struct address_space *mapping,
 		      struct writeback_control *wbc);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index d626f209b22f..f5e706c09af1 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -769,7 +769,6 @@ static noinline void submit_compressed_extents(struct inode *inode,
 						  inode, async_extent->start,
 						  async_extent->start +
 						  async_extent->ram_size - 1,
-						  btrfs_get_extent,
 						  WB_SYNC_ALL);
 			else if (ret)
 				unlock_page(async_cow->locked_page);
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 03/10] btrfs: sink get_extent parameter to extent_write_full_page
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
  2017-11-06 19:30 ` [PATCH 01/10] btrfs: sink get_extent parameter to extent_writepages David Sterba
  2017-11-06 19:30 ` [PATCH 02/10] btrfs: sink get_extent parameter to extent_write_locked_range David Sterba
@ 2017-11-06 19:30 ` David Sterba
  2017-11-06 19:30 ` [PATCH 04/10] btrfs: drop get_extent from extent_page_data David Sterba
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:30 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

There's only one caller.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 3 +--
 fs/btrfs/extent_io.h | 1 -
 fs/btrfs/inode.c     | 2 +-
 3 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 42ecd975e074..76d1b307aeaa 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4068,14 +4068,13 @@ static noinline void flush_write_bio(void *data)
 }
 
 int extent_write_full_page(struct extent_io_tree *tree, struct page *page,
-			  get_extent_t *get_extent,
 			  struct writeback_control *wbc)
 {
 	int ret;
 	struct extent_page_data epd = {
 		.bio = NULL,
 		.tree = tree,
-		.get_extent = get_extent,
+		.get_extent = btrfs_get_extent,
 		.extent_locked = 0,
 		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
 	};
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index a1f74d9b8dda..b095aa787857 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -400,7 +400,6 @@ int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
 int extent_invalidatepage(struct extent_io_tree *tree,
 			  struct page *page, unsigned long offset);
 int extent_write_full_page(struct extent_io_tree *tree, struct page *page,
-			  get_extent_t *get_extent,
 			  struct writeback_control *wbc);
 int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
 			      u64 start, u64 end, int mode);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index f5e706c09af1..31f9552bd78a 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8872,7 +8872,7 @@ static int btrfs_writepage(struct page *page, struct writeback_control *wbc)
 		return AOP_WRITEPAGE_ACTIVATE;
 	}
 	tree = &BTRFS_I(page->mapping->host)->io_tree;
-	ret = extent_write_full_page(tree, page, btrfs_get_extent, wbc);
+	ret = extent_write_full_page(tree, page, wbc);
 	btrfs_add_delayed_iput(inode);
 	return ret;
 }
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 04/10] btrfs: drop get_extent from extent_page_data
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
                   ` (2 preceding siblings ...)
  2017-11-06 19:30 ` [PATCH 03/10] btrfs: sink get_extent parameter to extent_write_full_page David Sterba
@ 2017-11-06 19:30 ` David Sterba
  2017-11-06 19:30 ` [PATCH 05/10] btrfs: sink get_extent parameter to extent_fiemap David Sterba
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:30 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

Previous patches cleaned up all places where
extent_page_data::get_extent was set and it was btrfs_get_extent all the
time, so we can simply call that instead.

This also reduces size of extent_page_data by 8 bytes which has positive
effect on stack consumption on various functions on the write out path.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 76d1b307aeaa..8f1d98bc11d0 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -108,8 +108,6 @@ struct tree_entry {
 struct extent_page_data {
 	struct bio *bio;
 	struct extent_io_tree *tree;
-	get_extent_t *get_extent;
-
 	/* tells writepage not to lock the state bits for this range
 	 * it still does the unlocking
 	 */
@@ -3372,7 +3370,7 @@ static noinline_for_stack int __extent_writepage_io(struct inode *inode,
 							 page_end, NULL, 1);
 			break;
 		}
-		em = epd->get_extent(BTRFS_I(inode), page, pg_offset, cur,
+		em = btrfs_get_extent(BTRFS_I(inode), page, pg_offset, cur,
 				     end - cur + 1, 1);
 		if (IS_ERR_OR_NULL(em)) {
 			SetPageError(page);
@@ -4074,7 +4072,6 @@ int extent_write_full_page(struct extent_io_tree *tree, struct page *page,
 	struct extent_page_data epd = {
 		.bio = NULL,
 		.tree = tree,
-		.get_extent = btrfs_get_extent,
 		.extent_locked = 0,
 		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
 	};
@@ -4097,7 +4094,6 @@ int extent_write_locked_range(struct extent_io_tree *tree, struct inode *inode,
 	struct extent_page_data epd = {
 		.bio = NULL,
 		.tree = tree,
-		.get_extent = btrfs_get_extent,
 		.extent_locked = 1,
 		.sync_io = mode == WB_SYNC_ALL,
 	};
@@ -4135,7 +4131,6 @@ int extent_writepages(struct extent_io_tree *tree,
 	struct extent_page_data epd = {
 		.bio = NULL,
 		.tree = tree,
-		.get_extent = btrfs_get_extent,
 		.extent_locked = 0,
 		.sync_io = wbc->sync_mode == WB_SYNC_ALL,
 	};
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 05/10] btrfs: sink get_extent parameter to extent_fiemap
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
                   ` (3 preceding siblings ...)
  2017-11-06 19:30 ` [PATCH 04/10] btrfs: drop get_extent from extent_page_data David Sterba
@ 2017-11-06 19:30 ` David Sterba
  2017-11-06 19:30 ` [PATCH 06/10] btrfs: sink get_extent parameter to get_extent_skip_holes David Sterba
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:30 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

All callers pass btrfs_get_extent_fiemap and we don't expect anything
else in the context of extent_fiemap.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 6 +++---
 fs/btrfs/extent_io.h | 2 +-
 fs/btrfs/inode.c     | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 8f1d98bc11d0..a2815f335d38 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4451,7 +4451,7 @@ static int emit_last_fiemap_cache(struct btrfs_fs_info *fs_info,
 }
 
 int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
-		__u64 start, __u64 len, get_extent_t *get_extent)
+		__u64 start, __u64 len)
 {
 	int ret = 0;
 	u64 off = start;
@@ -4534,7 +4534,7 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 			 &cached_state);
 
 	em = get_extent_skip_holes(inode, start, last_for_get_extent,
-				   get_extent);
+				   btrfs_get_extent_fiemap);
 	if (!em)
 		goto out;
 	if (IS_ERR(em)) {
@@ -4623,7 +4623,7 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 
 		/* now scan forward to see if this is really the last extent. */
 		em = get_extent_skip_holes(inode, off, last_for_get_extent,
-					   get_extent);
+					   btrfs_get_extent_fiemap);
 		if (IS_ERR(em)) {
 			ret = PTR_ERR(em);
 			goto out;
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index b095aa787857..917b24bc7547 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -413,7 +413,7 @@ int extent_readpages(struct extent_io_tree *tree,
 		     struct list_head *pages, unsigned nr_pages,
 		     get_extent_t get_extent);
 int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
-		__u64 start, __u64 len, get_extent_t *get_extent);
+		__u64 start, __u64 len);
 void set_page_extent_mapped(struct page *page);
 
 struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 31f9552bd78a..588c269bfc13 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8840,7 +8840,7 @@ static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 	if (ret)
 		return ret;
 
-	return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap);
+	return extent_fiemap(inode, fieinfo, start, len);
 }
 
 int btrfs_readpage(struct file *file, struct page *page)
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 06/10] btrfs: sink get_extent parameter to get_extent_skip_holes
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
                   ` (4 preceding siblings ...)
  2017-11-06 19:30 ` [PATCH 05/10] btrfs: sink get_extent parameter to extent_fiemap David Sterba
@ 2017-11-06 19:30 ` David Sterba
  2017-11-06 19:30 ` [PATCH 07/10] btrfs: sink get_extent parameter to extent_readpages David Sterba
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:30 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

All callers pass btrfs_get_extent_fiemap and get_extent_skip_holes
itself is used only as a fiemap helper.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index a2815f335d38..c30694f57d02 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4302,9 +4302,7 @@ int try_release_extent_mapping(struct extent_map_tree *map,
  * This maps until we find something past 'last'
  */
 static struct extent_map *get_extent_skip_holes(struct inode *inode,
-						u64 offset,
-						u64 last,
-						get_extent_t *get_extent)
+						u64 offset, u64 last)
 {
 	u64 sectorsize = btrfs_inode_sectorsize(inode);
 	struct extent_map *em;
@@ -4318,7 +4316,8 @@ static struct extent_map *get_extent_skip_holes(struct inode *inode,
 		if (len == 0)
 			break;
 		len = ALIGN(len, sectorsize);
-		em = get_extent(BTRFS_I(inode), NULL, 0, offset, len, 0);
+		em = btrfs_get_extent_fiemap(BTRFS_I(inode), NULL, 0, offset,
+				len, 0);
 		if (IS_ERR_OR_NULL(em))
 			return em;
 
@@ -4533,8 +4532,7 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 	lock_extent_bits(&BTRFS_I(inode)->io_tree, start, start + len - 1,
 			 &cached_state);
 
-	em = get_extent_skip_holes(inode, start, last_for_get_extent,
-				   btrfs_get_extent_fiemap);
+	em = get_extent_skip_holes(inode, start, last_for_get_extent);
 	if (!em)
 		goto out;
 	if (IS_ERR(em)) {
@@ -4622,8 +4620,7 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 		}
 
 		/* now scan forward to see if this is really the last extent. */
-		em = get_extent_skip_holes(inode, off, last_for_get_extent,
-					   btrfs_get_extent_fiemap);
+		em = get_extent_skip_holes(inode, off, last_for_get_extent);
 		if (IS_ERR(em)) {
 			ret = PTR_ERR(em);
 			goto out;
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 07/10] btrfs: sink get_extent parameter to extent_readpages
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
                   ` (5 preceding siblings ...)
  2017-11-06 19:30 ` [PATCH 06/10] btrfs: sink get_extent parameter to get_extent_skip_holes David Sterba
@ 2017-11-06 19:30 ` David Sterba
  2017-11-06 19:31 ` [PATCH 08/10] btrfs: sink get_extent parameter to __extent_readpages David Sterba
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:30 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

There's only one caller that passes btrfs_get_extent.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 11 +++++------
 fs/btrfs/extent_io.h |  3 +--
 fs/btrfs/inode.c     |  3 +--
 3 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index c30694f57d02..1140ce4d321a 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4143,8 +4143,7 @@ int extent_writepages(struct extent_io_tree *tree,
 
 int extent_readpages(struct extent_io_tree *tree,
 		     struct address_space *mapping,
-		     struct list_head *pages, unsigned nr_pages,
-		     get_extent_t get_extent)
+		     struct list_head *pages, unsigned nr_pages)
 {
 	struct bio *bio = NULL;
 	unsigned page_idx;
@@ -4170,13 +4169,13 @@ int extent_readpages(struct extent_io_tree *tree,
 		pagepool[nr++] = page;
 		if (nr < ARRAY_SIZE(pagepool))
 			continue;
-		__extent_readpages(tree, pagepool, nr, get_extent, &em_cached,
-				   &bio, &bio_flags, &prev_em_start);
+		__extent_readpages(tree, pagepool, nr, btrfs_get_extent,
+				&em_cached, &bio, &bio_flags, &prev_em_start);
 		nr = 0;
 	}
 	if (nr)
-		__extent_readpages(tree, pagepool, nr, get_extent, &em_cached,
-				   &bio, &bio_flags, &prev_em_start);
+		__extent_readpages(tree, pagepool, nr, btrfs_get_extent,
+				&em_cached, &bio, &bio_flags, &prev_em_start);
 
 	if (em_cached)
 		free_extent_map(em_cached);
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index 917b24bc7547..5295deb8a153 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -410,8 +410,7 @@ int btree_write_cache_pages(struct address_space *mapping,
 			    struct writeback_control *wbc);
 int extent_readpages(struct extent_io_tree *tree,
 		     struct address_space *mapping,
-		     struct list_head *pages, unsigned nr_pages,
-		     get_extent_t get_extent);
+		     struct list_head *pages, unsigned nr_pages);
 int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
 		__u64 start, __u64 len);
 void set_page_extent_mapped(struct page *page);
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 588c269bfc13..ebdf2b07bb20 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -8892,8 +8892,7 @@ btrfs_readpages(struct file *file, struct address_space *mapping,
 {
 	struct extent_io_tree *tree;
 	tree = &BTRFS_I(mapping->host)->io_tree;
-	return extent_readpages(tree, mapping, pages, nr_pages,
-				btrfs_get_extent);
+	return extent_readpages(tree, mapping, pages, nr_pages);
 }
 static int __btrfs_releasepage(struct page *page, gfp_t gfp_flags)
 {
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 08/10] btrfs: sink get_extent parameter to __extent_readpages
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
                   ` (6 preceding siblings ...)
  2017-11-06 19:30 ` [PATCH 07/10] btrfs: sink get_extent parameter to extent_readpages David Sterba
@ 2017-11-06 19:31 ` David Sterba
  2017-11-06 19:31 ` [PATCH 09/10] btrfs: sink get_extent parameter to __do_contiguous_readpages David Sterba
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

All callers pass btrfs_get_extent.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 1140ce4d321a..a266239716f7 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -3120,7 +3120,7 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree,
 
 static void __extent_readpages(struct extent_io_tree *tree,
 			       struct page *pages[],
-			       int nr_pages, get_extent_t *get_extent,
+			       int nr_pages,
 			       struct extent_map **em_cached,
 			       struct bio **bio, unsigned long *bio_flags,
 			       u64 *prev_em_start)
@@ -3142,7 +3142,8 @@ static void __extent_readpages(struct extent_io_tree *tree,
 		} else {
 			__do_contiguous_readpages(tree, &pages[first_index],
 						  index - first_index, start,
-						  end, get_extent, em_cached,
+						  end, btrfs_get_extent,
+						  em_cached,
 						  bio, bio_flags,
 						  prev_em_start);
 			start = page_start;
@@ -3154,7 +3155,7 @@ static void __extent_readpages(struct extent_io_tree *tree,
 	if (end)
 		__do_contiguous_readpages(tree, &pages[first_index],
 					  index - first_index, start,
-					  end, get_extent, em_cached, bio,
+					  end, btrfs_get_extent, em_cached, bio,
 					  bio_flags, prev_em_start);
 }
 
@@ -4169,13 +4170,13 @@ int extent_readpages(struct extent_io_tree *tree,
 		pagepool[nr++] = page;
 		if (nr < ARRAY_SIZE(pagepool))
 			continue;
-		__extent_readpages(tree, pagepool, nr, btrfs_get_extent,
-				&em_cached, &bio, &bio_flags, &prev_em_start);
+		__extent_readpages(tree, pagepool, nr, &em_cached, &bio,
+				&bio_flags, &prev_em_start);
 		nr = 0;
 	}
 	if (nr)
-		__extent_readpages(tree, pagepool, nr, btrfs_get_extent,
-				&em_cached, &bio, &bio_flags, &prev_em_start);
+		__extent_readpages(tree, pagepool, nr, &em_cached, &bio,
+				&bio_flags, &prev_em_start);
 
 	if (em_cached)
 		free_extent_map(em_cached);
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 09/10] btrfs: sink get_extent parameter to __do_contiguous_readpages
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
                   ` (7 preceding siblings ...)
  2017-11-06 19:31 ` [PATCH 08/10] btrfs: sink get_extent parameter to __extent_readpages David Sterba
@ 2017-11-06 19:31 ` David Sterba
  2017-11-06 19:31 ` [PATCH 10/10] btrfs: sink get_extent parameter to read_extent_buffer_pages David Sterba
  2017-11-06 21:26 ` [PATCH 00/10] Cleanup unnecessary get_extent parameters Nikolay Borisov
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

All callers pass btrfs_get_extent.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/extent_io.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index a266239716f7..72620cf41423 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -3089,7 +3089,6 @@ static int __do_readpage(struct extent_io_tree *tree,
 static inline void __do_contiguous_readpages(struct extent_io_tree *tree,
 					     struct page *pages[], int nr_pages,
 					     u64 start, u64 end,
-					     get_extent_t *get_extent,
 					     struct extent_map **em_cached,
 					     struct bio **bio,
 					     unsigned long *bio_flags,
@@ -3112,8 +3111,8 @@ static inline void __do_contiguous_readpages(struct extent_io_tree *tree,
 	}
 
 	for (index = 0; index < nr_pages; index++) {
-		__do_readpage(tree, pages[index], get_extent, em_cached, bio,
-			      0, bio_flags, 0, prev_em_start);
+		__do_readpage(tree, pages[index], btrfs_get_extent, em_cached,
+				bio, 0, bio_flags, 0, prev_em_start);
 		put_page(pages[index]);
 	}
 }
@@ -3142,8 +3141,7 @@ static void __extent_readpages(struct extent_io_tree *tree,
 		} else {
 			__do_contiguous_readpages(tree, &pages[first_index],
 						  index - first_index, start,
-						  end, btrfs_get_extent,
-						  em_cached,
+						  end, em_cached,
 						  bio, bio_flags,
 						  prev_em_start);
 			start = page_start;
@@ -3155,7 +3153,7 @@ static void __extent_readpages(struct extent_io_tree *tree,
 	if (end)
 		__do_contiguous_readpages(tree, &pages[first_index],
 					  index - first_index, start,
-					  end, btrfs_get_extent, em_cached, bio,
+					  end, em_cached, bio,
 					  bio_flags, prev_em_start);
 }
 
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 10/10] btrfs: sink get_extent parameter to read_extent_buffer_pages
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
                   ` (8 preceding siblings ...)
  2017-11-06 19:31 ` [PATCH 09/10] btrfs: sink get_extent parameter to __do_contiguous_readpages David Sterba
@ 2017-11-06 19:31 ` David Sterba
  2017-11-06 21:26 ` [PATCH 00/10] Cleanup unnecessary get_extent parameters Nikolay Borisov
  10 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-06 19:31 UTC (permalink / raw)
  To: linux-btrfs; +Cc: David Sterba

All callers pass btree_get_extent, which needs to be exported.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/disk-io.c   | 8 ++++----
 fs/btrfs/disk-io.h   | 3 +++
 fs/btrfs/extent_io.c | 6 +++---
 fs/btrfs/extent_io.h | 2 +-
 4 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 5713c50959e0..149be7c5d237 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -220,7 +220,7 @@ void btrfs_set_buffer_lockdep_class(u64 objectid, struct extent_buffer *eb,
  * extents on the btree inode are pretty simple, there's one extent
  * that covers the entire device
  */
-static struct extent_map *btree_get_extent(struct btrfs_inode *inode,
+struct extent_map *btree_get_extent(struct btrfs_inode *inode,
 		struct page *page, size_t pg_offset, u64 start, u64 len,
 		int create)
 {
@@ -455,7 +455,7 @@ static int btree_read_extent_buffer_pages(struct btrfs_fs_info *fs_info,
 	io_tree = &BTRFS_I(fs_info->btree_inode)->io_tree;
 	while (1) {
 		ret = read_extent_buffer_pages(io_tree, eb, WAIT_COMPLETE,
-					       btree_get_extent, mirror_num);
+					       mirror_num);
 		if (!ret) {
 			if (!verify_parent_transid(io_tree, eb,
 						   parent_transid, 0))
@@ -1012,7 +1012,7 @@ void readahead_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr)
 	if (IS_ERR(buf))
 		return;
 	read_extent_buffer_pages(&BTRFS_I(btree_inode)->io_tree,
-				 buf, WAIT_NONE, btree_get_extent, 0);
+				 buf, WAIT_NONE, 0);
 	free_extent_buffer(buf);
 }
 
@@ -1031,7 +1031,7 @@ int reada_tree_block_flagged(struct btrfs_fs_info *fs_info, u64 bytenr,
 	set_bit(EXTENT_BUFFER_READAHEAD, &buf->bflags);
 
 	ret = read_extent_buffer_pages(io_tree, buf, WAIT_PAGE_LOCK,
-				       btree_get_extent, mirror_num);
+				       mirror_num);
 	if (ret) {
 		free_extent_buffer(buf);
 		return ret;
diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h
index 7f7c35d6347a..301151a50ac1 100644
--- a/fs/btrfs/disk-io.h
+++ b/fs/btrfs/disk-io.h
@@ -149,6 +149,9 @@ struct btrfs_root *btrfs_create_tree(struct btrfs_trans_handle *trans,
 				     u64 objectid);
 int btree_lock_page_hook(struct page *page, void *data,
 				void (*flush_fn)(void *));
+struct extent_map *btree_get_extent(struct btrfs_inode *inode,
+		struct page *page, size_t pg_offset, u64 start, u64 len,
+		int create);
 int btrfs_get_num_tolerated_disk_barrier_failures(u64 flags);
 int __init btrfs_end_io_wq_init(void);
 void btrfs_end_io_wq_exit(void);
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 72620cf41423..2f6a977442c3 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -20,6 +20,7 @@
 #include "locking.h"
 #include "rcu-string.h"
 #include "backref.h"
+#include "disk-io.h"
 
 static struct kmem_cache *extent_state_cache;
 static struct kmem_cache *extent_buffer_cache;
@@ -5258,8 +5259,7 @@ int extent_buffer_uptodate(struct extent_buffer *eb)
 }
 
 int read_extent_buffer_pages(struct extent_io_tree *tree,
-			     struct extent_buffer *eb, int wait,
-			     get_extent_t *get_extent, int mirror_num)
+			     struct extent_buffer *eb, int wait, int mirror_num)
 {
 	unsigned long i;
 	struct page *page;
@@ -5319,7 +5319,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree,
 
 			ClearPageError(page);
 			err = __extent_read_full_page(tree, page,
-						      get_extent, &bio,
+						      btree_get_extent, &bio,
 						      mirror_num, &bio_flags,
 						      REQ_META);
 			if (err) {
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index 5295deb8a153..40291e27782c 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -431,7 +431,7 @@ void free_extent_buffer_stale(struct extent_buffer *eb);
 #define WAIT_PAGE_LOCK	2
 int read_extent_buffer_pages(struct extent_io_tree *tree,
 			     struct extent_buffer *eb, int wait,
-			     get_extent_t *get_extent, int mirror_num);
+			     int mirror_num);
 void wait_on_extent_buffer_writeback(struct extent_buffer *eb);
 
 static inline unsigned long num_extent_pages(u64 start, u64 len)
-- 
2.14.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 00/10] Cleanup unnecessary get_extent parameters
  2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
                   ` (9 preceding siblings ...)
  2017-11-06 19:31 ` [PATCH 10/10] btrfs: sink get_extent parameter to read_extent_buffer_pages David Sterba
@ 2017-11-06 21:26 ` Nikolay Borisov
  2017-11-07 20:13   ` David Sterba
  10 siblings, 1 reply; 13+ messages in thread
From: Nikolay Borisov @ 2017-11-06 21:26 UTC (permalink / raw)
  To: David Sterba, linux-btrfs



On  6.11.2017 21:30, David Sterba wrote:
> There are several functions that take a generic get_extent parameter, but not
> all of them use it to distinguish between btree_get_exnent (for metadata) and
> btrfs_get_extent (for data). This is namely extent_read_full_page and
> __do_readpage.

I wonder whether we can do some similar collpasing withe some of the
hooks we have i.e. readpage_end_io_hook (resp.
btrfs_readpage_end_io_hook and btree_readpage_end_io_hook). All those
callbacks don't necessarily help readability...


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 00/10] Cleanup unnecessary get_extent parameters
  2017-11-06 21:26 ` [PATCH 00/10] Cleanup unnecessary get_extent parameters Nikolay Borisov
@ 2017-11-07 20:13   ` David Sterba
  0 siblings, 0 replies; 13+ messages in thread
From: David Sterba @ 2017-11-07 20:13 UTC (permalink / raw)
  To: Nikolay Borisov; +Cc: David Sterba, linux-btrfs

On Mon, Nov 06, 2017 at 11:26:54PM +0200, Nikolay Borisov wrote:
> 
> 
> On  6.11.2017 21:30, David Sterba wrote:
> > There are several functions that take a generic get_extent parameter, but not
> > all of them use it to distinguish between btree_get_exnent (for metadata) and
> > btrfs_get_extent (for data). This is namely extent_read_full_page and
> > __do_readpage.
> 
> I wonder whether we can do some similar collpasing withe some of the
> hooks we have i.e. readpage_end_io_hook (resp.
> btrfs_readpage_end_io_hook and btree_readpage_end_io_hook). All those
> callbacks don't necessarily help readability...

Some of the callbacks passed as parameters can be possibly pushed down
the callstack, the only difference is btree_inode vs file extents.
Instead of the uppper caller switch, the right function can be called
based on the inode number (btree_inode has 1).

Josef has some ideas/patches to get rid of the btree_inode completely so
cleaning up the callback might not be worth. There's still some
potential to reduce the arguments to the various callbacks, I have
patches for that. This is a relatively easy and safe so I would still
send them, as the btree_inode removal will be probably intrusive and the
ETA for such changes is unpredictable.

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-11-07 20:15 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-06 19:30 [PATCH 00/10] Cleanup unnecessary get_extent parameters David Sterba
2017-11-06 19:30 ` [PATCH 01/10] btrfs: sink get_extent parameter to extent_writepages David Sterba
2017-11-06 19:30 ` [PATCH 02/10] btrfs: sink get_extent parameter to extent_write_locked_range David Sterba
2017-11-06 19:30 ` [PATCH 03/10] btrfs: sink get_extent parameter to extent_write_full_page David Sterba
2017-11-06 19:30 ` [PATCH 04/10] btrfs: drop get_extent from extent_page_data David Sterba
2017-11-06 19:30 ` [PATCH 05/10] btrfs: sink get_extent parameter to extent_fiemap David Sterba
2017-11-06 19:30 ` [PATCH 06/10] btrfs: sink get_extent parameter to get_extent_skip_holes David Sterba
2017-11-06 19:30 ` [PATCH 07/10] btrfs: sink get_extent parameter to extent_readpages David Sterba
2017-11-06 19:31 ` [PATCH 08/10] btrfs: sink get_extent parameter to __extent_readpages David Sterba
2017-11-06 19:31 ` [PATCH 09/10] btrfs: sink get_extent parameter to __do_contiguous_readpages David Sterba
2017-11-06 19:31 ` [PATCH 10/10] btrfs: sink get_extent parameter to read_extent_buffer_pages David Sterba
2017-11-06 21:26 ` [PATCH 00/10] Cleanup unnecessary get_extent parameters Nikolay Borisov
2017-11-07 20:13   ` David Sterba

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).