[PATCH 25/41] xfs_repair: refactor root directory initialization

Darrick J. Wong
2024-12-06T23:46:10Z

From: Darrick J. Wong <djwong@kernel.org>

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 | 63 +++++++++++++++++++++++++++++++++++--------------------
1 file changed, 40 insertions(+), 23 deletions(-)

diff --git a/repair/phase6.c b/repair/phase6.c
index 0c80c4aa36af4a..ae83d69fe12cd3 100644
--- a/repair/phase6.c
+++ b/repair/phase6.c
@@ -587,27 +587,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. */
@@ -616,14 +616,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;
+
+ 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;
+}
+
+/*
+ * 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);
-
- 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);
}

/*