mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-03-17 12:34:01 +00:00
f2fs: fix to caclulate required free section correctly
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>
This commit is contained in:
parent
f1d2564a7c
commit
25a912e51a
1 changed files with 10 additions and 7 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue