f2fs: fix to caclulate required free section correctly
authorChao Yu <yuchao0@huawei.com>
Wed, 10 Jan 2018 10:18:51 +0000 (18:18 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 19 Jan 2018 06:09:08 +0000 (22:09 -0800)
When calculating required free section during file defragmenting, we
should skip holes in file, otherwise we will probably fail to defrag
sparse file with large size.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index 322aab9d91b535e3047467005a9d735685acd12e..05779077cbf2c451cfba66a1b74530c7435eca03 100644 (file)
@@ -2125,10 +2125,12 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
                        continue;
                }
 
-               if (blk_end && blk_end != map.m_pblk) {
+               if (blk_end && blk_end != map.m_pblk)
                        fragmented = true;
-                       break;
-               }
+
+               /* record total count of block that we're going to move */
+               total += map.m_len;
+
                blk_end = map.m_pblk + map.m_len;
 
                map.m_lblk += map.m_len;
@@ -2137,10 +2139,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
        if (!fragmented)
                goto out;
 
-       map.m_lblk = pg_start;
-       map.m_len = pg_end - pg_start;
-
-       sec_num = (map.m_len + BLKS_PER_SEC(sbi) - 1) / BLKS_PER_SEC(sbi);
+       sec_num = (total + BLKS_PER_SEC(sbi) - 1) / BLKS_PER_SEC(sbi);
 
        /*
         * make sure there are enough free section for LFS allocation, this can
@@ -2152,6 +2151,10 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi,
                goto out;
        }
 
+       map.m_lblk = pg_start;
+       map.m_len = pg_end - pg_start;
+       total = 0;
+
        while (map.m_lblk < pg_end) {
                pgoff_t idx;
                int cnt = 0;