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

Commit 908659af authored by Yunlei He's avatar Yunlei He Committed by Jaegeuk Kim
Browse files

f2fs: return directly if block has been removed from the victim



If one block has been to written to a new place, just return
in move data process. This patch check it again with holding
page lock.

Signed-off-by: default avatarYunlei He <heyunlei@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 11895b32
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -544,7 +544,8 @@ static bool is_alive(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
	return true;
}

static void move_encrypted_block(struct inode *inode, block_t bidx)
static void move_encrypted_block(struct inode *inode, block_t bidx,
							unsigned int segno, int off)
{
	struct f2fs_io_info fio = {
		.sbi = F2FS_I_SB(inode),
@@ -564,6 +565,9 @@ static void move_encrypted_block(struct inode *inode, block_t bidx)
	if (!page)
		return;

	if (!check_valid_map(F2FS_I_SB(inode), segno, off))
		goto out;

	set_new_dnode(&dn, inode, NULL, NULL, 0);
	err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE);
	if (err)
@@ -643,7 +647,8 @@ out:
	f2fs_put_page(page, 1);
}

static void move_data_page(struct inode *inode, block_t bidx, int gc_type)
static void move_data_page(struct inode *inode, block_t bidx, int gc_type,
							unsigned int segno, int off)
{
	struct page *page;

@@ -651,6 +656,9 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type)
	if (IS_ERR(page))
		return;

	if (!check_valid_map(F2FS_I_SB(inode), segno, off))
		goto out;

	if (gc_type == BG_GC) {
		if (PageWriteback(page))
			goto out;
@@ -792,9 +800,9 @@ next_step:
			start_bidx = start_bidx_of_node(nofs, inode)
								+ ofs_in_node;
			if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
				move_encrypted_block(inode, start_bidx);
				move_encrypted_block(inode, start_bidx, segno, off);
			else
				move_data_page(inode, start_bidx, gc_type);
				move_data_page(inode, start_bidx, gc_type, segno, off);

			if (locked) {
				up_write(&fi->dio_rwsem[WRITE]);