lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