On Tue 07-02-23 15:09:31, zhanchengbin wrote: > Inside the ext4_ext_insert_extent function, every error returned will > not destroy the consistency of the tree. Even if it fails after changing > half of the tree, can also ensure that the tree is self-consistent, like > function ext4_ext_create_new_leaf. Hum, but e.g. if ext4_ext_correct_indexes() fails, we *will* end up with corrupted extent tree pretty much without a chance for recovery, won't we? Honza > After ext4_ext_insert_extent fails, update extent status tree depends on > the incoming split_flag. So restore the len of extent to be split when > ext4_ext_insert_extent return failed in ext4_split_extent_at. > > Signed-off-by: zhanchengbin <zhanchengbin1@xxxxxxxxxx> > Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx> > --- > fs/ext4/extents.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c > index 3559ea6b0781..b926fef73de4 100644 > --- a/fs/ext4/extents.c > +++ b/fs/ext4/extents.c > @@ -935,6 +935,7 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block, > > bh = read_extent_tree_block(inode, path[ppos].p_idx, --i, flags); > if (IS_ERR(bh)) { > + EXT4_ERROR_INODE(inode, "IO error reading extent block"); > ret = PTR_ERR(bh); > goto err; > } > @@ -3251,7 +3252,7 @@ static int ext4_split_extent_at(handle_t *handle, > ext4_ext_mark_unwritten(ex2); > > err = ext4_ext_insert_extent(handle, inode, ppath, &newex, flags); > - if (err != -ENOSPC && err != -EDQUOT && err != -ENOMEM) > + if (!err) > goto out; > > if (EXT4_EXT_MAY_ZEROOUT & split_flag) { > -- > 2.31.1 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR