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

Commit 0328f88e authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: update i_size after DIO completion



This is related to
ee70daaba82d ("xfs: update i_size after unwritten conversion in dio completion")

If we update i_size during dio_write, dio_read can read out stale data, which
breaks xfstests/465.

Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent faa6beba
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -878,7 +878,6 @@ static int __allocate_data_block(struct dnode_of_data *dn, int seg_type)
	struct f2fs_summary sum;
	struct node_info ni;
	block_t old_blkaddr;
	pgoff_t fofs;
	blkcnt_t count = 1;
	int err;

@@ -907,12 +906,10 @@ static int __allocate_data_block(struct dnode_of_data *dn, int seg_type)
					old_blkaddr, old_blkaddr);
	f2fs_set_data_blkaddr(dn);

	/* update i_size */
	fofs = f2fs_start_bidx_of_node(ofs_of_node(dn->node_page), dn->inode) +
							dn->ofs_in_node;
	if (i_size_read(dn->inode) < ((loff_t)(fofs + 1) << PAGE_SHIFT))
		f2fs_i_size_write(dn->inode,
				((loff_t)(fofs + 1) << PAGE_SHIFT));
	/*
	 * i_size will be updated by direct_IO. Otherwise, we'll get stale
	 * data from unwritten block via dio_read.
	 */
	return 0;
}

@@ -1078,6 +1075,8 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map,
					last_ofs_in_node = dn.ofs_in_node;
				}
			} else {
				WARN_ON(flag != F2FS_GET_BLOCK_PRE_DIO &&
					flag != F2FS_GET_BLOCK_DIO);
				err = __allocate_data_block(&dn,
							map->m_seg_type);
				if (!err)
@@ -1257,7 +1256,7 @@ static int get_data_block_dio(struct inode *inode, sector_t iblock,
			struct buffer_head *bh_result, int create)
{
	return __get_data_block(inode, iblock, bh_result, create,
						F2FS_GET_BLOCK_DEFAULT, NULL,
						F2FS_GET_BLOCK_DIO, NULL,
						f2fs_rw_hint_to_seg_type(
							inode->i_write_hint));
}
+1 −0
Original line number Diff line number Diff line
@@ -598,6 +598,7 @@ enum {
	F2FS_GET_BLOCK_DEFAULT,
	F2FS_GET_BLOCK_FIEMAP,
	F2FS_GET_BLOCK_BMAP,
	F2FS_GET_BLOCK_DIO,
	F2FS_GET_BLOCK_PRE_DIO,
	F2FS_GET_BLOCK_PRE_AIO,
	F2FS_GET_BLOCK_PRECACHE,