[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20220621084238.1235880-1-zhangshida@kylinos.cn>
Date: Tue, 21 Jun 2022 16:42:38 +0800
From: Shida Zhang <starzhangzsd@...il.com>
To: djwong@...nel.org, dchinner@...hat.com
Cc: zhangshida@...inos.cn, starzhangzsd@...il.com,
linux-kernel@...r.kernel.org, linux-xfs@...r.kernel.org
Subject: [PATCH v3] xfs: add check before calling xfs_mod_fdblocks
Checks are missing when delta equals 0 in __xfs_ag_resv_free() and
__xfs_ag_resv_init().
the case that the delta equals 0 is reachable with the command
sequence below:
# mkfs.xfs -f /dev/sdb5
# mount /dev/sdb5 /mnt/scratch/
where /dev/sdb5 is my disk for test. And if the patch below is
applied:
====
xfs_mod_freecounter(
if (rsvd)
ASSERT(has_resv_pool);
+ if (delta == 0)
+ dump_stack();
+
if (delta > 0) {
/*
* If the reserve pool is depleted, put blocks back into it
====
the following stack will be shown in the message:
=> 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
After applying this patch, we can avoid to call xfs_mod_fdblocks when
delta equals 0.
Signed-off-by: Shida Zhang <zhangshida@...inos.cn>
---
Changes from v1:
-Add checks before calling xfs_mod_fdblocks instead.
Changes from v2:
-Rephrase the commit description.
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
Powered by blists - more mailing lists