From d1b7a268a4d5f47e6e8d1ed9f2d44c61ba9103a2 Mon Sep 17 00:00:00 2001
From: Long Li <leo.lilong@huawei.com>
Date: Fri, 7 Jul 2023 17:01:52 +0800
Subject: [PATCH] xfs_repair: fix warn in xfs_buf_find when growfs fails
 
The kernel does not update secondary superblock through transactions, so
the atomicity of secondary sb cannot be guaranteed. If IO failures are
encountered during the growfs, secondary superblocks and primary superblock
will be inconsistent, and xfs_repair may update the old data in secondary
superblocks to primary superblock. This will cause sb_dblocks to be less
than the actual value and trigger the following warning.
 
When checking whether secondary superblocks and primary superblock are
consistent, do not judge the fields that will change during growfs in
superblock.
 
XFS (sdb): Starting recovery (logdev: internal)
XFS (sdb): xfs_buf_find: daddr 0xf00001 out of range, EOFS 0xeec208
------------[ cut here ]------------
WARNING: CPU: 2 PID: 54142 at fs/xfs/xfs_buf.c:615 xfs_buf_find+0x268a/0x2f90 fs/xfs/xfs_buf.c:612
Modules linked in:
CPU: 2 PID: 54142 Comm: mount Not tainted 5.10.0-02690-g9edb619c0692 #24
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014
RIP: 0010:xfs_buf_find+0x268a/0x2f90 fs/xfs/xfs_buf.c:615
Code: 01 e8 aa 1e 16 ff 49 89 d8 4c 89 e1 4c 89 ef 48 c7 c2 a0 c2 02 af 48 c7 c6 e0 b8 02 af e8 16 dc a2 02 48 83 05 3e 56 00 09 01 <0f> 0b 48 83 05 3c 56 00 09 01 48 83 05 3c 56 00 09 01 41 bc 8b ff
RSP: 0018:ffff88811c6b7138 EFLAGS: 00010202
RAX: 0000000000000000 RBX: 0000000000eec208 RCX: 0000000000000000
RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffed10238d6e17
RBP: ffff88811c6b72b8 R08: ffff88810168c000 R09: 0000000000000001
R10: ffff8881f6738427 R11: ffffed103ece7084 R12: 0000000000f00001
R13: ffff88812fe44000 R14: ffff88810da77418 R15: 0000000000000001
FS:  00007f9ef08e0080(0000) GS:ffff8881f6700000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 0000564ec77273d0 CR3: 000000011ba20005 CR4: 0000000000370ee0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
 xfs_buf_get_map+0xc3/0xa20 fs/xfs/xfs_buf.c:717
 xfs_buf_read_map+0xd1/0xbe0 fs/xfs/xfs_buf.c:832
 xfs_buf_readahead_map+0x185/0x1c0 fs/xfs/xfs_buf.c:913
 xfs_buf_readahead fs/xfs/xfs_buf.h:249 [inline]
 xlog_buf_readahead+0x13d/0x160 fs/xfs/xfs_log_recover.c:1921
 xlog_recover_buf_ra_pass2+0xad/0xf0 fs/xfs/xfs_buf_item_recover.c:177
 xlog_recover_commit_trans+0x3bb/0xec0 fs/xfs/xfs_log_recover.c:2003
 xlog_recovery_process_trans+0x1de/0x290 fs/xfs/xfs_log_recover.c:2256
 xlog_recover_process_ophdr+0x205/0x4c0 fs/xfs/xfs_log_recover.c:2402
 xlog_recover_process_data+0x1dc/0x620 fs/xfs/xfs_log_recover.c:2444
 xlog_recover_process+0x296/0x390 fs/xfs/xfs_log_recover.c:2892
 xlog_do_recovery_pass+0x7fb/0x13e0 fs/xfs/xfs_log_recover.c:3178
 xlog_do_log_recovery+0xf8/0x170 fs/xfs/xfs_log_recover.c:3258
 xlog_do_recover+0x118/0x810 fs/xfs/xfs_log_recover.c:3286
 xlog_recover+0x2d1/0x5d0 fs/xfs/xfs_log_recover.c:3420
 xfs_log_mount+0x40f/0xa00 fs/xfs/xfs_log.c:713
 xfs_mountfs+0x12f5/0x2390 fs/xfs/xfs_mount.c:905
 xfs_fc_fill_super+0x1482/0x1f80 fs/xfs/xfs_super.c:1684
 get_tree_bdev+0x4ba/0x890 fs/super.c:1345
 xfs_fc_get_tree+0x20/0x30 fs/xfs/xfs_super.c:1731
 vfs_get_tree+0x96/0x390 fs/super.c:1550
 do_new_mount fs/namespace.c:2900 [inline]
 path_mount+0x7b0/0x2430 fs/namespace.c:3230
 do_mount+0x10f/0x140 fs/namespace.c:3243
 __do_sys_mount fs/namespace.c:3451 [inline]
 __se_sys_mount fs/namespace.c:3428 [inline]
 __x64_sys_mount+0x1bb/0x2b0 fs/namespace.c:3428
 do_syscall_64+0x4b/0x80 arch/x86/entry/common.c:46
 entry_SYSCALL_64_after_hwframe+0x61/0xc6
 
Signed-off-by: Long Li <leo.lilong@huawei.com>
Signed-off-by: Wu Guanghao <wuguanghao3@huawei.com>
---
 repair/sb.c | 2 --
 1 file changed, 2 deletions(-)
 
diff --git a/repair/sb.c b/repair/sb.c
index 7391cf04..fe63bff3 100644
--- a/repair/sb.c
+++ b/repair/sb.c
@@ -663,13 +663,11 @@ get_sb_geometry(fs_geometry_t *geo, xfs_sb_t *sbp)
 	 * blindly set fields that we know are always good
 	 */
 	geo->sb_blocksize = sbp->sb_blocksize;
-	geo->sb_dblocks = sbp->sb_dblocks;
 	geo->sb_rblocks = sbp->sb_rblocks;
 	geo->sb_rextents = sbp->sb_rextents;
 	geo->sb_logstart = sbp->sb_logstart;
 	geo->sb_rextsize = sbp->sb_rextsize;
 	geo->sb_agblocks = sbp->sb_agblocks;
-	geo->sb_agcount = sbp->sb_agcount;
 	geo->sb_rbmblocks = sbp->sb_rbmblocks;
 	geo->sb_logblocks = sbp->sb_logblocks;
 	geo->sb_sectsize = sbp->sb_sectsize;
-- 
2.31.1