Commit 3bf1bab5 authored by yohan.joung's avatar yohan.joung Committed by Jaegeuk Kim
Browse files

f2fs: zone: wait for inflight dio completion, excluding pinned files read using dio



read for the pinfile using Direct I/O do not wait for dio write.

Signed-off-by: default avataryohan.joung <yohan.joung@sk.com>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent e6d5e789
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -4834,6 +4834,7 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
	struct inode *inode = file_inode(iocb->ki_filp);
	const loff_t pos = iocb->ki_pos;
	ssize_t ret;
	bool dio;

	if (!f2fs_is_compress_backend_ready(inode))
		return -EOPNOTSUPP;
@@ -4842,12 +4843,15 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
		f2fs_trace_rw_file_path(iocb->ki_filp, iocb->ki_pos,
					iov_iter_count(to), READ);

	dio = f2fs_should_use_dio(inode, iocb, to);

	/* In LFS mode, if there is inflight dio, wait for its completion */
	if (f2fs_lfs_mode(F2FS_I_SB(inode)) &&
	    get_pages(F2FS_I_SB(inode), F2FS_DIO_WRITE))
	    get_pages(F2FS_I_SB(inode), F2FS_DIO_WRITE) &&
		(!f2fs_is_pinned_file(inode) || !dio))
		inode_dio_wait(inode);

	if (f2fs_should_use_dio(inode, iocb, to)) {
	if (dio) {
		ret = f2fs_dio_read_iter(iocb, to);
	} else {
		ret = filemap_read(iocb, to, 0);