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

Commit cf5551c9 authored by Yunlong Song's avatar Yunlong Song Committed by Jaegeuk Kim
Browse files

f2fs: provide f2fs_balance_fs to __write_node_page



Let node writeback also do f2fs_balance_fs to ensure there are always enough free
segments.

Signed-off-by: default avatarYunlong Song <yunlong.song@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent e21c2855
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1018,7 +1018,7 @@ retry_flush_nodes:

	if (get_pages(sbi, F2FS_DIRTY_NODES)) {
		up_write(&sbi->node_write);
		err = sync_node_pages(sbi, &wbc);
		err = sync_node_pages(sbi, &wbc, false);
		if (err) {
			up_write(&sbi->node_change);
			f2fs_unlock_all(sbi);
+2 −1
Original line number Diff line number Diff line
@@ -2504,7 +2504,8 @@ struct page *get_node_page_ra(struct page *parent, int start);
void move_node_page(struct page *node_page, int gc_type);
int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
			struct writeback_control *wbc, bool atomic);
int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc);
int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc,
			bool do_balance);
void build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount);
bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid);
void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid);
+10 −6
Original line number Diff line number Diff line
@@ -1333,7 +1333,7 @@ continue_unlock:
}

static int __write_node_page(struct page *page, bool atomic, bool *submitted,
				struct writeback_control *wbc)
				struct writeback_control *wbc, bool do_balance)
{
	struct f2fs_sb_info *sbi = F2FS_P_SB(page);
	nid_t nid;
@@ -1402,6 +1402,8 @@ static int __write_node_page(struct page *page, bool atomic, bool *submitted,
	if (submitted)
		*submitted = fio.submitted;

	if (do_balance)
		f2fs_balance_fs(sbi, false);
	return 0;

redirty_out:
@@ -1412,7 +1414,7 @@ redirty_out:
static int f2fs_write_node_page(struct page *page,
				struct writeback_control *wbc)
{
	return __write_node_page(page, false, NULL, wbc);
	return __write_node_page(page, false, NULL, wbc, false);
}

int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
@@ -1500,7 +1502,7 @@ continue_unlock:

			ret = __write_node_page(page, atomic &&
						page == last_page,
						&submitted, wbc);
						&submitted, wbc, true);
			if (ret) {
				unlock_page(page);
				f2fs_put_page(last_page, 0);
@@ -1537,7 +1539,8 @@ out:
	return ret ? -EIO: 0;
}

int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc)
int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc,
							bool do_balance)
{
	pgoff_t index, end;
	struct pagevec pvec;
@@ -1615,7 +1618,8 @@ continue_unlock:
			set_fsync_mark(page, 0);
			set_dentry_mark(page, 0);

			ret = __write_node_page(page, false, &submitted, wbc);
			ret = __write_node_page(page, false, &submitted,
							wbc, do_balance);
			if (ret)
				unlock_page(page);
			else if (submitted)
@@ -1707,7 +1711,7 @@ static int f2fs_write_node_pages(struct address_space *mapping,
	diff = nr_pages_to_write(sbi, NODE, wbc);
	wbc->sync_mode = WB_SYNC_NONE;
	blk_start_plug(&plug);
	sync_node_pages(sbi, wbc);
	sync_node_pages(sbi, wbc, true);
	blk_finish_plug(&plug);
	wbc->nr_to_write = max((long)0, wbc->nr_to_write - diff);
	return 0;