[PATCH 40/41] xfs_repair: refactor generate_rtinfo

Darrick J. Wong
2024-12-06T23:50:04Z

From: Christoph Hellwig <hch@lst.de>

Move the allocation of the computed values into generate_rtinfo, and thus
make the variables holding them private in rt.c, and clean up a few
formatting nits.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
[djwong: move functions to fix build errors]
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
repair/globals.c | 5 --
repair/globals.h | 5 --
repair/phase5.c | 3 -
repair/phase6.c | 51 +----------------
repair/rt.c | 160 ++++++++++++++++++++++++++++++++----------------------
repair/rt.h | 12 +---
6 files changed, 104 insertions(+), 132 deletions(-)

diff --git a/repair/globals.c b/repair/globals.c
index b63931be9fdb70..bd07a9656d193b 100644
--- a/repair/globals.c
+++ b/repair/globals.c
@@ -87,11 +87,6 @@ unsigned int glob_agcount;
int chunks_pblock; /* # of 64-ino chunks per allocation */
int max_symlink_blocks;

-/* realtime info */
-
-union xfs_rtword_raw *btmcompute;
-union xfs_suminfo_raw *sumcompute;
-
/* inode tree records have full or partial backptr fields ? */

int full_ino_ex_data; /*
diff --git a/repair/globals.h b/repair/globals.h
index 1dc85ce7f8114c..ebe8d5ee132b8d 100644
--- a/repair/globals.h
+++ b/repair/globals.h
@@ -128,11 +128,6 @@ extern unsigned int glob_agcount;
extern int chunks_pblock; /* # of 64-ino chunks per allocation */
extern int max_symlink_blocks;

-/* realtime info */
-
-extern union xfs_rtword_raw *btmcompute;
-extern union xfs_suminfo_raw *sumcompute;
-
/* inode tree records have full or partial backptr fields ? */

extern int full_ino_ex_data;/*
diff --git a/repair/phase5.c b/repair/phase5.c
index a5e19998b97061..91c4a8662a69f2 100644
--- a/repair/phase5.c
+++ b/repair/phase5.c
@@ -627,8 +627,7 @@ void
check_rtmetadata(
struct xfs_mount *mp)
{
- rtinit(mp);
- generate_rtinfo(mp, btmcompute, sumcompute);
+ generate_rtinfo(mp);
check_rtbitmap(mp);
check_rtsummary(mp);
}
diff --git a/repair/phase6.c b/repair/phase6.c
index cc81f5c8b013f4..93df5c358338bf 100644
--- a/repair/phase6.c
+++ b/repair/phase6.c
@@ -19,6 +19,7 @@
#include "progress.h"
#include "versions.h"
#include "repair/pptr.h"
+#include "repair/rt.h"

static xfs_ino_t orphanage_ino;

@@ -558,52 +559,6 @@ mk_rbmino(
libxfs_irele(ip);
}

-static void
-fill_rbmino(
- struct xfs_mount *mp)
-{
- struct xfs_inode *ip;
- int error;
-
- error = -libxfs_metafile_iget(mp, mp->m_sb.sb_rbmino,
- XFS_METAFILE_RTBITMAP, &ip);
- if (error)
- do_error(
-_("couldn't iget realtime bitmap inode, error %d\n"), error);
-
- error = -libxfs_rtfile_initialize_blocks(ip, 0, mp->m_sb.sb_rbmblocks,
- btmcompute);
- if (error)
- do_error(
-_("couldn't re-initialize realtime bitmap inode, error %d\n"), error);
-
- libxfs_irele(ip);
-}
-
-static void
-fill_rsumino(
- struct xfs_mount *mp)
-{
- struct xfs_inode *ip;
- int error;
-
- error = -libxfs_metafile_iget(mp, mp->m_sb.sb_rsumino,
- XFS_METAFILE_RTSUMMARY, &ip);
- if (error)
- do_error(
-_("couldn't iget realtime summary inode, error %d\n"), error);
-
- mp->m_rsumip = ip;
- error = -libxfs_rtfile_initialize_blocks(ip, 0, mp->m_rsumblocks,
- sumcompute);
- mp->m_rsumip = NULL;
- if (error)
- do_error(
-_("couldn't re-initialize realtime summary inode, error %d\n"), error);
-
- libxfs_irele(ip);
-}
-
static void
mk_rsumino(
struct xfs_mount *mp)
@@ -3341,8 +3296,8 @@ phase6(xfs_mount_t *mp)
if (!no_modify) {
do_log(
_(" - resetting contents of realtime bitmap and summary inodes\n"));
- fill_rbmino(mp);
- fill_rsumino(mp);
+ fill_rtbitmap(mp);
+ fill_rtsummary(mp);
}

mark_standalone_inodes(mp);
diff --git a/repair/rt.c b/repair/rt.c
index 9ae421168e84b4..d0a171020c4b49 100644
--- a/repair/rt.c
+++ b/repair/rt.c
@@ -14,31 +14,9 @@
#include "err_protos.h"
#include "rt.h"

-void
-rtinit(xfs_mount_t *mp)
-{
- unsigned long long wordcnt;
-
- if (mp->m_sb.sb_rblocks == 0)
- return;
-
- /*
- * Allocate buffers for formatting the collected rt free space
- * information. The rtbitmap buffer must be large enough to compare
- * against any unused bytes in the last block of the file.
- */
- wordcnt = XFS_FSB_TO_B(mp, mp->m_sb.sb_rbmblocks) >> XFS_WORDLOG;
- btmcompute = calloc(wordcnt, sizeof(union xfs_rtword_raw));
- if (!btmcompute)
- do_error(
- _("couldn't allocate memory for incore realtime bitmap.\n"));
-
- wordcnt = XFS_FSB_TO_B(mp, mp->m_rsumblocks) >> XFS_WORDLOG;
- sumcompute = calloc(wordcnt, sizeof(union xfs_suminfo_raw));
- if (!sumcompute)
- do_error(
- _("couldn't allocate memory for incore realtime summary info.\n"));
-}
+/* Computed rt bitmap/summary data */
+static union xfs_rtword_raw *btmcompute;
+static union xfs_suminfo_raw *sumcompute;

