From fa788c9e617ac2bee3910642df0d45d864719e8c Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Thu, 15 Aug 2024 08:52:04 +0200 Subject: [PATCH] repair: simplify rt_lock handling 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 --- repair/dinode.c | 25 +++++++++++-------------- repair/globals.c | 1 - repair/globals.h | 2 +- repair/incore.c | 8 ++++---- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index cec372dbf..763adc73c 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -422,7 +422,7 @@ process_rt_rec( bool zap_metadata) { xfs_fsblock_t lastb; - int bad; + int bad = 0; /* * check numeric validity of the extent @@ -456,23 +456,22 @@ _("inode %" PRIu64 " - bad rt extent overflows - start %" PRIu64 ", " return 1; } + pthread_mutex_lock(&rt_lock); bad = check_rt_rec_state(mp, ino, irec); - if (bad) - return bad; - - if (check_dups) { - bad = process_rt_rec_dups(mp, ino, irec); - if (bad) - return bad; - } else { - process_rt_rec_state(mp, ino, zap_metadata, irec); + if (!bad) { + if (check_dups) + bad = process_rt_rec_dups(mp, ino, irec); + else + process_rt_rec_state(mp, ino, zap_metadata, irec); } + pthread_mutex_unlock(&rt_lock); /* * bump up the block counter */ - *tot += irec->br_blockcount; - return 0; + if (!bad) + *tot += irec->br_blockcount; + return bad; } static inline bool @@ -589,10 +588,8 @@ _("zero length extent (off = %" PRIu64 ", fsbno = %" PRIu64 ") in ino %" PRIu64 } if (isrt && !xfs_has_rtgroups(mp)) { - 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 a3eec43ba..d0c2a3f57 100644 --- a/repair/globals.c +++ b/repair/globals.c @@ -122,7 +122,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 ffed60cf4..c2593c894 100644 --- a/repair/globals.h +++ b/repair/globals.h @@ -166,7 +166,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 869c3a066..3aae0eaf1 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 */ @@ -218,6 +219,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)); @@ -237,8 +239,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) @@ -322,7 +325,6 @@ init_bmaps( 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); @@ -336,8 +338,6 @@ free_bmaps( mp->m_sb.sb_agcount + mp->m_sb.sb_rgcount; unsigned int i; - pthread_mutex_destroy(&rt_lock.lock); - for (i = 0; i < nr_groups; i++) pthread_mutex_destroy(&ag_locks[i].lock); -- 2.50.1