]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commit
f2fs: preallocate DIO blocks when forcing buffered_io
authorJaegeuk Kim <jaegeuk@kernel.org>
Tue, 26 Nov 2019 23:01:42 +0000 (15:01 -0800)
committerPaolo Pisati <paolo.pisati@canonical.com>
Mon, 24 Feb 2020 15:19:23 +0000 (16:19 +0100)
commit0164aff0acfb30ffc0957fc4bc20c567d9a0ebb0
treefa7cbee111bda9dcf701b5a17bd77449dfb7bd6c
parent035a9e1d0d3dd59731fd1e316380c4f1c021b387
f2fs: preallocate DIO blocks when forcing buffered_io

BugLink: https://bugs.launchpad.net/bugs/1864488
[ Upstream commit 47501f87c61ad2aa234add63e1ae231521dbc3f5 ]

The previous preallocation and DIO decision like below.

                         allow_outplace_dio              !allow_outplace_dio
f2fs_force_buffered_io   (*) No_Prealloc / Buffered_IO   Prealloc / Buffered_IO
!f2fs_force_buffered_io  No_Prealloc / DIO               Prealloc / DIO

But, Javier reported Case (*) where zoned device bypassed preallocation but
fell back to buffered writes in f2fs_direct_IO(), resulting in stale data
being read.

In order to fix the issue, actually we need to preallocate blocks whenever
we fall back to buffered IO like this. No change is made in the other cases.

                         allow_outplace_dio              !allow_outplace_dio
f2fs_force_buffered_io   (*) Prealloc / Buffered_IO      Prealloc / Buffered_IO
!f2fs_force_buffered_io  No_Prealloc / DIO               Prealloc / DIO

Reported-and-tested-by: Javier Gonzalez <javier@javigon.com>
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Tested-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Reviewed-by: Javier González <javier@javigon.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
fs/f2fs/data.c
fs/f2fs/file.c