When issuing a DIO read past EOF on a file that doesn't end on a block boundary, behavior varies among filesystems. Most filesystems (including the ones using iomap for DIO) will return EOF, but the old generic DIO mechanism changed behavior accidently after commit 9fe55eea7e4b ("Fix race when checking i_size on direct i/o read") and started returning -EINVAL. This can be observed with a simple read over a file that doesn't end on a block boundary, forcing the last read to be unaligned. while (done < total) { ssize_t delta = pread(fd, buf + done, total - done, off + done); if (!delta) break; ... } On the final read, delta will be 0 on most filesystems, including ext4, xfs and btrfs, but it started being -EINVAL after said commit, for filesystems using do_blockdev_direct_IO. BTRFS, even though relying on this generic code, doesn't have this issue, because it does the verification beforehand, on check_direct_IO. Finally, f2fs requires a specific fix, since it checks for alignment before calling the generic code. It is arguable whether filesystems should actually return EOF or -EINVAL, but since the original ABI returned 0 and so does most filesystems and original DIO code, it seems reasonable to consolidate on that. Therefore, this patchset fixes the filesystems returning EINVAL to return EOF. I ran smoke tests over f2fs, and didn't observe regressions. Gabriel Krisman Bertazi (1): f2fs: Return EOF on unaligned end of file DIO read Jamie Liu (1): direct-io: defer alignment check until after EOF check fs/direct-io.c | 31 ++++++++++++++++++------------- fs/f2fs/data.c | 3 +++ 2 files changed, 21 insertions(+), 13 deletions(-) -- 2.28.0