static inline void
set_rtword(
@@ -64,58 +42,66 @@ inc_sumcount(
* generate the real-time bitmap and summary info based on the
* incore realtime extent map.
*/
-int
+void
generate_rtinfo(
- struct xfs_mount *mp,
- union xfs_rtword_raw *words,
- union xfs_suminfo_raw *sumcompute)
+ struct xfs_mount *mp)
{
- xfs_rtxnum_t extno;
- xfs_rtxnum_t start_ext;
- int bitsperblock;
- int bmbno;
- xfs_rtword_t freebit;
- xfs_rtword_t bits;
- int start_bmbno;
- int i;
- int offs;
- int log;
- int len;
- int in_extent;
+ unsigned int bitsperblock =
+ mp->m_blockwsize << XFS_NBWORDLOG;
+ xfs_rtxnum_t extno = 0;
+ xfs_rtxnum_t start_ext = 0;
+ int bmbno = 0;
+ int start_bmbno = 0;
+ bool in_extent = false;
+ unsigned long long wordcnt;
+ union xfs_rtword_raw *words;
+
+ wordcnt = XFS_FSB_TO_B(mp, mp->m_sb.sb_rbmblocks) >> XFS_WORDLOG;
+ btmcompute = calloc(wordcnt, sizeof(union xfs_rtword_raw));
+ if (!btmcompute)
+ do_error(
+_("couldn't allocate memory for incore realtime bitmap.\n"));
+ words = btmcompute;
+
+ wordcnt = XFS_FSB_TO_B(mp, mp->m_rsumblocks) >> XFS_WORDLOG;
+ sumcompute = calloc(wordcnt, sizeof(union xfs_suminfo_raw));
+ if (!sumcompute)
+ do_error(
+_("couldn't allocate memory for incore realtime summary info.\n"));

ASSERT(mp->m_rbmip == NULL);

- bitsperblock = mp->m_blockwsize << XFS_NBWORDLOG;
- extno = start_ext = 0;
- bmbno = in_extent = start_bmbno = 0;
-
/*
- * slower but simple, don't play around with trying to set
- * things one word at a time, just set bit as required.
- * Have to * track start and end (size) of each range of
- * free extents to set the summary info properly.
+ * Slower but simple, don't play around with trying to set things one
+ * word at a time, just set bit as required. Have to track start and
+ * end (size) of each range of free extents to set the summary info
+ * properly.
*/
while (extno < mp->m_sb.sb_rextents) {
- freebit = 1;
+ xfs_rtword_t freebit = 1;
+ xfs_rtword_t bits = 0;
+ int i;
+
set_rtword(mp, words, 0);
- bits = 0;
for (i = 0; i < sizeof(xfs_rtword_t) * NBBY &&
extno < mp->m_sb.sb_rextents; i++, extno++) {
if (get_rtbmap(extno) == XR_E_FREE) {
sb_frextents++;
bits |= freebit;

- if (in_extent == 0) {
+ if (!in_extent) {
start_ext = extno;
start_bmbno = bmbno;
- in_extent = 1;
+ in_extent = true;
}
- } else if (in_extent == 1) {
- len = (int) (extno - start_ext);
- log = libxfs_highbit64(len);
- offs = xfs_rtsumoffs(mp, log, start_bmbno);
+ } else if (in_extent) {
+ uint64_t len = extno - start_ext;
+ xfs_rtsumoff_t offs;
+
+ offs = xfs_rtsumoffs(mp, libxfs_highbit64(len),
+ start_bmbno);
inc_sumcount(mp, sumcompute, offs);
- in_extent = 0;
+ in_extent = false;
}

freebit <<= 1;
@@ -126,10 +112,12 @@ generate_rtinfo(
if (extno % bitsperblock == 0)
bmbno++;
}
- if (in_extent == 1) {
- len = (int) (extno - start_ext);
- log = libxfs_highbit64(len);
- offs = xfs_rtsumoffs(mp, log, start_bmbno);
+
+ if (in_extent) {
+ uint64_t len = extno - start_ext;
+ xfs_rtsumoff_t offs;
+
+ offs = xfs_rtsumoffs(mp, libxfs_highbit64(len), start_bmbno);
inc_sumcount(mp, sumcompute, offs);
}

@@ -137,8 +125,6 @@ generate_rtinfo(
do_warn(_("sb_frextents %" PRIu64 ", counted %" PRIu64 "\n"),
mp->m_sb.sb_frextents, sb_frextents);
}
-
- return(0);
}

static void
@@ -245,3 +231,49 @@ check_rtsummary(

check_rtfile_contents(mp, XFS_METAFILE_RTSUMMARY, mp->m_rsumblocks);
}
+
+void
+fill_rtbitmap(
+ struct xfs_mount *mp)
+{
+ struct xfs_inode *ip;
+ int error;
+
+ error = -libxfs_metafile_iget(mp, mp->m_sb.sb_rbmino,
+ XFS_METAFILE_RTBITMAP, &ip);
+ if (error)
+ do_error(
+_("couldn't iget realtime bitmap inode, error %d\n"), error);
+
+ error = -libxfs_rtfile_initialize_blocks(ip, 0, mp->m_sb.sb_rbmblocks,
+ btmcompute);
+ if (error)
+ do_error(
+_("couldn't re-initialize realtime bitmap inode, error %d\n"), error);
+
+ libxfs_irele(ip);
+}
+
+void
+fill_rtsummary(
+ struct xfs_mount *mp)
+{
+ struct xfs_inode *ip;
+ int error;
+
+ error = -libxfs_metafile_iget(mp, mp->m_sb.sb_rsumino,
+ XFS_METAFILE_RTSUMMARY, &ip);
+ if (error)
+ do_error(
+_("couldn't iget realtime summary inode, error %d\n"), error);
+
+ mp->m_rsumip = ip;
+ error = -libxfs_rtfile_initialize_blocks(ip, 0, mp->m_rsumblocks,
+ sumcompute);
+ mp->m_rsumip = NULL;
+ if (error)
+ do_error(
+_("couldn't re-initialize realtime summary inode, error %d\n"), error);
+
+ libxfs_irele(ip);
+}
diff --git a/repair/rt.h b/repair/rt.h
index 862695487bcd4c..f8caa5dc874ec2 100644
--- a/repair/rt.h
+++ b/repair/rt.h
@@ -6,15 +6,11 @@
#ifndef _XFS_REPAIR_RT_H_
#define _XFS_REPAIR_RT_H_

-struct blkmap;
-
-void
-rtinit(xfs_mount_t *mp);
-
-int generate_rtinfo(struct xfs_mount *mp, union xfs_rtword_raw *words,
- union xfs_suminfo_raw *sumcompute);
-
+void generate_rtinfo(struct xfs_mount *mp);
void check_rtbitmap(struct xfs_mount *mp);
void check_rtsummary(struct xfs_mount *mp);

+void fill_rtbitmap(struct xfs_mount *mp);
+void fill_rtsummary(struct xfs_mount *mp);
+
#endif /* _XFS_REPAIR_RT_H_ */