]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_repair: refactor grabbing realtime metadata inodes
authorDarrick J. Wong <djwong@kernel.org>
Fri, 15 Jul 2022 21:22:04 +0000 (14:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:32 +0000 (15:03 -0800)
Create a helper function to grab a realtime metadata inode.  When
metadir arrives, the bitmap and summary inodes can float, so we'll
turn this function into a "load or allocate" function.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
repair/phase6.c

index 017c46f43afe6d2e85541c30234369c751b312d4..afb09ff72329ae9dcde0200ba625d79fb2a376e5 100644 (file)
@@ -471,18 +471,37 @@ reset_root_ino(
        libxfs_inode_init(tp, &args, ip);
 }
 
+/* Load a realtime metadata inode from disk and reset it. */
+static int
+ensure_rtino(
+       struct xfs_trans                *tp,
+       xfs_ino_t                       ino,
+       struct xfs_inode                **ipp)
+{
+       struct xfs_mount                *mp = tp->t_mountp;
+       int                             error;
+
+       error = -libxfs_iget(mp, tp, ino, 0, ipp);
+       if (error)
+               return error;
+
+       reset_root_ino(tp, S_IFREG, *ipp);
+       return 0;
+}
+
 static void
-mk_rbmino(xfs_mount_t *mp)
+mk_rbmino(
+       struct xfs_mount        *mp)
 {
-       xfs_trans_t     *tp;
-       xfs_inode_t     *ip;
-       xfs_bmbt_irec_t *ep;
-       int             i;
-       int             nmap;
-       int             error;
-       xfs_fileoff_t   bno;
-       xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP];
-       uint            blocks;
+       struct xfs_trans        *tp;
+       struct xfs_inode        *ip;
+       struct xfs_bmbt_irec    *ep;
+       int                     i;
+       int                     nmap;
+       int                     error;
+       xfs_fileoff_t           bno;
+       struct xfs_bmbt_irec    map[XFS_BMAP_MAX_NMAP];
+       uint                    blocks;
 
        /*
         * first set up inode
@@ -491,15 +510,13 @@ mk_rbmino(xfs_mount_t *mp)
        if (i)
                res_failed(i);
 
-       error = -libxfs_iget(mp, tp, mp->m_sb.sb_rbmino, 0, &ip);
+       /* Reset the realtime bitmap inode. */
+       error = ensure_rtino(tp, mp->m_sb.sb_rbmino, &ip);
        if (error) {
                do_error(
                _("couldn't iget realtime bitmap inode -- error - %d\n"),
                        error);
        }
-
-       /* Reset the realtime bitmap inode. */
-       reset_root_ino(tp, S_IFREG, ip);
        ip->i_disk_size = mp->m_sb.sb_rbmblocks * mp->m_sb.sb_blocksize;
        libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
        error = -libxfs_trans_commit(tp);
@@ -700,18 +717,19 @@ _("can't access block %" PRIu64 " (fsbno %" PRIu64 ") of realtime summary inode
 }
 
 static void
-mk_rsumino(xfs_mount_t *mp)
+mk_rsumino(
+       struct xfs_mount        *mp)
 {
-       xfs_trans_t     *tp;
-       xfs_inode_t     *ip;
-       xfs_bmbt_irec_t *ep;
-       int             i;
-       int             nmap;
-       int             error;
-       int             nsumblocks;
-       xfs_fileoff_t   bno;
-       xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP];
-       uint            blocks;
+       struct xfs_trans        *tp;
+       struct xfs_inode        *ip;
+       struct xfs_bmbt_irec    *ep;
+       int                     i;
+       int                     nmap;
+       int                     error;
+       int                     nsumblocks;
+       xfs_fileoff_t           bno;
+       struct xfs_bmbt_irec    map[XFS_BMAP_MAX_NMAP];
+       uint                    blocks;
 
        /*
         * first set up inode
@@ -720,15 +738,13 @@ mk_rsumino(xfs_mount_t *mp)
        if (i)
                res_failed(i);
 
-       error = -libxfs_iget(mp, tp, mp->m_sb.sb_rsumino, 0, &ip);
+       /* Reset the rt summary inode. */
+       error = ensure_rtino(tp, mp->m_sb.sb_rsumino, &ip);
        if (error) {
                do_error(
                _("couldn't iget realtime summary inode -- error - %d\n"),
                        error);
        }
-
-       /* Reset the rt summary inode. */
-       reset_root_ino(tp, S_IFREG, ip);
        ip->i_disk_size = mp->m_rsumsize;
        libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
        error = -libxfs_trans_commit(tp);