Skip to content

Commit 20d0a10

Browse files
krisman-at-collaboraJaegeuk Kim
authored andcommitted
f2fs: Return EOF on unaligned end of file DIO read
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 <[email protected]> Reviewed-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent e2cab03 commit 20d0a10

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

fs/f2fs/data.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3550,6 +3550,9 @@ static int check_direct_IO(struct inode *inode, struct iov_iter *iter,
35503550
unsigned long align = offset | iov_iter_alignment(iter);
35513551
struct block_device *bdev = inode->i_sb->s_bdev;
35523552

3553+
if (iov_iter_rw(iter) == READ && offset >= i_size_read(inode))
3554+
return 1;
3555+
35533556
if (align & blocksize_mask) {
35543557
if (bdev)
35553558
blkbits = blksize_bits(bdev_logical_block_size(bdev));

0 commit comments

Comments
 (0)