[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210930162135.GB17404@quack2.suse.cz>
Date: Thu, 30 Sep 2021 18:21:35 +0200
From: Jan Kara <jack@...e.cz>
To: yangerkun <yangerkun@...wei.com>
Cc: tytso@....edu, jack@...e.cz, linux-ext4@...r.kernel.org,
yukuai3@...wei.com
Subject: Re: [PATCH 2/3] ext4: ensure enough credits in
ext4_ext_shift_path_extents
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@...wei.com>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@...e.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
>
--
Jan Kara <jack@...e.com>
SUSE Labs, CR
Powered by blists - more mailing lists