Skip to content

Commit 20e41d9

Browse files
committed
Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4
Pull ext4 fixes from Ted Ts'o: "Miscellaneous ext4 bug fixes" * tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: ext4: Only advertise encrypted_casefold when encryption and unicode are enabled ext4: fix no-key deletion for encrypt+casefold ext4: fix memory leak in ext4_fill_super ext4: fix fast commit alignment issues ext4: fix bug on in ext4_es_cache_extent as ext4_split_extent_at failed ext4: fix accessing uninit percpu counter variable with fast_commit ext4: fix memory leak in ext4_mb_init_backend on error path.
2 parents decad3e + e71f99f commit 20e41d9

File tree

8 files changed

+135
-126
lines changed

8 files changed

+135
-126
lines changed

fs/ext4/extents.c

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3206,7 +3206,10 @@ static int ext4_split_extent_at(handle_t *handle,
32063206
ext4_ext_mark_unwritten(ex2);
32073207

32083208
err = ext4_ext_insert_extent(handle, inode, ppath, &newex, flags);
3209-
if (err == -ENOSPC && (EXT4_EXT_MAY_ZEROOUT & split_flag)) {
3209+
if (err != -ENOSPC && err != -EDQUOT)
3210+
goto out;
3211+
3212+
if (EXT4_EXT_MAY_ZEROOUT & split_flag) {
32103213
if (split_flag & (EXT4_EXT_DATA_VALID1|EXT4_EXT_DATA_VALID2)) {
32113214
if (split_flag & EXT4_EXT_DATA_VALID1) {
32123215
err = ext4_ext_zeroout(inode, ex2);
@@ -3232,25 +3235,22 @@ static int ext4_split_extent_at(handle_t *handle,
32323235
ext4_ext_pblock(&orig_ex));
32333236
}
32343237

3235-
if (err)
3236-
goto fix_extent_len;
3237-
/* update the extent length and mark as initialized */
3238-
ex->ee_len = cpu_to_le16(ee_len);
3239-
ext4_ext_try_to_merge(handle, inode, path, ex);
3240-
err = ext4_ext_dirty(handle, inode, path + path->p_depth);
3241-
if (err)
3242-
goto fix_extent_len;
3243-
3244-
/* update extent status tree */
3245-
err = ext4_zeroout_es(inode, &zero_ex);
3246-
3247-
goto out;
3248-
} else if (err)
3249-
goto fix_extent_len;
3250-
3251-
out:
3252-
ext4_ext_show_leaf(inode, path);
3253-
return err;
3238+
if (!err) {
3239+
/* update the extent length and mark as initialized */
3240+
ex->ee_len = cpu_to_le16(ee_len);
3241+
ext4_ext_try_to_merge(handle, inode, path, ex);
3242+
err = ext4_ext_dirty(handle, inode, path + path->p_depth);
3243+
if (!err)
3244+
/* update extent status tree */
3245+
err = ext4_zeroout_es(inode, &zero_ex);
3246+
/* If we failed at this point, we don't know in which
3247+
* state the extent tree exactly is so don't try to fix
3248+
* length of the original extent as it may do even more
3249+
* damage.
3250+
*/
3251+
goto out;
3252+
}
3253+
}
32543254

32553255
fix_extent_len:
32563256
ex->ee_len = orig_ex.ee_len;
@@ -3260,6 +3260,9 @@ static int ext4_split_extent_at(handle_t *handle,
32603260
*/
32613261
ext4_ext_dirty(handle, inode, path + path->p_depth);
32623262
return err;
3263+
out:
3264+
ext4_ext_show_leaf(inode, path);
3265+
return err;
32633266
}
32643267

32653268
/*

0 commit comments

Comments
 (0)