Cleanup unnecessary get_extent parameters
David Sterba
maintainercover Cleanup unnecessary get_extent parameters
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(-)
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 1/10 btrfs: sink get_extent parameter to extent_writepages
There's only one caller.
--- fs/btrfs/extent_io.c | 3 +-- fs/btrfs/extent_io.h | 1 - fs/btrfs/inode.c | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-)
fs/btrfs/extent_io.c +1 -2
@@ -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 , };
fs/btrfs/extent_io.h +0 -1
@@ -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);
fs/btrfs/inode.c +1 -1
@@ -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
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 2/10 btrfs: sink get_extent parameter to extent_write_locked_range
In reply to David SterbaThere's only one caller.
--- fs/btrfs/extent_io.c | 5 ++--- fs/btrfs/extent_io.h | 3 +-- fs/btrfs/inode.c | 1 - 3 files changed, 3 insertions(+), 6 deletions(-)
fs/btrfs/extent_io.c +2 -3
@@ -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 , };
fs/btrfs/extent_io.h +1 -2
@@ -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);
fs/btrfs/inode.c +0 -1
@@ -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);
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 3/10 btrfs: sink get_extent parameter to extent_write_full_page
In reply to David SterbaThere's only one caller.
--- fs/btrfs/extent_io.c | 3 +-- fs/btrfs/extent_io.h | 1 - fs/btrfs/inode.c | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-)
fs/btrfs/extent_io.c +1 -2
@@ -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 , };
fs/btrfs/extent_io.h +0 -1
@@ -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);
fs/btrfs/inode.c +1 -1
@@ -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; }
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 4/10 btrfs: drop get_extent from extent_page_data
In reply to David SterbaPrevious 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.
--- fs/btrfs/extent_io.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-)
fs/btrfs/extent_io.c +1 -6
@@ -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 , };
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 5/10 btrfs: sink get_extent parameter to extent_fiemap
In reply to David SterbaAll callers pass btrfs_get_extent_fiemap and we don't expect anything else in the context of extent_fiemap.
--- fs/btrfs/extent_io.c | 6 +++--- fs/btrfs/extent_io.h | 2 +- fs/btrfs/inode.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-)
fs/btrfs/extent_io.c +3 -3
@@ -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;
fs/btrfs/extent_io.h +1 -1
@@ -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,
fs/btrfs/inode.c +1 -1
@@ -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)
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 6/10 btrfs: sink get_extent parameter to get_extent_skip_holes
In reply to David SterbaAll callers pass btrfs_get_extent_fiemap and get_extent_skip_holes itself is used only as a fiemap helper.
--- fs/btrfs/extent_io.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
fs/btrfs/extent_io.c +5 -8
@@ -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;
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 7/10 btrfs: sink get_extent parameter to extent_readpages
In reply to David SterbaThere's only one caller that passes btrfs_get_extent.
--- fs/btrfs/extent_io.c | 11 +++++------ fs/btrfs/extent_io.h | 3 +-- fs/btrfs/inode.c | 3 +-- 3 files changed, 7 insertions(+), 10 deletions(-)
fs/btrfs/extent_io.c +5 -6
@@ -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);
fs/btrfs/extent_io.h +1 -2
@@ -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);
fs/btrfs/inode.c +1 -2
@@ -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) {
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 8/10 btrfs: sink get_extent parameter to __extent_readpages
In reply to David SterbaAll callers pass btrfs_get_extent.
--- fs/btrfs/extent_io.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
fs/btrfs/extent_io.c +8 -7
@@ -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);
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 9/10 btrfs: sink get_extent parameter to __do_contiguous_readpages
In reply to David SterbaAll callers pass btrfs_get_extent.
--- fs/btrfs/extent_io.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
fs/btrfs/extent_io.c +4 -6
@@ -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); }
Signature · 1 line
2.14.3
David Sterba
maintainerPATCH 10/10 btrfs: sink get_extent parameter to read_extent_buffer_pages
In reply to David SterbaAll callers pass btree_get_extent, which needs to be exported.
--- 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(-)
fs/btrfs/disk-io.c +4 -4
@@ -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;
fs/btrfs/disk-io.h +3 -0
@@ -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 );
fs/btrfs/extent_io.c +3 -3
@@ -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) {
fs/btrfs/extent_io.h +1 -1
@@ -431,7 +431,7 @@ void free_extent_buffer_stale(struct extent_buffer *eb);#define WAIT_PAGE_LOCK 2int 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)
Signature · 1 line
2.14.3
Quoted 4 lines · David Sterba
There are several functions that take a generic
get_extentparameter, but not all of them use it to distinguish betweenbtree_get_exnent(for metadata) andbtrfs_get_extent(for data). This is namelyextent_read_full_pageand__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...
Quoted 8 lines · Nikolay Borisov
Quoted 4 lines · David Sterba
There are several functions that take a generic
get_extentparameter, but not all of them use it to distinguish betweenbtree_get_exnent(for metadata) andbtrfs_get_extent(for data). This is namelyextent_read_full_pageand__do_readpage.
Quoted 4 lines
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_hookandbtree_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.