* [PATCH] ext4: don't use the kiocb after a direct read was queued
@ 2026-11-13 19:05 Christian Brauner
2026-11-13 19:15 ` sashiko-bot
0 siblings, 1 reply; 2+ messages in thread
From: Christian Brauner @ 2026-11-13 19:05 UTC (permalink / raw)
To: Theodore Ts'o, Jan Kara, linux-ext4
Cc: linux-fsdevel, Christian Brauner (Amutable)
ext4_dio_read_iter() calls file_accessed(iocb->ki_filp) after it
submitted the direct read. But once the read was queued the kiocb
belongs to the completion handler. If the read completes before
ext4_dio_read_iter() gets to file_accessed() and the completion handler
frees the kiocb it reads freed memory.
aio and io_uring hold a reference to the kiocb until the submission
returned so they don't have that problem. The fileio backend of the
scsi target with fd_async_io=1 frees the kiocb in the completion
handler:
BUG: KASAN: slab-use-after-free in ext4_dio_read_iter+0x5e1/0x690
Workqueue: target_submission target_queued_submit_work
Call Trace:
<TASK>
dump_stack_lvl+0x5d/0x80
print_report+0x14b/0x4b0
kasan_report+0x108/0x130
ext4_dio_read_iter+0x5e1/0x690
fd_execute_rw+0xd30/0x1700
__target_execute_cmd+0x53/0x190
transport_generic_new_cmd+0x65a/0xdb0
__target_submit+0x12c/0x380
target_queued_submit_work+0x73/0x270
process_one_work+0x946/0x1820
worker_thread+0x4f1/0xd60
kthread+0x364/0x460
ret_from_fork+0x525/0x770
ret_from_fork_asm+0x1a/0x30
</TASK>
Allocated by task 59:
__kmalloc_noprof+0x223/0x830
fd_execute_rw+0x766/0x1700
__target_execute_cmd+0x53/0x190
transport_generic_new_cmd+0x65a/0xdb0
__target_submit+0x12c/0x380
target_queued_submit_work+0x73/0x270
Freed by task 14:
kfree+0x267/0x6a0
blk_update_request+0x3f5/0x1260
blk_mq_end_request+0x59/0x450
blk_complete_reqs+0xb0/0x130
handle_softirqs+0x20c/0x860
run_ksoftirqd+0x31/0x60
Remember the file before the read is submitted. xfs avoids the same
problem by calling file_accessed() before it submits the read.
Fixes: b1b4705d54ab ("ext4: introduce direct I/O read using iomap infrastructure")
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
I hit this on v7.4-rc1 while testing the fileio backend of the scsi
target with fd_async_io=1 and the backing file on ext4. KASAN reliably
fires on the first direct reads through the LUN.
The fileio backend gets a fix as well so it doesn't free its kiocb under
the filesystem anymore. But ext4 shouldn't use the kiocb after the read
was queued either.
---
fs/ext4/file.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index 50d3c92709c8b..aefaeb2c51316 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -68,8 +68,9 @@ static bool ext4_should_use_dio(struct kiocb *iocb, struct iov_iter *iter)
static ssize_t ext4_dio_read_iter(struct kiocb *iocb, struct iov_iter *to)
{
+ struct file *file = iocb->ki_filp;
+ struct inode *inode = file_inode(file);
ssize_t ret;
- struct inode *inode = file_inode(iocb->ki_filp);
if (iocb->ki_flags & IOCB_NOWAIT) {
if (!inode_trylock_shared(inode))
@@ -96,7 +97,8 @@ static ssize_t ext4_dio_read_iter(struct kiocb *iocb, struct iov_iter *to)
ret = iomap_dio_rw(iocb, to, &ext4_iomap_ops, NULL, 0, NULL, 0);
inode_unlock_shared(inode);
- file_accessed(iocb->ki_filp);
+ /* The kiocb may be gone once the read was queued. */
+ file_accessed(file);
return ret;
}
---
base-commit: 6628e7d4c6b25c8d18f1345e3a20d21829aae7e4
change-id: 20261113-work-ext4-dio_read_kiocb-146d8f00da12
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] ext4: don't use the kiocb after a direct read was queued
2026-11-13 19:05 [PATCH] ext4: don't use the kiocb after a direct read was queued Christian Brauner
@ 2026-11-13 19:15 ` sashiko-bot
0 siblings, 0 replies; 2+ messages in thread
From: sashiko-bot @ 2026-11-13 19:15 UTC (permalink / raw)
To: Christian Brauner, linux-ext4; +Cc: tytso
> ext4_dio_read_iter() calls file_accessed(iocb->ki_filp) after it
> submitted the direct read. But once the read was queued the kiocb
> belongs to the completion handler. If the read completes before
> ext4_dio_read_iter() gets to file_accessed() and the completion handler
> frees the kiocb it reads freed memory.
>
> aio and io_uring hold a reference to the kiocb until the submission
> returned so they don't have that problem. The fileio backend of the
> scsi target with fd_async_io=1 frees the kiocb in the completion
> handler:
>
> BUG: KASAN: slab-use-after-free in ext4_dio_read_iter+0x5e1/0x690
> Workqueue: target_submission target_queued_submit_work
> Call Trace:
> <TASK>
> [ ... ]
> Remember the file before the read is submitted. xfs avoids the same
> problem by calling file_accessed() before it submits the read.
>
> Fixes: b1b4705d54ab ("ext4: introduce direct I/O read using iomap infrastructure")
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Sashiko has reviewed this patch and found no issues.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261113-work-ext4-dio_read_kiocb-v1-1-172a88be803c@kernel.org?part=1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-11-13 19:15 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-13 19:05 [PATCH] ext4: don't use the kiocb after a direct read was queued Christian Brauner
2026-11-13 19:15 ` sashiko-bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox