Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39ebaaa8 authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim
Browse files

f2fs: fix to migrate blocks correctly during defragment



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: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 0e87a048
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -2437,8 +2437,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));

@@ -2468,7 +2470,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);
@@ -2492,8 +2494,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);