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