Commit 901d745f authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim

f2fs: split f2fs_allocate_new_segments()

to two independent functions:
- f2fs_allocate_new_segment() for specified type segment allocation
- f2fs_allocate_new_segments() for all data type segments allocation
Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 9039d835
...@@ -3335,7 +3335,8 @@ void f2fs_release_discard_addrs(struct f2fs_sb_info *sbi); ...@@ -3335,7 +3335,8 @@ void f2fs_release_discard_addrs(struct f2fs_sb_info *sbi);
int f2fs_npages_for_summary_flush(struct f2fs_sb_info *sbi, bool for_ra); int f2fs_npages_for_summary_flush(struct f2fs_sb_info *sbi, bool for_ra);
void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type, void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
unsigned int start, unsigned int end); unsigned int start, unsigned int end);
void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi, int type); void f2fs_allocate_new_segment(struct f2fs_sb_info *sbi, int type);
void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi);
int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range); int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range);
bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi, bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi,
struct cp_control *cpc); struct cp_control *cpc);
......
...@@ -1658,7 +1658,7 @@ static int expand_inode_data(struct inode *inode, loff_t offset, ...@@ -1658,7 +1658,7 @@ static int expand_inode_data(struct inode *inode, loff_t offset,
map.m_seg_type = CURSEG_COLD_DATA_PINNED; map.m_seg_type = CURSEG_COLD_DATA_PINNED;
f2fs_lock_op(sbi); f2fs_lock_op(sbi);
f2fs_allocate_new_segments(sbi, CURSEG_COLD_DATA); f2fs_allocate_new_segment(sbi, CURSEG_COLD_DATA);
f2fs_unlock_op(sbi); f2fs_unlock_op(sbi);
err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_DIO); err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_DIO);
......
...@@ -742,7 +742,7 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list, ...@@ -742,7 +742,7 @@ static int recover_data(struct f2fs_sb_info *sbi, struct list_head *inode_list,
f2fs_put_page(page, 1); f2fs_put_page(page, 1);
} }
if (!err) if (!err)
f2fs_allocate_new_segments(sbi, NO_CHECK_TYPE); f2fs_allocate_new_segments(sbi);
return err; return err;
} }
......
...@@ -2733,28 +2733,35 @@ void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type, ...@@ -2733,28 +2733,35 @@ void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
up_read(&SM_I(sbi)->curseg_lock); up_read(&SM_I(sbi)->curseg_lock);
} }
void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi, int type) static void __allocate_new_segment(struct f2fs_sb_info *sbi, int type)
{ {
struct curseg_info *curseg; struct curseg_info *curseg = CURSEG_I(sbi, type);
unsigned int old_segno; unsigned int old_segno;
int i;
down_write(&SIT_I(sbi)->sentry_lock); if (!curseg->next_blkoff &&
!get_valid_blocks(sbi, curseg->segno, false) &&
!get_ckpt_valid_blocks(sbi, curseg->segno))
return;
for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) { old_segno = curseg->segno;
if (type != NO_CHECK_TYPE && i != type) SIT_I(sbi)->s_ops->allocate_segment(sbi, type, true);
continue; locate_dirty_segment(sbi, old_segno);
}
curseg = CURSEG_I(sbi, i); void f2fs_allocate_new_segment(struct f2fs_sb_info *sbi, int type)
if (type == NO_CHECK_TYPE || curseg->next_blkoff || {
get_valid_blocks(sbi, curseg->segno, false) || down_write(&SIT_I(sbi)->sentry_lock);
get_ckpt_valid_blocks(sbi, curseg->segno)) { __allocate_new_segment(sbi, type);
old_segno = curseg->segno; up_write(&SIT_I(sbi)->sentry_lock);
SIT_I(sbi)->s_ops->allocate_segment(sbi, i, true); }
locate_dirty_segment(sbi, old_segno);
}
}
void f2fs_allocate_new_segments(struct f2fs_sb_info *sbi)
{
int i;
down_write(&SIT_I(sbi)->sentry_lock);
for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++)
__allocate_new_segment(sbi, i);
up_write(&SIT_I(sbi)->sentry_lock); up_write(&SIT_I(sbi)->sentry_lock);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment