Hi Gabriel, Thank you for the patch. Let me take this separately from the patch set. Thanks, On 08/19, Gabriel Krisman Bertazi wrote: > Reading past end of file returns EOF for aligned reads but -EINVAL for > unaligned reads on f2fs. While documentation is not strict about this > corner case, most filesystem returns EOF on this case, like iomap > filesystems. This patch consolidates the behavior for f2fs, by making > it return EOF(0). > > it can be verified by a read loop on a file that does a partial read > before EOF (A file that doesn't end at an aligned address). The > following code fails on an unaligned file on f2fs, but not on > btrfs, ext4, and xfs. > > while (done < total) { > ssize_t delta = pread(fd, buf + done, total - done, off + done); > if (!delta) > break; > ... > } > > It is arguable whether filesystems should actually return EOF or > -EINVAL, but since iomap filesystems support it, and so does the > original DIO code, it seems reasonable to consolidate on that. > > Signed-off-by: Gabriel Krisman Bertazi <krisman@xxxxxxxxxxxxx> > --- > fs/f2fs/data.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c > index 5f527073143e..d9834ffe1da9 100644 > --- a/fs/f2fs/data.c > +++ b/fs/f2fs/data.c > @@ -3510,6 +3510,9 @@ static int check_direct_IO(struct inode *inode, struct iov_iter *iter, > unsigned long align = offset | iov_iter_alignment(iter); > struct block_device *bdev = inode->i_sb->s_bdev; > > + if (iov_iter_rw(iter) == READ && offset >= i_size_read(inode)) > + return 1; > + > if (align & blocksize_mask) { > if (bdev) > blkbits = blksize_bits(bdev_logical_block_size(bdev)); > -- > 2.28.0