From: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
To: Keith Busch <kbusch@kernel.org>, Jan Kara <jack@suse.cz>
Cc: Keith Busch <kbusch@meta.com>,
linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org,
snitzer@kernel.org, axboe@kernel.dk, dw@davidwei.uk,
brauner@kernel.org, hch@lst.de, martin.petersen@oracle.com,
djwong@kernel.org, linux-xfs@vger.kernel.org,
viro@zeniv.linux.org.uk, Jan Kara <jack@suse.com>
Subject: Re: [PATCHv3 0/8] direct-io: even more flexible io vectors
Date: Tue, 26 Aug 2025 10:29:58 +0530 [thread overview]
Message-ID: <87cy8ir835.fsf@gmail.com> (raw)
In-Reply-To: <aKx485EMthHfBWef@kbusch-mbp>
Keith Busch <kbusch@kernel.org> writes:
> On Mon, Aug 25, 2025 at 02:07:15PM +0200, Jan Kara wrote:
>> On Fri 22-08-25 18:57:08, Ritesh Harjani wrote:
>> > Keith Busch <kbusch@meta.com> writes:
>> > >
>> > > - EXT4 falls back to buffered io for writes but not for reads.
>> >
>> > ++linux-ext4 to get any historical context behind why the difference of
>> > behaviour in reads v/s writes for EXT4 DIO.
>>
>> Hum, how did you test? Because in the basic testing I did (with vanilla
>> kernel) I get EINVAL when doing unaligned DIO write in ext4... We should be
>> falling back to buffered IO only if the underlying file itself does not
>> support any kind of direct IO.
>
> Simple test case (dio-offset-test.c) below.
>
> I also ran this on vanilla kernel and got these results:
>
> # mkfs.ext4 /dev/vda
> # mount /dev/vda /mnt/ext4/
> # make dio-offset-test
> # ./dio-offset-test /mnt/ext4/foobar
> write: Success
> read: Invalid argument
>
> I tracked the "write: Success" down to ext4's handling for the "special"
> -ENOTBLK error after ext4_want_directio_fallback() returns "true".
>
Right. Ext4 has fallback only for dio writes but not for DIO reads...
buffered
static inline bool ext4_want_directio_fallback(unsigned flags, ssize_t written)
{
/* must be a directio to fall back to buffered */
if ((flags & (IOMAP_WRITE | IOMAP_DIRECT)) !=
(IOMAP_WRITE | IOMAP_DIRECT))
return false;
...
}
So basically the path is ext4_file_[read|write]_iter() -> iomap_dio_rw
-> iomap_dio_bio_iter() -> return -EINVAL. i.e. from...
if ((pos | length) & (bdev_logical_block_size(iomap->bdev) - 1) ||
!bdev_iter_is_aligned(iomap->bdev, dio->submit.iter))
return -EINVAL;
EXT4 then fallsback to buffered-io only for writes, but not for reads.
-ritesh
> dio-offset-test.c:
> ---
> #ifndef _GNU_SOURCE
> #define _GNU_SOURCE
> #endif
>
> #include <sys/uio.h>
> #include <err.h>
> #include <errno.h>
> #include <fcntl.h>
> #include <stdlib.h>
> #include <stdio.h>
> #include <unistd.h>
>
> int main(int argc, char **argv)
> {
> unsigned int pagesize;
> struct iovec iov[2];
> int ret, fd;
> void *buf;
>
> if (argc < 2)
> err(EINVAL, "usage: %s <file>", argv[0]);
>
> pagesize = sysconf(_SC_PAGE_SIZE);
> ret = posix_memalign((void **)&buf, pagesize, 2 * pagesize);
> if (ret)
> err(errno, "%s: failed to allocate buf", __func__);
>
> fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC | O_DIRECT);
> if (fd < 0)
> err(errno, "%s: failed to open %s", __func__, argv[1]);
>
> iov[0].iov_base = buf;
> iov[0].iov_len = 256;
> iov[1].iov_base = buf + pagesize;
> iov[1].iov_len = 256;
> ret = pwritev(fd, iov, 2, 0);
> perror("write");
>
> ret = preadv(fd, iov, 2, 0);
> perror("read");
>
> return 0;
> }
> --
next prev parent reply other threads:[~2025-08-26 6:40 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-19 16:49 [PATCHv3 0/8] direct-io: even more flexible io vectors Keith Busch
2025-08-19 16:49 ` [PATCHv3 1/8] block: check for valid bio while splitting Keith Busch
2025-08-20 7:02 ` Damien Le Moal
2025-08-20 14:25 ` Keith Busch
2025-08-20 7:04 ` Damien Le Moal
2025-08-25 7:35 ` Christoph Hellwig
2025-08-19 16:49 ` [PATCHv3 2/8] block: add size alignment to bio_iov_iter_get_pages Keith Busch
2025-08-25 7:36 ` Christoph Hellwig
2025-08-19 16:49 ` [PATCHv3 3/8] block: align the bio after building it Keith Busch
2025-08-20 7:07 ` Damien Le Moal
2025-08-25 7:46 ` Christoph Hellwig
2025-08-25 13:57 ` Keith Busch
2025-08-25 7:47 ` Christoph Hellwig
2025-08-26 0:37 ` Keith Busch
2025-08-26 8:02 ` Christoph Hellwig
2025-08-26 23:11 ` Keith Busch
2025-08-19 16:49 ` [PATCHv3 4/8] block: simplify direct io validity check Keith Busch
2025-08-25 7:48 ` Christoph Hellwig
2025-08-19 16:49 ` [PATCHv3 5/8] iomap: " Keith Busch
2025-08-25 7:48 ` Christoph Hellwig
2025-08-19 16:49 ` [PATCHv3 6/8] block: remove bdev_iter_is_aligned Keith Busch
2025-08-25 7:48 ` Christoph Hellwig
2025-08-19 16:49 ` [PATCHv3 7/8] blk-integrity: use simpler alignment check Keith Busch
2025-08-25 7:49 ` Christoph Hellwig
2025-08-19 16:49 ` [PATCHv3 8/8] iov_iter: remove iov_iter_is_aligned Keith Busch
2025-08-25 7:50 ` Christoph Hellwig
2025-08-19 23:36 ` [PATCHv3 0/8] direct-io: even more flexible io vectors Mike Snitzer
2025-08-20 1:52 ` Song Chen
2025-08-22 13:27 ` Ritesh Harjani
2025-08-22 14:30 ` Keith Busch
2025-08-25 12:07 ` Jan Kara
2025-08-25 14:53 ` Keith Busch
2025-08-26 4:59 ` Ritesh Harjani [this message]
2025-08-27 15:20 ` Jan Kara
2025-08-27 16:09 ` Mike Snitzer
2025-09-01 7:55 ` Jan Kara
2025-09-02 14:39 ` Mike Snitzer
2025-08-27 17:52 ` Brian Foster
2025-08-27 19:20 ` Keith Busch
2025-09-01 8:22 ` Jan Kara
2025-08-29 2:11 ` Ritesh Harjani
2025-08-29 3:19 ` Ritesh Harjani
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87cy8ir835.fsf@gmail.com \
--to=ritesh.list@gmail.com \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=djwong@kernel.org \
--cc=dw@davidwei.uk \
--cc=hch@lst.de \
--cc=jack@suse.com \
--cc=jack@suse.cz \
--cc=kbusch@kernel.org \
--cc=kbusch@meta.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=snitzer@kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.