summaryrefslogtreecommitdiffstats
path: root/fs/overlayfs
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2023-09-25 00:21:35 -0600
committerChristian Brauner <brauner@kernel.org>2023-09-25 11:37:28 +0200
commit2d1b3bbc3dd56fc8364350eb93e5d67a05cb2c23 (patch)
treeaf8d79fa0a64f2e35f709cf994454db2eef8132c /fs/overlayfs
parent060e6c7d179ed2f2088a23ceedf60d63320e9311 (diff)
downloadlinux-stable-2d1b3bbc3dd56fc8364350eb93e5d67a05cb2c23.tar.gz
linux-stable-2d1b3bbc3dd56fc8364350eb93e5d67a05cb2c23.tar.bz2
linux-stable-2d1b3bbc3dd56fc8364350eb93e5d67a05cb2c23.zip
ovl: disable IOCB_DIO_CALLER_COMP
overlayfs copies the kiocb flags when it sets up a new kiocb to handle a write, but it doesn't properly support dealing with the deferred caller completions of the kiocb. This means it doesn't get the final write completion value, and hence will complete the write with '0' as the result. We could support the caller completions in overlayfs, but for now let's just disable them in the generated write kiocb. Reported-by: Zorro Lang <zlang@redhat.com> Link: https://lore.kernel.org/io-uring/20230924142754.ejwsjen5pvyc32l4@dell-per750-06-vm-08.rhts.eng.pek2.redhat.com/ Fixes: 8c052fb3002e ("iomap: support IOCB_DIO_CALLER_COMP") Signed-off-by: Jens Axboe <axboe@kernel.dk> Message-Id: <71897125-e570-46ce-946a-d4729725e28f@kernel.dk> Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'fs/overlayfs')
-rw-r--r--fs/overlayfs/file.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c
index 3b4cc633d763..ca18db79daf4 100644
--- a/fs/overlayfs/file.c
+++ b/fs/overlayfs/file.c
@@ -393,6 +393,12 @@ static ssize_t ovl_write_iter(struct kiocb *iocb, struct iov_iter *iter)
if (!ovl_should_sync(OVL_FS(inode->i_sb)))
ifl &= ~(IOCB_DSYNC | IOCB_SYNC);
+ /*
+ * Overlayfs doesn't support deferred completions, don't copy
+ * this property in case it is set by the issuer.
+ */
+ ifl &= ~IOCB_DIO_CALLER_COMP;
+
old_cred = ovl_override_creds(file_inode(file)->i_sb);
if (is_sync_kiocb(iocb)) {
file_start_write(real.file);