aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2023-12-11 17:37:26 +0100
committerCarlos Maiolino <cem@kernel.org>2023-12-18 14:57:48 +0100
commit09746c2a714ab3575200c127c4fc3a6e9977b14a (patch)
treede2dd578758cc59238936b79debfd6f4cf9e5de8
parent809310c4a593d0a96c48d6a3ba8f7a37bd07b15a (diff)
downloadxfsprogs-dev-09746c2a714ab3575200c127c4fc3a6e9977b14a.tar.gz
libxlog: add a helper to initialize a xlog without clobbering the x structure
xfsprogs has three copies of a code sequence to initialize an xlog structure from a libxfs_init structure. Factor the code into a helper. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com> Signed-off-by: Carlos Maiolino <cem@kernel.org>
-rw-r--r--include/libxlog.h1
-rw-r--r--libxlog/util.c25
-rw-r--r--logprint/logprint.c25
-rw-r--r--repair/phase2.c23
4 files changed, 28 insertions, 46 deletions
diff --git a/include/libxlog.h b/include/libxlog.h
index a598a7b3c2..657acfe42c 100644
--- a/include/libxlog.h
+++ b/include/libxlog.h
@@ -71,6 +71,7 @@ extern int print_record_header;
/* libxfs parameters */
extern libxfs_init_t x;
+void xlog_init(struct xfs_mount *mp, struct xlog *log, libxfs_init_t *x);
int xlog_is_dirty(struct xfs_mount *mp, struct xlog *log, libxfs_init_t *x);
extern struct xfs_buf *xlog_get_bp(struct xlog *, int);
diff --git a/libxlog/util.c b/libxlog/util.c
index 1022e3378e..bc4db478e9 100644
--- a/libxlog/util.c
+++ b/libxlog/util.c
@@ -12,18 +12,12 @@ int print_skip_uuid;
int print_record_header;
libxfs_init_t x;
-/*
- * Return 1 for dirty, 0 for clean, -1 for errors
- */
-int
-xlog_is_dirty(
+void
+xlog_init(
struct xfs_mount *mp,
struct xlog *log,
libxfs_init_t *x)
{
- int error;
- xfs_daddr_t head_blk, tail_blk;
-
memset(log, 0, sizeof(*log));
/* We (re-)init members of libxfs_init_t here? really? */
@@ -48,6 +42,21 @@ xlog_is_dirty(
ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT);
}
log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1;
+}
+
+/*
+ * Return 1 for dirty, 0 for clean, -1 for errors
+ */
+int
+xlog_is_dirty(
+ struct xfs_mount *mp,
+ struct xlog *log,
+ libxfs_init_t *x)
+{
+ int error;
+ xfs_daddr_t head_blk, tail_blk;
+
+ xlog_init(mp, log, x);
error = xlog_find_tail(log, &head_blk, &tail_blk);
if (error) {
diff --git a/logprint/logprint.c b/logprint/logprint.c
index 7d51cdd914..c78aeb2f86 100644
--- a/logprint/logprint.c
+++ b/logprint/logprint.c
@@ -58,7 +58,6 @@ logstat(
{
int fd;
char buf[BBSIZE];
- xfs_sb_t *sb;
/* On Linux we always read the superblock of the
* filesystem. We need this to get the length of the
@@ -77,19 +76,16 @@ logstat(
close (fd);
if (!x.disfile) {
+ struct xfs_sb *sb = &mp->m_sb;
+
/*
* Conjure up a mount structure
*/
- sb = &mp->m_sb;
libxfs_sb_from_disk(sb, (struct xfs_dsb *)buf);
mp->m_features |= libxfs_sb_version_to_features(&mp->m_sb);
mp->m_blkbb_log = sb->sb_blocklog - BBSHIFT;
- x.logBBsize = XFS_FSB_TO_BB(mp, sb->sb_logblocks);
- x.logBBstart = XFS_FSB_TO_DADDR(mp, sb->sb_logstart);
- x.lbsize = BBSIZE;
- if (xfs_has_sector(mp))
- x.lbsize <<= (sb->sb_logsectlog - BBSHIFT);
+ xlog_init(mp, log, &x);
if (!x.logname && sb->sb_logstart == 0) {
fprintf(stderr, _(" external log device not specified\n\n"));
@@ -100,16 +96,13 @@ logstat(
struct stat s;
stat(x.dname, &s);
- x.logBBsize = s.st_size >> 9;
- x.logBBstart = 0;
- x.lbsize = BBSIZE;
- }
- log->l_dev = mp->m_logdev_targp;
- log->l_logBBstart = x.logBBstart;
- log->l_logBBsize = x.logBBsize;
- log->l_sectBBsize = BTOBB(x.lbsize);
- log->l_mp = mp;
+ log->l_logBBsize = s.st_size >> 9;
+ log->l_logBBstart = 0;
+ log->l_sectBBsize = BTOBB(BBSIZE);
+ log->l_dev = mp->m_logdev_targp;
+ log->l_mp = mp;
+ }
if (x.logname && *x.logname) { /* External log */
if ((fd = open(x.logname, O_RDONLY)) == -1) {
diff --git a/repair/phase2.c b/repair/phase2.c
index 2ada95aefd..a9dd77be39 100644
--- a/repair/phase2.c
+++ b/repair/phase2.c
@@ -30,28 +30,7 @@ zero_log(
xfs_daddr_t tail_blk;
struct xlog *log = mp->m_log;
- memset(log, 0, sizeof(struct xlog));
- x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks);
- x.logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart);
- x.lbsize = BBSIZE;
- if (xfs_has_sector(mp))
- x.lbsize <<= (mp->m_sb.sb_logsectlog - BBSHIFT);
-
- log->l_dev = mp->m_logdev_targp;
- log->l_logBBsize = x.logBBsize;
- log->l_logBBstart = x.logBBstart;
- log->l_sectBBsize = BTOBB(x.lbsize);
- log->l_mp = mp;
- if (xfs_has_sector(mp)) {
- log->l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT;
- ASSERT(log->l_sectbb_log <= mp->m_sectbb_log);
- /* for larger sector sizes, must have v2 or external log */
- ASSERT(log->l_sectbb_log == 0 ||
- log->l_logBBstart == 0 ||
- xfs_has_logv2(mp));
- ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT);
- }
- log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1;
+ xlog_init(mp, mp->m_log, &x);
/*
* Find the log head and tail and alert the user to the situation if the