aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChao Yu <chao2.yu@samsung.com>2015-03-19 07:26:02 -0400
committerJaegeuk Kim <jaegeuk@kernel.org>2015-04-10 18:08:50 -0400
commit028a41e89383e1208dff1afe3e260b8cb6d3431c (patch)
tree657e0dd1fd94bd848faa03b1d39eebf775906c74
parent93dfc52656e9ae1009ccba67e67ff69285b7743f (diff)
f2fs: initialize extent tree with on-disk extent info of inode
With normal extent info cache, we records largest extent mapping between logical block and physical block into extent info, and we persist extent info in on-disk inode. When we enable extent tree cache, if extent info of on-disk inode is exist, and the extent is not a small fragmented mapping extent. We'd better to load the extent info into extent tree cache when inode is loaded. By this way we can have more chance to hit extent tree cache rather than taking more time to read dnode page for block address. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
-rw-r--r--fs/f2fs/data.c43
-rw-r--r--fs/f2fs/f2fs.h1
-rw-r--r--fs/f2fs/inode.c4
3 files changed, 45 insertions, 3 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 67b3a99e03d5..e3be4be3a6d8 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -572,6 +572,39 @@ static unsigned int __free_extent_tree(struct f2fs_sb_info *sbi,
572 return count - et->count; 572 return count - et->count;
573} 573}
574 574
575static void f2fs_init_extent_tree(struct inode *inode,
576 struct f2fs_extent *i_ext)
577{
578 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
579 struct extent_tree *et;
580 struct extent_node *en;
581 struct extent_info ei;
582
583 if (le32_to_cpu(i_ext->len) < F2FS_MIN_EXTENT_LEN)
584 return;
585
586 et = __grab_extent_tree(inode);
587
588 write_lock(&et->lock);
589 if (et->count)
590 goto out;
591
592 set_extent_info(&ei, le32_to_cpu(i_ext->fofs),
593 le32_to_cpu(i_ext->blk), le32_to_cpu(i_ext->len));
594
595 en = __insert_extent_tree(sbi, et, &ei, NULL);
596 if (en) {
597 et->cached_en = en;
598
599 spin_lock(&sbi->extent_lock);
600 list_add_tail(&en->list, &sbi->extent_list);
601 spin_unlock(&sbi->extent_lock);
602 }
603out:
604 write_unlock(&et->lock);
605 atomic_dec(&et->refcount);
606}
607
575static bool f2fs_lookup_extent_tree(struct inode *inode, pgoff_t pgofs, 608static bool f2fs_lookup_extent_tree(struct inode *inode, pgoff_t pgofs,
576 struct extent_info *ei) 609 struct extent_info *ei)
577{ 610{
@@ -782,6 +815,16 @@ out:
782 return; 815 return;
783} 816}
784 817
818void f2fs_init_extent_cache(struct inode *inode, struct f2fs_extent *i_ext)
819{
820 if (test_opt(F2FS_I_SB(inode), EXTENT_CACHE))
821 f2fs_init_extent_tree(inode, i_ext);
822
823 write_lock(&F2FS_I(inode)->ext_lock);
824 get_extent_info(&F2FS_I(inode)->ext, *i_ext);
825 write_unlock(&F2FS_I(inode)->ext_lock);
826}
827
785static bool f2fs_lookup_extent_cache(struct inode *inode, pgoff_t pgofs, 828static bool f2fs_lookup_extent_cache(struct inode *inode, pgoff_t pgofs,
786 struct extent_info *ei) 829 struct extent_info *ei)
787{ 830{
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 83223d8b32bb..431b4af693e5 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1596,6 +1596,7 @@ int reserve_new_block(struct dnode_of_data *);
1596int f2fs_reserve_block(struct dnode_of_data *, pgoff_t); 1596int f2fs_reserve_block(struct dnode_of_data *, pgoff_t);
1597void f2fs_shrink_extent_tree(struct f2fs_sb_info *, int); 1597void f2fs_shrink_extent_tree(struct f2fs_sb_info *, int);
1598void f2fs_destroy_extent_tree(struct inode *); 1598void f2fs_destroy_extent_tree(struct inode *);
1599void f2fs_init_extent_cache(struct inode *, struct f2fs_extent *);
1599void f2fs_update_extent_cache(struct dnode_of_data *); 1600void f2fs_update_extent_cache(struct dnode_of_data *);
1600struct page *find_data_page(struct inode *, pgoff_t, bool); 1601struct page *find_data_page(struct inode *, pgoff_t, bool);
1601struct page *get_lock_data_page(struct inode *, pgoff_t); 1602struct page *get_lock_data_page(struct inode *, pgoff_t);
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c
index bb5800969bcc..9e64d3efb2d2 100644
--- a/fs/f2fs/inode.c
+++ b/fs/f2fs/inode.c
@@ -137,9 +137,7 @@ static int do_read_inode(struct inode *inode)
137 fi->i_pino = le32_to_cpu(ri->i_pino); 137 fi->i_pino = le32_to_cpu(ri->i_pino);
138 fi->i_dir_level = ri->i_dir_level; 138 fi->i_dir_level = ri->i_dir_level;
139 139
140 write_lock(&fi->ext_lock); 140 f2fs_init_extent_cache(inode, &ri->i_ext);
141 get_extent_info(&fi->ext, ri->i_ext);
142 write_unlock(&fi->ext_lock);
143 141
144 get_inline_info(fi, ri); 142 get_inline_info(fi, ri);
145 143