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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux