* [PATCH] ext4: fix kernel BUG in ext4_write_inline_data_end
@ 2026-06-08 6:52 Aditya Prakash Srivastava
2026-06-09 10:52 ` Jan Kara
2026-06-11 12:35 ` Theodore Ts'o
0 siblings, 2 replies; 4+ messages in thread
From: Aditya Prakash Srivastava @ 2026-06-08 6:52 UTC (permalink / raw)
To: Theodore Ts'o, Andreas Dilger
Cc: Jan Kara, Baokun Li, Ojaswin Mujoo, Ritesh Harjani, Zhang Yi,
linux-ext4, linux-kernel, Aditya Prakash Srivastava,
syzbot+0c89d865531d053abb2d
When the data=journal mount option is used, the ext4_journalled_write_end()
function incorrectly calls ext4_write_inline_data_end() without checking
if the EXT4_STATE_MAY_INLINE_DATA flag is still set on the inode.
If a previous attempt to convert the inline data to an extent failed (e.g.
due to ENOSPC), the EXT4_STATE_MAY_INLINE_DATA flag is cleared, but
the EXT4_INODE_INLINE_DATA flag remains set. In this scenario, the next
call to ext4_write_begin() will not prepare the inline data xattr for
writing, but ext4_journalled_write_end() will incorrectly attempt to write
to it, triggering a BUG_ON(pos + len > EXT4_I(inode)->i_inline_size) in
ext4_write_inline_data() since i_inline_size was not expanded.
Fix this by ensuring that ext4_journalled_write_end() only calls
ext4_write_inline_data_end() if the EXT4_STATE_MAY_INLINE_DATA flag is
set, mirroring the behavior of ext4_write_end() and ext4_da_write_end().
Reported-by: syzbot+0c89d865531d053abb2d@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=0c89d865531d053abb2d
Fixes: 3fdcfb668fd7 ("ext4: add journalled write support for inline data")
Signed-off-by: Aditya Prakash Srivastava <aditya.ansh182@gmail.com>
---
fs/ext4/inode.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index c2c2d6ac7f3d..4fce9ec176f8 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1560,7 +1560,8 @@ static int ext4_journalled_write_end(const struct kiocb *iocb,
BUG_ON(!ext4_handle_valid(handle));
- if (ext4_has_inline_data(inode))
+ if (ext4_has_inline_data(inode) &&
+ ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA))
return ext4_write_inline_data_end(inode, pos, len, copied,
folio);
--
2.47.3
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] ext4: fix kernel BUG in ext4_write_inline_data_end
2026-06-08 6:52 [PATCH] ext4: fix kernel BUG in ext4_write_inline_data_end Aditya Prakash Srivastava
@ 2026-06-09 10:52 ` Jan Kara
2026-06-10 3:16 ` Aditya Prakash Srivastava
2026-06-11 12:35 ` Theodore Ts'o
1 sibling, 1 reply; 4+ messages in thread
From: Jan Kara @ 2026-06-09 10:52 UTC (permalink / raw)
To: Aditya Prakash Srivastava
Cc: Theodore Ts'o, Andreas Dilger, Jan Kara, Baokun Li,
Ojaswin Mujoo, Ritesh Harjani, Zhang Yi, linux-ext4,
linux-kernel, syzbot+0c89d865531d053abb2d
On Mon 08-06-26 06:52:27, Aditya Prakash Srivastava wrote:
> When the data=journal mount option is used, the ext4_journalled_write_end()
> function incorrectly calls ext4_write_inline_data_end() without checking
> if the EXT4_STATE_MAY_INLINE_DATA flag is still set on the inode.
>
> If a previous attempt to convert the inline data to an extent failed (e.g.
> due to ENOSPC), the EXT4_STATE_MAY_INLINE_DATA flag is cleared, but
> the EXT4_INODE_INLINE_DATA flag remains set. In this scenario, the next
> call to ext4_write_begin() will not prepare the inline data xattr for
> writing, but ext4_journalled_write_end() will incorrectly attempt to write
> to it, triggering a BUG_ON(pos + len > EXT4_I(inode)->i_inline_size) in
> ext4_write_inline_data() since i_inline_size was not expanded.
>
> Fix this by ensuring that ext4_journalled_write_end() only calls
> ext4_write_inline_data_end() if the EXT4_STATE_MAY_INLINE_DATA flag is
> set, mirroring the behavior of ext4_write_end() and ext4_da_write_end().
>
> Reported-by: syzbot+0c89d865531d053abb2d@syzkaller.appspotmail.com
> Closes: https://syzkaller.appspot.com/bug?extid=0c89d865531d053abb2d
> Fixes: 3fdcfb668fd7 ("ext4: add journalled write support for inline data")
> Signed-off-by: Aditya Prakash Srivastava <aditya.ansh182@gmail.com>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/ext4/inode.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index c2c2d6ac7f3d..4fce9ec176f8 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -1560,7 +1560,8 @@ static int ext4_journalled_write_end(const struct kiocb *iocb,
>
> BUG_ON(!ext4_handle_valid(handle));
>
> - if (ext4_has_inline_data(inode))
> + if (ext4_has_inline_data(inode) &&
> + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA))
> return ext4_write_inline_data_end(inode, pos, len, copied,
> folio);
>
> --
> 2.47.3
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] ext4: fix kernel BUG in ext4_write_inline_data_end
2026-06-09 10:52 ` Jan Kara
@ 2026-06-10 3:16 ` Aditya Prakash Srivastava
0 siblings, 0 replies; 4+ messages in thread
From: Aditya Prakash Srivastava @ 2026-06-10 3:16 UTC (permalink / raw)
To: Jan Kara
Cc: Theodore Ts'o, Andreas Dilger, Baokun Li, Ojaswin Mujoo,
Ritesh Harjani, Zhang Yi, linux-ext4, linux-kernel,
syzbot+0c89d865531d053abb2d
Hi Jan,
Thank you for the review and for the Reviewed-by tag!
Best regards,
Aditya Prakash Srivastava
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] ext4: fix kernel BUG in ext4_write_inline_data_end
2026-06-08 6:52 [PATCH] ext4: fix kernel BUG in ext4_write_inline_data_end Aditya Prakash Srivastava
2026-06-09 10:52 ` Jan Kara
@ 2026-06-11 12:35 ` Theodore Ts'o
1 sibling, 0 replies; 4+ messages in thread
From: Theodore Ts'o @ 2026-06-11 12:35 UTC (permalink / raw)
To: Ext4 Developers List, Andreas Dilger, Aditya Prakash Srivastava
Cc: Theodore Ts'o, Jan Kara, Baokun Li, Ojaswin Mujoo,
Ritesh Harjani, Zhang Yi, linux-kernel,
syzbot+0c89d865531d053abb2d
On Mon, 08 Jun 2026 06:52:27 +0000, Aditya Prakash Srivastava wrote:
> When the data=journal mount option is used, the ext4_journalled_write_end()
> function incorrectly calls ext4_write_inline_data_end() without checking
> if the EXT4_STATE_MAY_INLINE_DATA flag is still set on the inode.
>
> If a previous attempt to convert the inline data to an extent failed (e.g.
> due to ENOSPC), the EXT4_STATE_MAY_INLINE_DATA flag is cleared, but
> the EXT4_INODE_INLINE_DATA flag remains set. In this scenario, the next
> call to ext4_write_begin() will not prepare the inline data xattr for
> writing, but ext4_journalled_write_end() will incorrectly attempt to write
> to it, triggering a BUG_ON(pos + len > EXT4_I(inode)->i_inline_size) in
> ext4_write_inline_data() since i_inline_size was not expanded.
>
> [...]
Applied, thanks!
[1/1] ext4: fix kernel BUG in ext4_write_inline_data_end
commit: ad09aa45965d3fafaf9963bc78109b73c0f9ac8d
Best regards,
--
Theodore Ts'o <tytso@mit.edu>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-06-11 12:39 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-08 6:52 [PATCH] ext4: fix kernel BUG in ext4_write_inline_data_end Aditya Prakash Srivastava
2026-06-09 10:52 ` Jan Kara
2026-06-10 3:16 ` Aditya Prakash Srivastava
2026-06-11 12:35 ` Theodore Ts'o
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®