From: sashiko-bot@kernel.org
To: "Zhang Yi" <yi.zhang@huaweicloud.com>
Cc: linux-ext4@vger.kernel.org, tytso@mit.edu
Subject: Re: [PATCH -next v5 31/32] ext4: partially enable iomap for the buffered I/O path of regular files
Date: Fri, 14 Aug 2026 10:39:03 +0000 [thread overview]
Message-ID: <20260814103904.437FD1F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260814094616.1710143-1-yi.zhang@huaweicloud.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Critical] Encrypted and verity inodes on corrupted or downgraded filesystems bypass fscrypt and fsverity, leading to plaintext data writes and unverified reads.
- [Medium] Race condition in background writeback causing spurious WARN_ON_ONCE in ext4_iomap_writepages().
--
--- Patch [31]: [PATCH -next v5 31/32] ext4: partially enable iomap for the buffered I/O path of regular files ---
commit 385d0947c4a6c1e02718f1b42a8ef1dc35bdbf03
Author: Zhang Yi <yi.zhang@huawei.com>
Subject: ext4: partially enable iomap for the buffered I/O path of regular files
This commit introduces ext4_enable_buffered_iomap() to determine whether a
regular file inode should use the iomap buffered I/O path. Inodes silently
fall back to the traditional buffer_head path if unsupported features like
encryption, verity, inline data, or data=journal mode are met.
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index ee15366422a1e..c9ee78fba4d0c 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
[ ... ]
> @@ -4467,6 +4479,10 @@ static int ext4_iomap_writepages(struct address_space *mapping,
> .ops = &ext4_writeback_ops,
> };
>
> + /* inode using the buffer_head buffered I/O path should not go here. */
> + if (WARN_ON_ONCE(!ext4_inode_buffered_iomap(inode)))
> + return -EINVAL;
> +
[Severity: Medium]
Can this WARN_ON_ONCE trigger spuriously due to a race with
ext4_change_inode_journal_flag()?
If background writeback via do_writepages() resolves
mapping->a_ops->writepages to ext4_iomap_writepages locklessly, the thread
might be preempted right before this check.
Meanwhile, another thread running ext4_change_inode_journal_flag() could
flush writeback, acquire s_writepages_rwsem exclusively, and clear the
EXT4_STATE_BUFFERED_IOMAP flag.
When the writeback thread resumes, it would evaluate this condition before
acquiring the s_writepages_rwsem read lock, which would trip the warning.
Should this check be moved after acquiring the read lock?
> ret = ext4_emergency_state(sb);
> if (unlikely(ret)) {
[ ... ]
> @@ -6037,6 +6053,81 @@ static int check_igot_inode(struct inode *inode, ext4_iget_flags flags,
> return -EFSCORRUPTED;
> }
>
> +/*
> + * Determine whether an inode should use the iomap buffered I/O path.
> + * EXT4_STATE_BUFFERED_IOMAP is generally set at inode initialization
[ ... ]
> +void ext4_enable_buffered_iomap(struct inode *inode)
> +{
> + struct super_block *sb = inode->i_sb;
> +
> + if (!S_ISREG(inode->i_mode))
> + return;
> + if (ext4_test_inode_flag(inode, EXT4_INODE_EA_INODE))
> + return;
> +
> + /* Unsupported Features */
> + if (ext4_has_feature_inline_data(sb))
> + return;
> + if (ext4_has_feature_verity(sb))
> + return;
> + if (ext4_has_feature_encrypt(sb))
> + return;
[Severity: Critical]
Could checking the superblock features instead of the inode flags here lead
to a security bypass if the filesystem is manipulated offline?
If an attacker clears the encryption or verity superblock features offline,
the kernel still sets S_ENCRYPTED or S_VERITY on individual inodes that have
the flags set.
However, these superblock checks would fall through, allowing the encrypted
or verity inodes to be assigned to the iomap buffered I/O path. Since the
ext4 iomap path currently lacks fscrypt and fsverity integration, would this
cause writes to submit plaintext bios and reads to skip cryptographic
verification?
Would it be safer to check IS_ENCRYPTED(inode) and
ext4_test_inode_flag(inode, EXT4_INODE_VERITY) directly?
> + if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA ||
> + ext4_test_inode_flag(inode, EXT4_INODE_JOURNAL_DATA))
> + return;
> + if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
> + return;
> +
> + ext4_set_inode_state(inode, EXT4_STATE_BUFFERED_IOMAP);
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260814093331.1703882-1-yi.zhang@huaweicloud.com?part=31
next prev parent reply other threads:[~2026-08-14 10:39 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-14 9:32 [PATCH -next v5 00/32] ext4: use iomap for regular file's buffered I/O path Zhang Yi
2026-08-14 9:33 ` [PATCH -next v5 01/32] ext4: simplify size updating in ext4_setattr() Zhang Yi
2026-08-14 10:02 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 02/32] ext4: factor out ext4_truncate_[up|down]() Zhang Yi
2026-08-14 10:04 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 03/32] ext4: simplify error handling in ext4_setattr() Zhang Yi
2026-08-14 10:12 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 04/32] ext4: skip ordered I/O wait when zeroing beyond i_disksize block Zhang Yi
2026-08-14 10:14 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 05/32] ext4: set EXT4_MAP_NEW flag for delayed allocated blocks Zhang Yi
2026-08-14 10:08 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 06/32] ext4: recheck extent status tree before block allocation Zhang Yi
2026-08-14 10:15 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 07/32] ext4: fix orig_mlen initialization in ext4_map_blocks() Zhang Yi
2026-08-14 10:08 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 08/32] ext4: allow ext4_map_blocks() to start its own transaction handle Zhang Yi
2026-08-14 10:00 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 09/32] ext4: avoid unnecessary transaction in ext4_map_blocks() for unwritten extents Zhang Yi
2026-08-14 10:15 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 10/32] ext4: skip block allocation for holes in the data submission path Zhang Yi
2026-08-14 10:15 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 11/32] ext4: add iomap address space operations for buffered I/O Zhang Yi
2026-08-14 10:04 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 12/32] ext4: implement buffered read path using iomap Zhang Yi
2026-08-14 10:15 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 13/32] ext4: pass out extent seq counter when mapping da blocks Zhang Yi
2026-08-14 10:12 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 14/32] ext4: do not use data=ordered mode for inodes using buffered iomap path Zhang Yi
2026-08-14 10:12 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 15/32] ext4: implement buffered write path using iomap Zhang Yi
2026-08-14 10:40 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 16/32] ext4: implement writeback " Zhang Yi
2026-08-14 10:19 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 17/32] ext4: implement mmap " Zhang Yi
2026-08-14 10:35 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 18/32] ext4: implement partial block zero range " Zhang Yi
2026-08-14 10:25 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 19/32] ext4: tolerate unexpected holes in ext4_convert_unwritten_extents() Zhang Yi
2026-08-14 10:09 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 20/32] ext4: add block mapping tracepoints for iomap buffered I/O path Zhang Yi
2026-08-14 10:08 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 21/32] ext4: disable online defrag when inode using " Zhang Yi
2026-08-14 10:08 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 22/32] ext4: add EXT4_STATE_DISKSIZE_GROW_PENDING state bit and helpers Zhang Yi
2026-08-14 10:09 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 23/32] ext4: submit and wait for pending disksize-grow I/O on writeback Zhang Yi
2026-08-14 10:25 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 24/32] ext4: advance i_disksize to i_size upon disksize-grow I/O completion Zhang Yi
2026-08-14 10:25 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 25/32] ext4: defer i_disksize update while DISKSIZE_GROW_PENDING is set Zhang Yi
2026-08-14 10:31 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 26/32] ext4: submit and wait for disksize-grow I/O in fallocate paths Zhang Yi
2026-08-14 10:28 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 27/32] ext4: clear DISKSIZE_GROW_PENDING on truncate or error Zhang Yi
2026-08-14 10:31 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 28/32] ext4: set DISKSIZE_GROW_PENDING after zeroing unaligned EOF block Zhang Yi
2026-08-14 10:18 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 29/32] ext4: add tracepoints for DISKSIZE_GROW_PENDING set, clear, and wait Zhang Yi
2026-08-14 10:18 ` sashiko-bot
2026-08-14 9:33 ` [PATCH -next v5 30/32] ext4: add tracepoints for EOF block zeroing and disksize-grow I/O Zhang Yi
2026-08-14 10:19 ` sashiko-bot
2026-08-14 9:46 ` [PATCH -next v5 31/32] ext4: partially enable iomap for the buffered I/O path of regular files Zhang Yi
2026-08-14 10:39 ` sashiko-bot [this message]
2026-08-14 9:46 ` [PATCH -next v5 32/32] ext4: introduce a mount option for iomap buffered I/O path Zhang Yi
2026-08-14 10:25 ` sashiko-bot
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=20260814103904.437FD1F00A3A@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=tytso@mit.edu \
--cc=yi.zhang@huaweicloud.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.