diff mbox series

[2/3] ext4: ensure enough credits in ext4_ext_shift_path_extents

Message ID 20210903062748.4118886-3-yangerkun@huawei.com
State Awaiting Upstream
Headers show
Series bugfix for insert/collapse fallocate | expand

Commit Message

yangerkun Sept. 3, 2021, 6:27 a.m. UTC
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(-)

Comments

Jan Kara Sept. 30, 2021, 4:21 p.m. UTC | #1
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 mbox series

Patch

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;