diff options
author | Jens Axboe <axboe@kernel.dk> | 2023-09-25 00:21:35 -0600 |
---|---|---|
committer | Christian Brauner <brauner@kernel.org> | 2023-09-25 11:37:28 +0200 |
commit | 2d1b3bbc3dd56fc8364350eb93e5d67a05cb2c23 (patch) | |
tree | af8d79fa0a64f2e35f709cf994454db2eef8132c /fs/overlayfs | |
parent | 060e6c7d179ed2f2088a23ceedf60d63320e9311 (diff) | |
download | linux-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.c | 6 |
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); |