From: David Timber <dxdt@dev.snart.me>
To: Namjae Jeon <linkinjeon@kernel.org>,
Sungjong Seo <sj1557.seo@samsung.com>,
Yuezhang Mo <yuezhang.mo@sony.com>
Cc: Andy Wu <Andy.Wu@sony.com>,
Aoyama Wataru <wataru.aoyama@sony.com>,
David Timber <dxdt@dev.snart.me>,
stable@vger.kernel.org
Subject: [PATCH v1] exfat: bail prematurely from exfat_extend_valid_size() upon fatal signal
Date: Mon, 13 Jul 2026 15:19:54 +0900 [thread overview]
Message-ID: <20260713061954.19557-1-dxdt@dev.snart.me> (raw)
commit 82a81a7352bcf5f2756ac33d47ee0582737e9a85 upstream.
If a file in an exfat volume has a large (isize - VDL) gap and userspace
write past a large amount of unwritten clusters, write amplification
occurs. Currently there was no way for userspace to cancel this.
As tasks with pending fatal signal receives preferential treatment in
mm/vmscan.c, if the userspace process is killed during the iteration,
the excessive use of pages in block_write may lead to system instability
and OOM killer activating in vain to free up some pages.
Demo:
truncate -s 16G /mnt/exfat/file
dd if=/dev/urandom of=/mnt/exfat/file bs=1 count=1 seek=16G &
kill -KILL $!
To fix this, add the fatal_signal_pending() check in the loop. This
mirrors the behaviour of iomap variant of exfat. Note that the iomap
exfat implementation is unaffected as the check is already present in
iomap_zero_range().
Fixes: 11a347fb6cef ("exfat: change to get file size from DataLength")
Cc: <stable@vger.kernel.org> # 6.18+
Signed-off-by: David Timber <dxdt@dev.snart.me>
---
fs/exfat/file.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/fs/exfat/file.c b/fs/exfat/file.c
index 91e5511945d1..4db6a4b773fd 100644
--- a/fs/exfat/file.c
+++ b/fs/exfat/file.c
@@ -656,6 +656,11 @@ static int exfat_extend_valid_size(struct inode *inode, loff_t new_valid_size)
struct folio *folio;
unsigned long off;
+ if (fatal_signal_pending(current)) {
+ err = -EINTR;
+ goto out;
+ }
+
len = PAGE_SIZE - (pos & (PAGE_SIZE - 1));
if (pos + len > new_valid_size)
len = new_valid_size - pos;
@@ -717,13 +722,20 @@ static ssize_t exfat_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)
if (pos > valid_size) {
ret = exfat_extend_valid_size(inode, pos);
- if (ret < 0 && ret != -ENOSPC) {
- exfat_err(inode->i_sb,
- "write: fail to zero from %llu to %llu(%zd)",
- valid_size, pos, ret);
- }
- if (ret < 0)
+ if (ret < 0) {
+ /* Do not report trivial errors. */
+ switch (ret) {
+ case -ENOSPC:
+ case -EINTR:
+ break;
+ default:
+ exfat_err(inode->i_sb,
+ "write: fail to zero from %llu to %llu(%zd)",
+ valid_size, pos, ret);
+ }
+
goto unlock;
+ }
}
ret = __generic_file_write_iter(iocb, iter);
--
2.55.0
next reply other threads:[~2026-07-13 6:29 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-13 6:19 David Timber [this message]
2026-07-13 6:53 ` [PATCH v1] exfat: bail prematurely from exfat_extend_valid_size() upon fatal signal Greg KH
2026-07-13 6:56 ` David Timber
2026-07-13 7:55 ` David Timber
2026-07-13 12:05 ` Greg KH
2026-07-13 12:14 ` David Timber
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=20260713061954.19557-1-dxdt@dev.snart.me \
--to=dxdt@dev.snart.me \
--cc=Andy.Wu@sony.com \
--cc=linkinjeon@kernel.org \
--cc=sj1557.seo@samsung.com \
--cc=stable@vger.kernel.org \
--cc=wataru.aoyama@sony.com \
--cc=yuezhang.mo@sony.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox