Linux kernel -stable discussions
 help / color / mirror / Atom feed
* [PATCH 5.15.y] ext4: avoid infinite loops caused by residual data
@ 2026-05-06  7:38 Bin Lan
  2026-05-09 12:47 ` Sasha Levin
  0 siblings, 1 reply; 2+ messages in thread
From: Bin Lan @ 2026-05-06  7:38 UTC (permalink / raw)
  To: gregkh, sashal, stable
  Cc: linux-kernel, Edward Adam Davis, syzbot+512459401510e2a9a39f,
	syzbot+1659aaaaa8d9d11265d7, Jan Kara, Theodore Ts'o, stable,
	Bin Lan

From: Edward Adam Davis <eadavis@qq.com>

[ Upstream commit 5422fe71d26d42af6c454ca9527faaad4e677d6c ]

On the mkdir/mknod path, when mapping logical blocks to physical blocks,
if inserting a new extent into the extent tree fails (in this example,
because the file system disabled the huge file feature when marking the
inode as dirty), ext4_ext_map_blocks() only calls ext4_free_blocks() to
reclaim the physical block without deleting the corresponding data in
the extent tree. This causes subsequent mkdir operations to reference
the previously reclaimed physical block number again, even though this
physical block is already being used by the xattr block. Therefore, a
situation arises where both the directory and xattr are using the same
buffer head block in memory simultaneously.

The above causes ext4_xattr_block_set() to enter an infinite loop about
"inserted" and cannot release the inode lock, ultimately leading to the
143s blocking problem mentioned in [1].

If the metadata is corrupted, then trying to remove some extent space
can do even more harm. Also in case EXT4_GET_BLOCKS_DELALLOC_RESERVE
was passed, remove space wrongly update quota information.
Jan Kara suggests distinguishing between two cases:

1) The error is ENOSPC or EDQUOT - in this case the filesystem is fully
consistent and we must maintain its consistency including all the
accounting. However these errors can happen only early before we've
inserted the extent into the extent tree. So current code works correctly
for this case.

2) Some other error - this means metadata is corrupted. We should strive to
do as few modifications as possible to limit damage. So I'd just skip
freeing of allocated blocks.

[1]
INFO: task syz.0.17:5995 blocked for more than 143 seconds.
Call Trace:
 inode_lock_nested include/linux/fs.h:1073 [inline]
 __start_dirop fs/namei.c:2923 [inline]
 start_dirop fs/namei.c:2934 [inline]

Reported-by: syzbot+512459401510e2a9a39f@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=1659aaaaa8d9d11265d7
Tested-by: syzbot+1659aaaaa8d9d11265d7@syzkaller.appspotmail.com
Reported-by: syzbot+1659aaaaa8d9d11265d7@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=512459401510e2a9a39f
Tested-by: syzbot+1659aaaaa8d9d11265d7@syzkaller.appspotmail.com
Signed-off-by: Edward Adam Davis <eadavis@qq.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Tested-by: syzbot+512459401510e2a9a39f@syzkaller.appspotmail.com
Link: https://patch.msgid.link/tencent_43696283A68450B761D76866C6F360E36705@qq.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@kernel.org
[ Minor context conflict resolved. ]
Signed-off-by: Bin Lan <lanbincn@139.com>
---
 fs/ext4/extents.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 80b7783c65b4..b2ab5d849672 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -4377,9 +4377,13 @@ int ext4_ext_map_blocks(handle_t *handle, struct inode *inode,
 
 	err = ext4_ext_insert_extent(handle, inode, &path, &newex, flags);
 	if (err) {
-		if (allocated_clusters) {
+		/*
+		 * Gracefully handle out of space conditions. If the filesystem
+		 * is inconsistent, we'll just leak allocated blocks to avoid
+		 * causing even more damage.
+		 */
+		if (allocated_clusters && (err == -EDQUOT || err == -ENOSPC)) {
 			int fb_flags = 0;
-
 			/*
 			 * free data blocks we just allocated.
 			 * not a good idea to call discard here directly,
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH 5.15.y] ext4: avoid infinite loops caused by residual data
  2026-05-06  7:38 [PATCH 5.15.y] ext4: avoid infinite loops caused by residual data Bin Lan
@ 2026-05-09 12:47 ` Sasha Levin
  0 siblings, 0 replies; 2+ messages in thread
From: Sasha Levin @ 2026-05-09 12:47 UTC (permalink / raw)
  To: gregkh, stable
  Cc: Sasha Levin, linux-kernel, Edward Adam Davis,
	syzbot+512459401510e2a9a39f, syzbot+1659aaaaa8d9d11265d7,
	Jan Kara, Theodore Ts'o, stable, Bin Lan

> [PATCH 5.15.y] ext4: avoid infinite loops caused by residual data

Holding for now.

I had to revert the 6.1.y backport of upstream 5422fe71d26d
(c66545e83a80) on 2026-04-11 (9594622f8a39) as part of a coordinated
revert of the surrounding ppath-removal series, so the fix is no
longer present on 6.1.y. We can't queue it on 5.15.y while it's
missing from 6.1.y - if you want this on 5.15.y, please also send
a 6.1.y backport (and ideally help untangle the ppath-removal-revert
issue there) so the fix is consistent newest-first.

--
Sasha

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-05-09 12:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-06  7:38 [PATCH 5.15.y] ext4: avoid infinite loops caused by residual data Bin Lan
2026-05-09 12:47 ` Sasha Levin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox