| From 79b592e8f1b435796cbc2722190368e3e8ffd7a1 Mon Sep 17 00:00:00 2001 |
| From: Zhang Yi <yi.zhang@huawei.com> |
| Date: Sat, 29 Nov 2025 18:32:39 +0800 |
| Subject: ext4: drop extent cache when splitting extent fails |
| |
| From: Zhang Yi <yi.zhang@huawei.com> |
| |
| commit 79b592e8f1b435796cbc2722190368e3e8ffd7a1 upstream. |
| |
| When the split extent fails, we might leave some extents still being |
| processed and return an error directly, which will result in stale |
| extent entries remaining in the extent status tree. So drop all of the |
| remaining potentially stale extents if the splitting fails. |
| |
| Signed-off-by: Zhang Yi <yi.zhang@huawei.com> |
| Reviewed-by: Baokun Li <libaokun1@huawei.com> |
| Cc: stable@kernel.org |
| Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com> |
| Message-ID: <20251129103247.686136-8-yi.zhang@huaweicloud.com> |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/ext4/extents.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/fs/ext4/extents.c |
| +++ b/fs/ext4/extents.c |
| @@ -3267,7 +3267,7 @@ static struct ext4_ext_path *ext4_split_ |
| |
| err = PTR_ERR(path); |
| if (err != -ENOSPC && err != -EDQUOT && err != -ENOMEM) |
| - return path; |
| + goto out_path; |
| |
| /* |
| * Get a new path to try to zeroout or fix the extent length. |
| @@ -3281,7 +3281,7 @@ static struct ext4_ext_path *ext4_split_ |
| if (IS_ERR(path)) { |
| EXT4_ERROR_INODE(inode, "Failed split extent on %u, err %ld", |
| split, PTR_ERR(path)); |
| - return path; |
| + goto out_path; |
| } |
| depth = ext_depth(inode); |
| ex = path[depth].p_ext; |
| @@ -3358,6 +3358,10 @@ out: |
| ext4_free_ext_path(path); |
| path = ERR_PTR(err); |
| } |
| +out_path: |
| + if (IS_ERR(path)) |
| + /* Remove all remaining potentially stale extents. */ |
| + ext4_es_remove_extent(inode, ee_block, ee_len); |
| ext4_ext_show_leaf(inode, path); |
| return path; |
| } |