f2fs: fix incorrect upper bound when iterating inode mapping tree
PATCH 3/3 f2fs: fix incorrect upper bound when iterating inode mapping tree
1. Inode mapping tree can index page in range of [0, ULONG_MAX], however, in some places, f2fs only search or iterate page in ragne of [0, LONG_MAX], result in miss hitting in page cache.
2. filemap_fdatawait_range accepts range parameters in unit of bytes, so the max range it covers should be [0, LLONG_MAX], if we use [0, LONG_MAX] as range for waiting on writeback, big number of pages will not be covered.
This patch corrects above two issues.
Signed-off-by Chao Yu <[email protected]>
--- fs/f2fs/checkpoint.c | 8 ++++---- fs/f2fs/file.c | 2 +- fs/f2fs/node.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-)
fs/f2fs/checkpoint.c +4 -4
@@ -282,7 +282,7 @@ long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type, long nr_to_write) {struct address_space *mapping =META_MAPPING (sbi); -pgoff_t index =0 , end =LONG_MAX , prev =LONG_MAX ; +pgoff_t index =0 , end =ULONG_MAX , prev =ULONG_MAX ;struct pagevec pvec;long nwritten =0 ;struct writeback_control wbc = {
@@ -305,7 +305,7 @@ long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type,for (i =0 ; i < nr_pages; i++) {struct page *page = pvec.pages[i]; -if (prev ==LONG_MAX ) +if (prev ==ULONG_MAX ) prev = page->index -1 ;if (nr_to_write !=LONG_MAX && page->index != prev +1 ) {pagevec_release (&pvec);
@@ -1077,8 +1077,8 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)if (unlikely (f2fs_cp_error (sbi)))return -EIO ; -filemap_fdatawait_range (NODE_MAPPING (sbi),0 ,LONG_MAX ); -filemap_fdatawait_range (META_MAPPING (sbi),0 ,LONG_MAX ); +filemap_fdatawait_range (NODE_MAPPING (sbi),0 ,LLONG_MAX ); +filemap_fdatawait_range (META_MAPPING (sbi),0 ,LLONG_MAX );/* update user_block_counts */ sbi->last_valid_block_count = sbi->total_valid_block_count;
fs/f2fs/file.c +1 -1
@@ -301,7 +301,7 @@ static pgoff_t __get_first_dirty_index(struct address_space *mapping,pagevec_init (&pvec,0 ); nr_pages =pagevec_lookup_tag (&pvec, mapping, &pgofs,PAGECACHE_TAG_DIRTY ,1 ); - pgofs = nr_pages ? pvec.pages[0 ]->index :LONG_MAX ; + pgofs = nr_pages ? pvec.pages[0 ]->index :ULONG_MAX ;pagevec_release (&pvec);return pgofs; }
fs/f2fs/node.c +2 -2
@@ -1238,7 +1238,7 @@ int sync_node_pages(struct f2fs_sb_info *sbi, nid_t ino, next_step: index =0 ; - end =LONG_MAX ; + end =ULONG_MAX ;while (index <= end) {int i, nr_pages;
@@ -1354,7 +1354,7 @@ continue_unlock:int wait_on_node_pages_writeback (struct f2fs_sb_info *sbi,nid_t ino) { -pgoff_t index =0 , end =LONG_MAX ; +pgoff_t index =0 , end =ULONG_MAX ;struct pagevec pvec;int ret2 =0 , ret =0 ;
Signature · 1 line
2.7.0