From: Chao Yu <yuch...@huawei.com>

During defragment, we missed to trigger fragmented blocks migration
for below condition:

In defragment region:
- total number of valid blocks is smaller than 512;
- the tail part of the region are all holes;

In addtion, return zero to user via range->len if there is no
fragmented blocks.

Signed-off-by: Chao Yu <yuch...@huawei.com>
---
 fs/f2fs/file.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index ff93066ed515..ff2ffa850a6f 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -2384,8 +2384,10 @@ static int f2fs_defragment_range(struct f2fs_sb_info 
*sbi,
                map.m_lblk += map.m_len;
        }
 
-       if (!fragmented)
+       if (!fragmented) {
+               total = 0;
                goto out;
+       }
 
        sec_num = DIV_ROUND_UP(total, BLKS_PER_SEC(sbi));
 
@@ -2415,7 +2417,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
 
                if (!(map.m_flags & F2FS_MAP_FLAGS)) {
                        map.m_lblk = next_pgofs;
-                       continue;
+                       goto check;
                }
 
                set_inode_flag(inode, FI_DO_DEFRAG);
@@ -2439,8 +2441,8 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
                }
 
                map.m_lblk = idx;
-
-               if (idx < pg_end && cnt < blk_per_seg)
+check:
+               if (map.m_lblk < pg_end && cnt < blk_per_seg)
                        goto do_map;
 
                clear_inode_flag(inode, FI_DO_DEFRAG);
-- 
2.22.0



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to