Commit c67e4252 authored by Zhihao Cheng's avatar Zhihao Cheng
Browse files

iomap: Don't finish dio under irq when there exists pages

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IA4DAW


CVE: NA

--------------------------------

Since commit 48774b90 ("ext4: Optimize endio process for DIO
overwrites"), pages invalidating won't be done in io completeing process,
which could make generic/451 failed. In generic 451, there are two
concurrent tasks: task A is reading(with page cache) a file, task B is
directly writing and reading to verify content. Task B will verify failed
in following process:
      task A         task B
                direct_write(offs=L, content_Y)
		submit_IO
 content_X = read_page(offs=L) // stale data, because IO is not completed
		content_X = find_page(offs=L) // content_Y != content_X

Fixes: 48774b90 ("ext4: Optimize endio process for DIO overwrites")
Signed-off-by: default avatarZhihao Cheng <chengzhihao@huaweicloud.com>
parent 3f2841fc
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -180,6 +180,11 @@ static void iomap_dio_bio_end_io(struct bio *bio)
		goto release_bio;
	}

	if ((dio->flags & IOMAP_DIO_INLINE_COMP) && dio->size &&
	    (dio->flags & IOMAP_DIO_WRITE) &&
	    file_inode(iocb->ki_filp)->i_mapping->nrpages)
		dio->flags &= ~IOMAP_DIO_INLINE_COMP;

	/*
	 * Flagged with IOMAP_DIO_INLINE_COMP, we can complete it inline
	 */