[PATCH 27/38] xfs_repair: update incore metadata state whenever we create new files

Darrick J. Wong
2024-10-11T01:21:12Z

Make sure that we update our incore metadata inode bookkeepping whenever
we create new metadata files. There will be many more of these later.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
repair/phase6.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)

diff --git a/repair/phase6.c b/repair/phase6.c
index f2358bde194e38..dd17e8a60d05a3 100644
--- a/repair/phase6.c
+++ b/repair/phase6.c
@@ -474,6 +474,24 @@ reset_sbroot_ino(
libxfs_inode_init(tp, &args, ip);
}

+/*
+ * Mark a newly allocated inode as metadata in the incore bitmap. Callers
+ * must have already called mark_ino_inuse to ensure there is an incore record.
+ */
+static void
+mark_ino_metadata(
+ struct xfs_mount *mp,
+ xfs_ino_t ino)
+{
+ struct ino_tree_node *irec;
+ int ino_offset;
+
+ irec = find_inode_rec(mp, XFS_INO_TO_AGNO(mp, ino),
+ XFS_INO_TO_AGINO(mp, ino));
+ ino_offset = get_inode_offset(mp, ino, irec);
+ set_inode_is_meta(irec, ino_offset);
+}
+
/* Load a realtime freespace metadata inode from disk and reset it. */
static int
ensure_rtino(
@@ -693,6 +711,7 @@ mk_metadir(

libxfs_trans_ijoin(tp, mp->m_metadirip, 0);
libxfs_metafile_set_iflag(tp, mp->m_metadirip, XFS_METAFILE_DIR);
+ mark_ino_metadata(mp, mp->m_metadirip->i_ino);

error = -libxfs_trans_commit(tp);
if (error)