All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Gabriel Krisman Bertazi <krisman@collabora.com>,
	Chao Yu <yuchao0@huawei.com>, Jaegeuk Kim <jaegeuk@kernel.org>,
	Sasha Levin <sashal@kernel.org>,
	linux-f2fs-devel@lists.sourceforge.net
Subject: [PATCH AUTOSEL 5.8 24/29] f2fs: Return EOF on unaligned end of file DIO read
Date: Mon, 14 Sep 2020 09:03:53 -0400	[thread overview]
Message-ID: <20200914130358.1804194-24-sashal@kernel.org> (raw)
In-Reply-To: <20200914130358.1804194-1-sashal@kernel.org>

From: Gabriel Krisman Bertazi <krisman@collabora.com>

[ Upstream commit 20d0a107fb35f37578b919f62bd474d6d358d579 ]

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@collabora.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 fs/f2fs/data.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 6e9017e6a8197..403e8033c974b 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -3463,6 +3463,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.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Sasha Levin <sashal@kernel.org>, Jaegeuk Kim <jaegeuk@kernel.org>,
	Gabriel Krisman Bertazi <krisman@collabora.com>,
	linux-f2fs-devel@lists.sourceforge.net
Subject: [f2fs-dev] [PATCH AUTOSEL 5.8 24/29] f2fs: Return EOF on unaligned end of file DIO read
Date: Mon, 14 Sep 2020 09:03:53 -0400	[thread overview]
Message-ID: <20200914130358.1804194-24-sashal@kernel.org> (raw)
In-Reply-To: <20200914130358.1804194-1-sashal@kernel.org>

From: Gabriel Krisman Bertazi <krisman@collabora.com>

[ Upstream commit 20d0a107fb35f37578b919f62bd474d6d358d579 ]

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@collabora.com>
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 fs/f2fs/data.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 6e9017e6a8197..403e8033c974b 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -3463,6 +3463,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.25.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

  parent reply	other threads:[~2020-09-14 17:05 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-14 13:03 [PATCH AUTOSEL 5.8 01/29] xprtrdma: Release in-flight MRs on disconnect Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 02/29] NFSv4.1 handle ERR_DELAY error reclaiming locking state on delegation recall Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 03/29] phy: omap-usb2-phy: disable PHY charger detect Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 04/29] habanalabs: prevent user buff overflow Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 05/29] habanalabs: fix report of RAZWI initiator coordinates Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 06/29] scsi: pm8001: Fix memleak in pm8001_exec_internal_task_abort Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 07/29] scsi: libfc: Fix for double free() Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 08/29] scsi: lpfc: Fix FLOGI/PLOGI receive race condition in pt2pt discovery Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 09/29] scsi: lpfc: Extend the RDF FPIN Registration descriptor for additional events Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 10/29] regulator: pwm: Fix machine constraints application Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 11/29] spi: spi-loopback-test: Fix out-of-bounds read Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 12/29] interconnect: Show bandwidth for disabled paths as zero in debugfs Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 13/29] NFS: Zero-stateid SETATTR should first return delegation Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 14/29] SUNRPC: stop printk reading past end of string Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 15/29] rapidio: Replace 'select' DMAENGINES 'with depends on' Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 16/29] cifs: fix DFS mount with cifsacl/modefromsid Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 17/29] kobject: Drop unneeded conditional in __kobject_del() Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 18/29] openrisc: Fix cache API compile issue when not inlining Sasha Levin
2020-09-14 13:03   ` [OpenRISC] " Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 19/29] nvme-fc: cancel async events before freeing event struct Sasha Levin
2020-09-14 13:03   ` Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 20/29] nvme-rdma: " Sasha Levin
2020-09-14 13:03   ` Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 21/29] nvme-tcp: " Sasha Levin
2020-09-14 13:03   ` Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 22/29] block: only call sched requeue_request() for scheduled requests Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 23/29] f2fs: fix indefinite loop scanning for free nid Sasha Levin
2020-09-14 13:03   ` [f2fs-dev] " Sasha Levin
2020-09-14 13:03 ` Sasha Levin [this message]
2020-09-14 13:03   ` [f2fs-dev] [PATCH AUTOSEL 5.8 24/29] f2fs: Return EOF on unaligned end of file DIO read Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 25/29] i2c: algo: pca: Reapply i2c bus settings after reset Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 26/29] spi: Fix memory leak on splited transfers Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 27/29] gcov: add support for GCC 10.1 Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 28/29] KVM: Check the allocation of pv cpu mask Sasha Levin
2020-09-14 13:03 ` [PATCH AUTOSEL 5.8 29/29] KVM: MIPS: Change the definition of kvm type Sasha Levin

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=20200914130358.1804194-24-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=jaegeuk@kernel.org \
    --cc=krisman@collabora.com \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=yuchao0@huawei.com \
    /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.