[PATCH 12/43] xfs_repair: simplify rt_lock handling

Darrick J. Wong
2024-10-11T01:27:42Z

From: Christoph Hellwig <hch@lst.de>

No need to cacheline align rt_lock if we move it next to the data
it protects. Also reduce the critical section to just where those
data structures are accessed.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
repair/dinode.c | 6 +++---
repair/globals.c | 1 -
repair/globals.h | 2 +-
repair/incore.c | 8 ++++----
4 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/repair/dinode.c b/repair/dinode.c
index e59d358e8439a2..5046a5ed6dcc31 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -304,7 +304,7 @@ process_rt_rec(
bool zap_metadata)
{
xfs_fsblock_t lastb;
- int bad;
+ int bad = 0;

/*
* check numeric validity of the extent
@@ -338,10 +338,12 @@ _("inode %" PRIu64 " - bad rt extent overflows - start %" PRIu64 ", "
return 1;
}

+ pthread_mutex_lock(&rt_lock);
if (check_dups)
bad = process_rt_rec_dups(mp, ino, irec);
else
bad = process_rt_rec_state(mp, ino, zap_metadata, irec);
+ pthread_mutex_unlock(&rt_lock);
if (bad)
return bad;

@@ -451,10 +453,8 @@ _("zero length extent (off = %" PRIu64 ", fsbno = %" PRIu64 ") in ino %" PRIu64
}

if (type == XR_INO_RTDATA && whichfork == XFS_DATA_FORK) {
- pthread_mutex_lock(&rt_lock.lock);
error2 = process_rt_rec(mp, &irec, ino, tot, check_dups,
zap_metadata);
- pthread_mutex_unlock(&rt_lock.lock);
if (error2)
return error2;

diff --git a/repair/globals.c b/repair/globals.c
index bd07a9656d193b..d97e2a8d2d6d9b 100644
--- a/repair/globals.c
+++ b/repair/globals.c
@@ -112,7 +112,6 @@ uint32_t sb_unit;
uint32_t sb_width;

struct aglock *ag_locks;
-struct aglock rt_lock;

time_t report_interval;
uint64_t *prog_rpt_done;
diff --git a/repair/globals.h b/repair/globals.h
index ebe8d5ee132b8d..db8afabd9f0fc9 100644
--- a/repair/globals.h
+++ b/repair/globals.h
@@ -156,7 +156,7 @@ struct aglock {
pthread_mutex_t lock __attribute__((__aligned__(64)));
};
extern struct aglock *ag_locks;
-extern struct aglock rt_lock;
+extern pthread_mutex_t rt_lock;

extern time_t report_interval;
extern uint64_t *prog_rpt_done;
diff --git a/repair/incore.c b/repair/incore.c
index 06edaf0d605262..21f5b05d3e93e4 100644
--- a/repair/incore.c
+++ b/repair/incore.c
@@ -166,6 +166,7 @@ get_bmap_ext(

static uint64_t *rt_bmap;
static size_t rt_bmap_size;
+pthread_mutex_t rt_lock;

/* block records fit into uint64_t's units */
#define XR_BB_UNIT 64 /* number of bits/unit */
@@ -209,6 +210,7 @@ init_rt_bmap(
if (mp->m_sb.sb_rextents == 0)
return;

+ pthread_mutex_init(&rt_lock, NULL);
rt_bmap_size = roundup(howmany(mp->m_sb.sb_rextents, (NBBY / XR_BB)),
sizeof(uint64_t));

@@ -226,8 +228,9 @@ free_rt_bmap(xfs_mount_t *mp)
{
free(rt_bmap);
rt_bmap = NULL;
-}
+ pthread_mutex_destroy(&rt_lock);

+}

void
reset_bmaps(xfs_mount_t *mp)
@@ -290,7 +293,6 @@ init_bmaps(xfs_mount_t *mp)
btree_init(&ag_bmap[i]);
pthread_mutex_init(&ag_locks[i].lock, NULL);
}
- pthread_mutex_init(&rt_lock.lock, NULL);

init_rt_bmap(mp);
reset_bmaps(mp);
@@ -301,8 +303,6 @@ free_bmaps(xfs_mount_t *mp)
{
xfs_agnumber_t i;

- pthread_mutex_destroy(&rt_lock.lock);
-
for (i = 0; i < mp->m_sb.sb_agcount; i++)
pthread_mutex_destroy(&ag_locks[i].lock);