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

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
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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);
void f2fs_allocate_segment_for_resize(struct f2fs_sb_info *sbi, int type,
					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);
bool f2fs_exist_trim_candidates(struct f2fs_sb_info *sbi,
					struct cp_control *cpc);
+1 −1
Original line number Diff line number Diff line
@@ -1658,7 +1658,7 @@ next_alloc:
		map.m_seg_type = CURSEG_COLD_DATA_PINNED;

		f2fs_lock_op(sbi);
		f2fs_allocate_new_segments(sbi, CURSEG_COLD_DATA);
		f2fs_allocate_new_segment(sbi, CURSEG_COLD_DATA);
		f2fs_unlock_op(sbi);

		err = f2fs_map_blocks(inode, &map, 1, F2FS_GET_BLOCK_PRE_DIO);
+1 −1
Original line number Diff line number Diff line
@@ -742,7 +742,7 @@ next:
		f2fs_put_page(page, 1);
	}
	if (!err)
		f2fs_allocate_new_segments(sbi, NO_CHECK_TYPE);
		f2fs_allocate_new_segments(sbi);
	return err;
}

+23 −16
Original line number Diff line number Diff line
@@ -2733,28 +2733,35 @@ unlock:
	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;
	int i;

	down_write(&SIT_I(sbi)->sentry_lock);

	for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
		if (type != NO_CHECK_TYPE && i != type)
			continue;
	if (!curseg->next_blkoff &&
		!get_valid_blocks(sbi, curseg->segno, false) &&
		!get_ckpt_valid_blocks(sbi, curseg->segno))
		return;

		curseg = CURSEG_I(sbi, i);
		if (type == NO_CHECK_TYPE || curseg->next_blkoff ||
				get_valid_blocks(sbi, curseg->segno, false) ||
				get_ckpt_valid_blocks(sbi, curseg->segno)) {
	old_segno = curseg->segno;
			SIT_I(sbi)->s_ops->allocate_segment(sbi, i, true);
	SIT_I(sbi)->s_ops->allocate_segment(sbi, type, true);
	locate_dirty_segment(sbi, old_segno);
}

void f2fs_allocate_new_segment(struct f2fs_sb_info *sbi, int type)
{
	down_write(&SIT_I(sbi)->sentry_lock);
	__allocate_new_segment(sbi, type);
	up_write(&SIT_I(sbi)->sentry_lock);
}

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);
}