Linux EXT4 FS development
 help / color / mirror / Atom feed
From: Zhang Yi <yizhang089@gmail.com>
To: sashiko-reviews@lists.linux.dev, Zhang Yi <yi.zhang@huaweicloud.com>
Cc: tytso@mit.edu, linux-ext4@vger.kernel.org
Subject: Re: [PATCH v7 30/31] ext4: partially enable iomap for the buffered I/O path of regular files
Date: Sat, 10 Oct 2026 16:09:01 +0800	[thread overview]
Message-ID: <fe737cea-e80b-401e-b03e-d2eacf7b7fb3@gmail.com> (raw)
In-Reply-To: <sashiko-outbox-165384@kernel.org>

On 10/9/2026 7:33 PM, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Critical] ext4: NULL pointer dereference in pagecache_write() during dynamic fsverity enablement
> --
> 
> commit 3391a6fc6c975d43c433b32dd18bae4da4784860
> Author: Zhang Yi <yi.zhang@huawei.com>
> 
> ext4: partially enable iomap for the buffered I/O path of regular files
>      
> Introduce ext4_enable_buffered_iomap() to determine whether a regular file
> inode should use the iomap buffered I/O path. If unsupported features like
> fsverity are enabled at the superblock level, the inode silently falls back
> to the buffer_head path.
> 
>> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
>> index c3a6f3dce3d86..a07ce368e6e82 100644
>> --- a/fs/ext4/inode.c
>> +++ b/fs/ext4/inode.c
> [ ... ]
>> @@ -6076,6 +6098,81 @@ static int check_igot_inode(struct inode *inode, ext4_iget_flags flags,
> [ ... ]
>> +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;
> 
> [Severity: Critical]
> Does this logic handle dynamic fsverity enablement correctly?
> 
> If FS_IOC_ENABLE_VERITY is executed on a file where the verity feature was not
> initially set on the superblock, ext4_has_feature_verity(sb) will be false at
> inode initialization. This causes the inode to be assigned to the iomap
> buffered I/O path, setting mapping->a_ops = &ext4_iomap_aops.
> 
> When the user executes the ioctl, ext4_begin_enable_verity() does not check if
> the inode is using the iomap path. It proceeds to write the verity descriptor
> via ext4_write_verity_descriptor(), which calls pagecache_write().
> 
> fs/ext4/verity.c:pagecache_write() {
>      ...
>      res = aops->write_begin(NULL, mapping, pos, n, &folio, &fsdata);
>      ...
> }
> 
> Because pagecache_write() unconditionally dereferences aops->write_begin, and
> ext4_iomap_aops does not implement write_begin (it is NULL), can this lead to
> an immediate NULL pointer dereference?
> 
> Since this can be triggered by unprivileged users with write access via an
> ioctl, could this be exploited as a local Denial of Service?
> 

This is a false positive.  An inode is put on the buffered iomap path
only when the superblock does not have the verity feature, and that
feature is not allowed to be enabled at runtime.  It is a ro_compat
feature set by mkfs/tune2fs with the filesystem unmounted, and there is
no in-kernel setter for it.

More importantly, the only way to reach pagecache_write() from
ext4_begin_enable_verity() is FS_IOC_ENABLE_VERITY, and ext4's ioctl
handler gates it on the same ext4_has_feature_verity() check, so the
ioctl is rejected before ext4_begin_enable_verity() is ever called and
aops->write_begin() is never dereferenced.

Thanks,
Yi.

  reply	other threads:[~2026-10-10  8:09 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-09 10:30 [PATCH v7 00/31] ext4: use iomap for regular file's buffered I/O path Zhang Yi
2026-10-09 10:30 ` [PATCH v7 01/31] ext4: simplify size updating in ext4_setattr() Zhang Yi
2026-10-09 10:51   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 02/31] ext4: factor out ext4_truncate_[up|down]() Zhang Yi
2026-10-09 10:54   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 03/31] ext4: set EXT4_MAP_NEW flag for delayed allocated blocks Zhang Yi
2026-10-09 10:50   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 04/31] ext4: recheck extent status tree before block allocation Zhang Yi
2026-10-09 10:54   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 05/31] ext4: fix orig_mlen initialization in ext4_map_blocks() Zhang Yi
2026-10-09 10:53   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 06/31] ext4: allow ext4_map_blocks() to start its own transaction handle Zhang Yi
2026-10-09 10:58   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 07/31] ext4: avoid unnecessary transaction in ext4_map_blocks() for unwritten extents Zhang Yi
2026-10-09 10:53   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 08/31] ext4: skip block allocation for holes in the data submission path Zhang Yi
2026-10-09 10:58   ` sashiko-bot
2026-10-10  0:55     ` Zhang Yi
2026-10-09 10:30 ` [PATCH v7 09/31] ext4: add iomap address space operations for buffered I/O Zhang Yi
2026-10-09 10:54   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 10/31] ext4: implement buffered read path using iomap Zhang Yi
2026-10-09 11:07   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 11/31] ext4: pass out extent seq counter when mapping da blocks Zhang Yi
2026-10-09 10:55   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 12/31] ext4: do not use data=ordered mode for inodes using buffered iomap path Zhang Yi
2026-10-09 11:01   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 13/31] ext4: implement buffered write path using iomap Zhang Yi
2026-10-09 11:03   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 14/31] ext4: rework handle credit accounting for unwritten extent conversion Zhang Yi
2026-10-09 11:20   ` sashiko-bot
2026-10-10  2:33     ` Zhang Yi
2026-10-09 10:30 ` [PATCH v7 15/31] ext4: implement writeback path using iomap Zhang Yi
2026-10-09 11:13   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 16/31] ext4: implement mmap " Zhang Yi
2026-10-09 11:10   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 17/31] ext4: implement partial block zero range " Zhang Yi
2026-10-09 11:09   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 18/31] ext4: drain writeback before removing extents on the iomap path Zhang Yi
2026-10-09 11:06   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 19/31] ext4: add block mapping tracepoints for iomap buffered I/O path Zhang Yi
2026-10-09 11:03   ` sashiko-bot
2026-10-10  3:04     ` Zhang Yi
2026-10-09 10:30 ` [PATCH v7 20/31] ext4: disable online defrag when inode using " Zhang Yi
2026-10-09 11:00   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 21/31] ext4: add EXT4_STATE_DISKSIZE_GROW_PENDING state bit and helpers Zhang Yi
2026-10-09 11:04   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 22/31] ext4: submit and wait for pending disksize-grow I/O on writeback Zhang Yi
2026-10-09 11:18   ` sashiko-bot
2026-10-10  3:11     ` Zhang Yi
2026-10-09 10:30 ` [PATCH v7 23/31] ext4: advance i_disksize to i_size upon disksize-grow I/O completion Zhang Yi
2026-10-09 11:19   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 24/31] ext4: defer i_disksize update while DISKSIZE_GROW_PENDING is set Zhang Yi
2026-10-09 11:21   ` sashiko-bot
2026-10-10  3:35     ` Zhang Yi
2026-10-09 10:30 ` [PATCH v7 25/31] ext4: submit and wait for disksize-grow I/O in fallocate paths Zhang Yi
2026-10-09 11:25   ` sashiko-bot
2026-10-09 10:30 ` [PATCH v7 26/31] ext4: clear DISKSIZE_GROW_PENDING on truncate or error Zhang Yi
2026-10-09 11:16   ` sashiko-bot
2026-10-10  4:59     ` Zhang Yi
2026-10-09 10:30 ` [PATCH v7 27/31] ext4: set DISKSIZE_GROW_PENDING after zeroing unaligned EOF block Zhang Yi
2026-10-09 11:21   ` sashiko-bot
2026-10-10  7:21     ` Zhang Yi
2026-10-10  9:00   ` Ojaswin Mujoo
2026-10-10  9:50     ` Zhang Yi
2026-10-10 13:49       ` Ojaswin Mujoo
2026-10-10 15:54         ` Zhang Yi
2026-10-11  9:30           ` Ojaswin Mujoo
2026-10-09 10:30 ` [PATCH v7 28/31] ext4: add tracepoints for DISKSIZE_GROW_PENDING set, clear, and wait Zhang Yi
2026-10-09 11:13   ` sashiko-bot
2026-10-09 10:38 ` [PATCH v7 29/31] ext4: add tracepoints for EOF block zeroing and disksize-grow I/O Zhang Yi
2026-10-09 11:16   ` sashiko-bot
2026-10-09 10:38 ` [PATCH v7 30/31] ext4: partially enable iomap for the buffered I/O path of regular files Zhang Yi
2026-10-09 11:33   ` sashiko-bot
2026-10-10  8:09     ` Zhang Yi [this message]
2026-10-09 10:38 ` [PATCH v7 31/31] ext4: introduce a mount option for iomap buffered I/O path Zhang Yi
2026-10-09 11:17   ` sashiko-bot
2026-10-09 17:54 ` [syzbot ci] Re: ext4: use iomap for regular file's " syzbot ci
2026-10-10  8:44   ` Zhang Yi

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=fe737cea-e80b-401e-b03e-d2eacf7b7fb3@gmail.com \
    --to=yizhang089@gmail.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox