Re: [PATCH 5.10.x] btrfs: fix crash after non-aligned direct IO write with O_DSYNC
From: Filipe Manana <fdmanana@kernel.org>
Date: 2021-02-15 11:06:33
On Sat, Feb 13, 2021 at 1:07 AM Wang Yugui [off-list ref] wrote:
Hi,quoted
This bug only affects 5.10 kernels, and the regression was introduced in 5.10-rc1 by commit 0eb79294dbe328 ("btrfs: dio iomap DSYNC workaround"). The bug does not exist in 5.11 kernels due to commit ecfdc08b8cc65d ("btrfs: remove dio iomap DSYNC workaround"), which depends on other changes that went into the merge window for 5.11. So this is a fix only for 5.10.x stable kernels, as there are people hitting this.It is OK too to backport commit ecfdc08b8cc65d ("btrfs: remove dio iomap DSYNC workaround") to 5.10 for this problem? the iomap issue for commit 0eb79294dbe328 ("btrfs: dio iomap DSYNC workaround") is already fixed in 5.10?
Quoting the changelog:
"commit ecfdc08b8cc65d
("btrfs: remove dio iomap DSYNC workaround"), which depends on other
changes that went into the merge window for 5.11."
All the changes, are (at least):
commit ecfdc08b8cc65d737eebc26a1ee1875a097fd6a0 --> 5.11-rc1
Author: Goldwyn Rodrigues [off-list ref]
Date: Thu Sep 24 11:39:21 2020 -0500
btrfs: remove dio iomap DSYNC workaround
commit a42fa643169d2325602572633fcaa16862990e28
Author: Goldwyn Rodrigues [off-list ref]
Date: Thu Sep 24 11:39:20 2020 -0500
btrfs: call iomap_dio_complete() without inode_lock
commit 502756b380938022c848761837f8fa3976906aa1
Author: Goldwyn Rodrigues [off-list ref]
Date: Thu Sep 24 11:39:19 2020 -0500
btrfs: remove btrfs_inode::dio_sem
commit e9adabb9712ef9424cbbeeaa027d962ab5262e19
Author: Goldwyn Rodrigues [off-list ref]
Date: Thu Sep 24 11:39:18 2020 -0500
btrfs: use shared lock for direct writes within EOF
commit c352370633400d13765cc88080c969799ea51108
Author: Goldwyn Rodrigues [off-list ref]
Date: Thu Sep 24 11:39:17 2020 -0500
btrfs: push inode locking and unlocking into buffered/direct write
commit a14b78ad06aba0fa7e76d2bc13c5ba581a7f331a
Author: Goldwyn Rodrigues [off-list ref]
Date: Thu Sep 24 11:39:16 2020 -0500
btrfs: introduce btrfs_inode_lock()/unlock()
commit b8d8e1fd570a194904f545b135efc880d96a41a4
Author: Goldwyn Rodrigues [off-list ref]
Date: Thu Sep 24 11:39:15 2020 -0500
btrfs: introduce btrfs_write_check()
That's probably too much to add to stable at once, plus I'm assuming
all required iomap dependencies are in 5.10 already (it seems so,
unless I missed something).
Usually we don't add patches to stable that didn't go through Linus'
tree either (there were 1 or 2 very rare exceptions in the past I
think), but when a backport depends on so many patches, and not all
from the same patchset, the risk of getting something wrong is
significant. That's why I opted to send this patch, which is much more
simple.
David has more experience on that and it's up to him to decide.
Best Regards Wang Yugui (wangyugui@e16-tech.com) 2021/02/13quoted
Fixes: 0eb79294dbe328 ("btrfs: dio iomap DSYNC workaround") CC: stable@vger.kernel.org # 5.10 (and only 5.10) Bugzilla: https://bugzilla.suse.com/show_bug.cgi?id=1181605 Signed-off-by: Filipe Manana <redacted> --- fs/btrfs/inode.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index acc47e2ffb46..b536d21541a9 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c@@ -8026,8 +8026,12 @@ ssize_t btrfs_direct_IO(struct kiocb *iocb, struct iov_iter *iter) bool relock = false; ssize_t ret; - if (check_direct_IO(fs_info, iter, offset)) + if (check_direct_IO(fs_info, iter, offset)) { + ASSERT(current->journal_info == NULL || + current->journal_info == BTRFS_DIO_SYNC_STUB); + current->journal_info = NULL; return 0; + } count = iov_iter_count(iter); if (iov_iter_rw(iter) == WRITE) { --2.28.0