]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: support inode btree blockcounts in online repair
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 10 Nov 2020 20:11:09 +0000 (15:11 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Tue, 10 Nov 2020 20:11:09 +0000 (15:11 -0500)
Source kernel commit: 11f744234f052922db4ed77dad35862b3d3164cf

Add the necessary bits to the online repair code to support logging the
inode btree counters when rebuilding the btrees, and to support fixing
the counters when rebuilding the AGI.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_ialloc_btree.c

index 1edf69ffa96b76b40e570d7e0966a287d80482d0..9534171518201541f037aeffa9667a1bd8b648f6 100644 (file)
@@ -500,19 +500,29 @@ xfs_inobt_commit_staged_btree(
 {
        struct xfs_agi          *agi = agbp->b_addr;
        struct xbtree_afakeroot *afake = cur->bc_ag.afake;
+       int                     fields;
 
        ASSERT(cur->bc_flags & XFS_BTREE_STAGING);
 
        if (cur->bc_btnum == XFS_BTNUM_INO) {
+               fields = XFS_AGI_ROOT | XFS_AGI_LEVEL;
                agi->agi_root = cpu_to_be32(afake->af_root);
                agi->agi_level = cpu_to_be32(afake->af_levels);
-               xfs_ialloc_log_agi(tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL);
+               if (xfs_sb_version_hasinobtcounts(&cur->bc_mp->m_sb)) {
+                       agi->agi_iblocks = cpu_to_be32(afake->af_blocks);
+                       fields |= XFS_AGI_IBLOCKS;
+               }
+               xfs_ialloc_log_agi(tp, agbp, fields);
                xfs_btree_commit_afakeroot(cur, tp, agbp, &xfs_inobt_ops);
        } else {
+               fields = XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL;
                agi->agi_free_root = cpu_to_be32(afake->af_root);
                agi->agi_free_level = cpu_to_be32(afake->af_levels);
-               xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREE_ROOT |
-                                            XFS_AGI_FREE_LEVEL);
+               if (xfs_sb_version_hasinobtcounts(&cur->bc_mp->m_sb)) {
+                       agi->agi_fblocks = cpu_to_be32(afake->af_blocks);
+                       fields |= XFS_AGI_IBLOCKS;
+               }
+               xfs_ialloc_log_agi(tp, agbp, fields);
                xfs_btree_commit_afakeroot(cur, tp, agbp, &xfs_finobt_ops);
        }
 }