Re: [PATCH v2] xfs: add check before calling xfs_mod_fdblocks

From: Stephen Zhang
Date: Tue Jun 21 2022 - 03:23:43 EST


Shida Zhang <starzhangzsd@xxxxxxxxx> 于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@xxxxxxxxxx>
> ---
> 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