summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanila Chernetsov <listdansp@mail.ru>2026-05-30 15:23:11 +0300
committerJan Kara <jack@suse.cz>2026-06-02 11:56:16 +0300
commita4659be0bc7cb1856ffb15b67f903229ae8891ec (patch)
treeae0c34b8d8efe69b0aafffefab7476743cb5e6cf
parentf6fce9f17d9cfde8a88beda1527600d6daacc49b (diff)
downloadlinux-a4659be0bc7cb1856ffb15b67f903229ae8891ec.tar.xz
ext2: fix ignored return value of generic_write_sync()
Fix ext2_dio_write_iter() to propagate the error returned by generic_write_sync() instead of silently discarding it, which could cause write(2) to return success to userspace on O_SYNC/O_DSYNC files even when the sync failed. The correct pattern, already used in ext2_dax_write_iter() in the same file and in ext4, xfs, f2fs among others, is: if (ret > 0) ret = generic_write_sync(iocb, ret); Found by Linux Verification Center (linuxtesting.org) with SVACE. [JK: Reflect also filemap_write_and_wait() return value] Fixes: fb5de4358e1a ("ext2: Move direct-io to use iomap") Signed-off-by: Danila Chernetsov <listdansp@mail.ru> Link: https://patch.msgid.link/20260530122311.136803-1-listdansp@mail.ru Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r--fs/ext2/file.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/ext2/file.c b/fs/ext2/file.c
index fa0a9750cbd8..8dca9ec4cacd 100644
--- a/fs/ext2/file.c
+++ b/fs/ext2/file.c
@@ -161,12 +161,15 @@ static ssize_t ext2_dio_write_iter(struct kiocb *iocb, struct iov_iter *from)
endbyte = pos + status - 1;
ret2 = filemap_write_and_wait_range(inode->i_mapping, pos,
endbyte);
- if (!ret2)
+ if (!ret2) {
invalidate_mapping_pages(inode->i_mapping,
pos >> PAGE_SHIFT,
endbyte >> PAGE_SHIFT);
- if (ret > 0)
- generic_write_sync(iocb, ret);
+ if (ret > 0)
+ ret = generic_write_sync(iocb, ret);
+ } else {
+ ret = ret2;
+ }
}
out_unlock: