]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_repair: refactor root directory initialization
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)
Refactor root directory initialization into a separate function we can
call for both the root dir and the metadir.

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

index e01e81ae014490a0a00c772e0cd0cf3eeea09d9a..017c46f43afe6d2e85541c30234369c751b312d4 100644 (file)
@@ -773,27 +773,27 @@ mk_rsumino(xfs_mount_t *mp)
        libxfs_irele(ip);
 }
 
-/*
- * makes a new root directory.
- */
-static void
-mk_root_dir(xfs_mount_t *mp)
+/* Initialize a root directory. */
+static int
+init_fs_root_dir(
+       struct xfs_mount        *mp,
+       xfs_ino_t               ino,
+       mode_t                  mode,
+       struct xfs_inode        **ipp)
 {
-       xfs_trans_t     *tp;
-       xfs_inode_t     *ip;
-       int             i;
-       int             error;
-       const mode_t    mode = 0755;
-       ino_tree_node_t *irec;
+       struct xfs_trans        *tp;
+       struct xfs_inode        *ip = NULL;
+       struct ino_tree_node    *irec;
+       int                     error;
 
-       ip = NULL;
-       i = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 10, 0, 0, &tp);
-       if (i)
-               res_failed(i);
+       error = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 10, 0, 0, &tp);
+       if (error)
+               return error;
 
-       error = -libxfs_iget(mp, tp, mp->m_sb.sb_rootino, 0, &ip);
+       error = -libxfs_iget(mp, tp, ino, 0, &ip);
        if (error) {
-               do_error(_("could not iget root inode -- error - %d\n"), error);
+               libxfs_trans_cancel(tp);
+               return error;
        }
 
        /* Reset the root directory. */
@@ -802,14 +802,31 @@ mk_root_dir(xfs_mount_t *mp)
 
        error = -libxfs_trans_commit(tp);
        if (error)
-               do_error(_("%s: commit failed, error %d\n"), __func__, error);
+               return error;
 
-       libxfs_irele(ip);
+       irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, ino),
+                               XFS_INO_TO_AGINO(mp, ino));
+       set_inode_isadir(irec, XFS_INO_TO_AGINO(mp, ino) - irec->ino_startnum);
+       *ipp = ip;
+       return 0;
+}
 
-       irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rootino),
-                               XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino));
-       set_inode_isadir(irec, XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rootino) -
-                               irec->ino_startnum);
+/*
+ * makes a new root directory.
+ */
+static void
+mk_root_dir(xfs_mount_t *mp)
+{
+       struct xfs_inode        *ip = NULL;
+       int                     error;
+
+       error = init_fs_root_dir(mp, mp->m_sb.sb_rootino, 0755, &ip);
+       if (error)
+               do_error(
+       _("Could not reinitialize root directory inode, error %d\n"),
+                       error);
+
+       libxfs_irele(ip);
 }
 
 /*