[PATCH v2] xfs: add check before calling xfs_mod_fdblocks

Shida Zhang posted 1 patch 3 years, 10 months ago
There is a newer version of this series
fs/xfs/libxfs/xfs_ag_resv.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
[PATCH v2] xfs: add check before calling xfs_mod_fdblocks
Posted by Shida Zhang 3 years, 10 months ago
Checks are missing when delta equals 0 in __xfs_ag_resv_free() and
__xfs_ag_resv_init().

Signed-off-by: Shida Zhang <zhangshida@kylinos.cn>
---
 Changes from v1:
 -Add checks before calling xfs_mod_fdblocks instead.

 fs/xfs/libxfs/xfs_ag_resv.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c
index fe94058d4e9e..c8fa032e4b00 100644
--- a/fs/xfs/libxfs/xfs_ag_resv.c
+++ b/fs/xfs/libxfs/xfs_ag_resv.c
@@ -149,7 +149,12 @@ __xfs_ag_resv_free(
 		oldresv = resv->ar_orig_reserved;
 	else
 		oldresv = resv->ar_reserved;
-	error = xfs_mod_fdblocks(pag->pag_mount, oldresv, true);
+
+	if (oldresv)
+		error = xfs_mod_fdblocks(pag->pag_mount, oldresv, true);
+	else
+		error = 0;
+
 	resv->ar_reserved = 0;
 	resv->ar_asked = 0;
 	resv->ar_orig_reserved = 0;
@@ -215,8 +220,13 @@ __xfs_ag_resv_init(
 
 	if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_AG_RESV_FAIL))
 		error = -ENOSPC;
-	else
-		error = xfs_mod_fdblocks(mp, -(int64_t)hidden_space, true);
+	else {
+		error = 0;
+		if (hidden_space)
+			error = xfs_mod_fdblocks(mp, -(int64_t)hidden_space,
+						true);
+	}
+
 	if (error) {
 		trace_xfs_ag_resv_init_error(pag->pag_mount, pag->pag_agno,
 				error, _RET_IP_);
-- 
2.25.1
Re: [PATCH v2] xfs: add check before calling xfs_mod_fdblocks
Posted by Dave Chinner 3 years, 10 months ago
On Tue, Jun 21, 2022 at 03:02:24PM +0800, Shida Zhang wrote:
> Checks are missing when delta equals 0 in __xfs_ag_resv_free() and
> __xfs_ag_resv_init().

This describes what the patch does, not the problem being solved is. 

i.e. This doesn't tell the reader why the delta can be zero in these
places, nor does it tell them what the impact of it being zero is.
We can't use this information to identify a system that is having
problems due to this issue because they havent' been described.

Hence when I ask for more detail about how something occurs, what I'm
asking for is a description of the how the problem was found, what
the impact of the problem has on systems, how the problem is
reproduced, etc.

Something led you to finding this problem - tell us the story so we
also know what you know and so can understand why the change needs
to be made. A good commit description tells the reader everything
you know about the problem that needs to be fixed, the code change
itself will then describe how the problem was fixed...

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com
Re: [PATCH v2] xfs: add check before calling xfs_mod_fdblocks
Posted by Stephen Zhang 3 years, 10 months ago
Dave Chinner <david@fromorbit.com> 于2022年6月21日周二 15:39写道:
>
> On Tue, Jun 21, 2022 at 03:02:24PM +0800, Shida Zhang wrote:
> > Checks are missing when delta equals 0 in __xfs_ag_resv_free() and
> > __xfs_ag_resv_init().
>
> This describes what the patch does, not the problem being solved is.
>
> i.e. This doesn't tell the reader why the delta can be zero in these
> places, nor does it tell them what the impact of it being zero is.
> We can't use this information to identify a system that is having
> problems due to this issue because they havent' been described.
>
> Hence when I ask for more detail about how something occurs, what I'm
> asking for is a description of the how the problem was found, what
> the impact of the problem has on systems, how the problem is
> reproduced, etc.
>
> Something led you to finding this problem - tell us the story so we
> also know what you know and so can understand why the change needs
> to be made. A good commit description tells the reader everything
> you know about the problem that needs to be fixed, the code change
> itself will then describe how the problem was fixed...
>
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@fromorbit.com

Thanks for your suggestion. I will try to rephrase the description.

Cheers,

Stephen.
Re: [PATCH v2] xfs: add check before calling xfs_mod_fdblocks
Posted by Stephen Zhang 3 years, 10 months ago
Shida Zhang <starzhangzsd@gmail.com> 于2022年6月21日周二 15:02写道:
>
> Checks are missing when delta equals 0 in __xfs_ag_resv_free() and
> __xfs_ag_resv_init().
>
> Signed-off-by: Shida Zhang <zhangshida@kylinos.cn>
> ---
>  Changes from v1:
>  -Add checks before calling xfs_mod_fdblocks instead.
>
>  fs/xfs/libxfs/xfs_ag_resv.c | 16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c
> index fe94058d4e9e..c8fa032e4b00 100644
> --- a/fs/xfs/libxfs/xfs_ag_resv.c
> +++ b/fs/xfs/libxfs/xfs_ag_resv.c
> @@ -149,7 +149,12 @@ __xfs_ag_resv_free(
>                 oldresv = resv->ar_orig_reserved;
>         else
>                 oldresv = resv->ar_reserved;
> -       error = xfs_mod_fdblocks(pag->pag_mount, oldresv, true);
> +
> +       if (oldresv)
> +               error = xfs_mod_fdblocks(pag->pag_mount, oldresv, true);
> +       else
> +               error = 0;
> +
>         resv->ar_reserved = 0;
>         resv->ar_asked = 0;
>         resv->ar_orig_reserved = 0;
> @@ -215,8 +220,13 @@ __xfs_ag_resv_init(
>
>         if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_AG_RESV_FAIL))
>                 error = -ENOSPC;
> -       else
> -               error = xfs_mod_fdblocks(mp, -(int64_t)hidden_space, true);
> +       else {
> +               error = 0;
> +               if (hidden_space)
> +                       error = xfs_mod_fdblocks(mp, -(int64_t)hidden_space,
> +                                               true);
> +       }
> +
>         if (error) {
>                 trace_xfs_ag_resv_init_error(pag->pag_mount, pag->pag_agno,
>                                 error, _RET_IP_);
> --
> 2.25.1
>

And the code path that lead delta = 0 is shown below:

=> xfs_mod_freecounter+0x84/0x2b8
=> __xfs_ag_resv_free+0xc4/0x188
=> xfs_ag_resv_free+0x24/0x50
=> xfs_fs_unreserve_ag_blocks+0x40/0x160
=> xfs_mountfs+0x500/0x900
=> xfs_fs_fill_super+0x3d8/0x810
=> get_tree_bdev+0x164/0x258
=> xfs_fs_get_tree+0x20/0x30
=> vfs_get_tree+0x30/0xf8
=> path_mount+0x3c4/0xa58
=> do_mount+0x74/0x98

=> xfs_mod_freecounter+0x84/0x2b8
=> __xfs_ag_resv_init+0x64/0x1d0
=> xfs_ag_resv_init+0x108/0x1c8
=> xfs_fs_reserve_ag_blocks+0x4c/0x110
=> xfs_mountfs+0x57c/0x900
=> xfs_fs_fill_super+0x3d8/0x810
=> get_tree_bdev+0x164/0x258
=> xfs_fs_get_tree+0x20/0x30
=> vfs_get_tree+0x30/0xf8
=> path_mount+0x3c4/0xa58
=> do_mount+0x74/0x98