As data segment gc may lead dnode dirty, so the greedy cost for data segment 
should be
valid blocks * 2, that is data segment is prior to node segment.

Team:OTHERS
Feature or Bugfix:Bugfix
Binary Source:No

Signed-off-by: Hou Pengyang <houpengy...@huawei.com>
---
 fs/f2fs/gc.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
index e93aecb..4ee749f 100644
--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -242,6 +242,13 @@ static unsigned int get_cb_cost(struct f2fs_sb_info *sbi, 
unsigned int segno)
        return UINT_MAX - ((100 * (100 - u) * age) / (100 + u));
 }
 
+static unsigned int get_greedy_cost(struct f2fs_sb_info *sbi, unsigned int 
segno)
+{
+       unsigned int valid_blocks = get_valid_blocks(sbi, segno, 
sbi->segs_per_sec);
+       return IS_DATASEG(get_seg_entry(sbi, segno)->type) ?
+                       valid_blocks * 2 : valid_blocks;
+}
+
 static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi,
                        unsigned int segno, struct victim_sel_policy *p)
 {
@@ -250,7 +257,7 @@ static inline unsigned int get_gc_cost(struct f2fs_sb_info 
*sbi,
 
        /* alloc_mode == LFS */
        if (p->gc_mode == GC_GREEDY)
-               return get_valid_blocks(sbi, segno, sbi->segs_per_sec);
+               return get_greedy_cost(sbi, segno);
        else
                return get_cb_cost(sbi, segno);
 }
-- 
2.10.1


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to