Message ID | 20210903062748.4118886-3-yangerkun@huawei.com |
---|---|
State | Awaiting Upstream |
Headers | show |
Series | bugfix for insert/collapse fallocate | expand |
On Fri 03-09-21 14:27:47, yangerkun wrote: > Like ext4_ext_rm_leaf, we can ensure enough credits before every call > that will consume credits. This can remove ext4_access_path which only > used in ext4_ext_shift_path_extents. It's a prepare patch for the next > bugfix patch. > > Signed-off-by: yangerkun <yangerkun@huawei.com> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > --- > fs/ext4/extents.c | 49 +++++++++++++++-------------------------------- > 1 file changed, 15 insertions(+), 34 deletions(-) > > diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c > index 7ae32078b48f..a6fb0350f062 100644 > --- a/fs/ext4/extents.c > +++ b/fs/ext4/extents.c > @@ -4974,36 +4974,6 @@ int ext4_get_es_cache(struct inode *inode, struct fiemap_extent_info *fieinfo, > return ext4_fill_es_cache_info(inode, start_blk, len_blks, fieinfo); > } > > -/* > - * ext4_access_path: > - * Function to access the path buffer for marking it dirty. > - * It also checks if there are sufficient credits left in the journal handle > - * to update path. > - */ > -static int > -ext4_access_path(handle_t *handle, struct inode *inode, > - struct ext4_ext_path *path) > -{ > - int credits, err; > - > - if (!ext4_handle_valid(handle)) > - return 0; > - > - /* > - * Check if need to extend journal credits > - * 3 for leaf, sb, and inode plus 2 (bmap and group > - * descriptor) for each block group; assume two block > - * groups > - */ > - credits = ext4_writepage_trans_blocks(inode); > - err = ext4_datasem_ensure_credits(handle, inode, 7, credits, 0); > - if (err < 0) > - return err; > - > - err = ext4_ext_get_access(handle, inode, path); > - return err; > -} > - > /* > * ext4_ext_shift_path_extents: > * Shift the extents of a path structure lying between path[depth].p_ext > @@ -5018,6 +4988,7 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, > int depth, err = 0; > struct ext4_extent *ex_start, *ex_last; > bool update = false; > + int credits, restart_credits; > depth = path->p_depth; > > while (depth >= 0) { > @@ -5027,13 +4998,23 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, > return -EFSCORRUPTED; > > ex_last = EXT_LAST_EXTENT(path[depth].p_hdr); > + /* leaf + sb + inode */ > + credits = 3; > + if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) { > + update = true; > + /* extent tree + sb + inode */ > + credits = depth + 2; > + } > > - err = ext4_access_path(handle, inode, path + depth); > + restart_credits = ext4_writepage_trans_blocks(inode); > + err = ext4_datasem_ensure_credits(handle, inode, credits, > + restart_credits, 0); > if (err) > goto out; > > - if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) > - update = true; > + err = ext4_ext_get_access(handle, inode, path + depth); > + if (err) > + goto out; > > while (ex_start <= ex_last) { > if (SHIFT == SHIFT_LEFT) { > @@ -5064,7 +5045,7 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, > } > > /* Update index too */ > - err = ext4_access_path(handle, inode, path + depth); > + err = ext4_ext_get_access(handle, inode, path + depth); > if (err) > goto out; > > -- > 2.31.1 >
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 7ae32078b48f..a6fb0350f062 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4974,36 +4974,6 @@ int ext4_get_es_cache(struct inode *inode, struct fiemap_extent_info *fieinfo, return ext4_fill_es_cache_info(inode, start_blk, len_blks, fieinfo); } -/* - * ext4_access_path: - * Function to access the path buffer for marking it dirty. - * It also checks if there are sufficient credits left in the journal handle - * to update path. - */ -static int -ext4_access_path(handle_t *handle, struct inode *inode, - struct ext4_ext_path *path) -{ - int credits, err; - - if (!ext4_handle_valid(handle)) - return 0; - - /* - * Check if need to extend journal credits - * 3 for leaf, sb, and inode plus 2 (bmap and group - * descriptor) for each block group; assume two block - * groups - */ - credits = ext4_writepage_trans_blocks(inode); - err = ext4_datasem_ensure_credits(handle, inode, 7, credits, 0); - if (err < 0) - return err; - - err = ext4_ext_get_access(handle, inode, path); - return err; -} - /* * ext4_ext_shift_path_extents: * Shift the extents of a path structure lying between path[depth].p_ext @@ -5018,6 +4988,7 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, int depth, err = 0; struct ext4_extent *ex_start, *ex_last; bool update = false; + int credits, restart_credits; depth = path->p_depth; while (depth >= 0) { @@ -5027,13 +4998,23 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, return -EFSCORRUPTED; ex_last = EXT_LAST_EXTENT(path[depth].p_hdr); + /* leaf + sb + inode */ + credits = 3; + if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) { + update = true; + /* extent tree + sb + inode */ + credits = depth + 2; + } - err = ext4_access_path(handle, inode, path + depth); + restart_credits = ext4_writepage_trans_blocks(inode); + err = ext4_datasem_ensure_credits(handle, inode, credits, + restart_credits, 0); if (err) goto out; - if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) - update = true; + err = ext4_ext_get_access(handle, inode, path + depth); + if (err) + goto out; while (ex_start <= ex_last) { if (SHIFT == SHIFT_LEFT) { @@ -5064,7 +5045,7 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, } /* Update index too */ - err = ext4_access_path(handle, inode, path + depth); + err = ext4_ext_get_access(handle, inode, path + depth); if (err) goto out;
Like ext4_ext_rm_leaf, we can ensure enough credits before every call that will consume credits. This can remove ext4_access_path which only used in ext4_ext_shift_path_extents. It's a prepare patch for the next bugfix patch. Signed-off-by: yangerkun <yangerkun@huawei.com> --- fs/ext4/extents.c | 49 +++++++++++++++-------------------------------- 1 file changed, 15 insertions(+), 34 deletions(-)