summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2022-09-21 09:50:02 -0700
committerDarrick J. Wong <djwong@kernel.org>2022-10-14 14:17:08 -0700
commita29c734ba073e6b3bad5350bf5e8823b12c580e4 (patch)
tree5a8c58f4d1e1999a470e9036c5cbe8345c67beac
parentac30d908265b4c284112cf1f812f8f3391d12163 (diff)
xfs: use accessor functions for summary info wordsrefactor-rtbitmap-macros_2022-10-14
Create get and set functions for rtsummary words so that we can redefine the ondisk format with a specific endianness. Note that this requires the definition of a distinct type for ondisk summary info words so that the compiler can perform proper typechecking. Signed-off-by: Darrick J. Wong <djwong@kernel.org>
-rw-r--r--fs/xfs/libxfs/xfs_format.h8
-rw-r--r--fs/xfs/libxfs/xfs_rtbitmap.c27
-rw-r--r--fs/xfs/libxfs/xfs_rtbitmap.h10
-rw-r--r--fs/xfs/scrub/rtsummary.c22
-rw-r--r--fs/xfs/scrub/rtsummary.h2
-rw-r--r--fs/xfs/scrub/trace.c1
-rw-r--r--fs/xfs/scrub/trace.h4
-rw-r--r--fs/xfs/xfs_ondisk.h1
8 files changed, 54 insertions, 21 deletions
diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h
index 886968779c35..a512d4eb9e13 100644
--- a/fs/xfs/libxfs/xfs_format.h
+++ b/fs/xfs/libxfs/xfs_format.h
@@ -726,6 +726,14 @@ union xfs_rtword_ondisk {
};
/*
+ * Realtime summary counts are accessed by the word, which is currently
+ * stored in host-endian format.
+ */
+union xfs_suminfo_ondisk {
+ __u32 raw;
+};
+
+/*
* XFS Timestamps
* ==============
*
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
index be5c793da46c..b74261abd238 100644
--- a/fs/xfs/libxfs/xfs_rtbitmap.c
+++ b/fs/xfs/libxfs/xfs_rtbitmap.c
@@ -466,6 +466,23 @@ xfs_rtfind_forw(
return 0;
}
+inline xfs_suminfo_t
+xfs_suminfo_get(
+ struct xfs_mount *mp,
+ union xfs_suminfo_ondisk *infoptr)
+{
+ return infoptr->raw;
+}
+
+inline void
+xfs_suminfo_add(
+ struct xfs_mount *mp,
+ union xfs_suminfo_ondisk *infoptr,
+ int delta)
+{
+ infoptr->raw += delta;
+}
+
/*
* Read and/or modify the summary information for a given extent size,
* bitmap block combination.
@@ -490,7 +507,7 @@ xfs_rtmodify_summary_int(
int error; /* error value */
xfs_fileoff_t sb; /* summary fsblock */
xfs_rtsumoff_t so; /* index into the summary file */
- xfs_suminfo_t *sp; /* pointer to returned data */
+ union xfs_suminfo_ondisk *sp; /* pointer to returned data */
unsigned int infoword;
/*
@@ -533,17 +550,17 @@ xfs_rtmodify_summary_int(
if (delta) {
uint first = (uint)((char *)sp - (char *)bp->b_addr);
- *sp += delta;
+ xfs_suminfo_add(mp, sp, delta);
if (mp->m_rsum_cache) {
- if (*sp == 0 && log == mp->m_rsum_cache[bbno])
+ if (sp->raw == 0 && log == mp->m_rsum_cache[bbno])
mp->m_rsum_cache[bbno]++;
- if (*sp != 0 && log < mp->m_rsum_cache[bbno])
+ if (sp->raw != 0 && log < mp->m_rsum_cache[bbno])
mp->m_rsum_cache[bbno] = log;
}
xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1);
}
if (sum)
- *sum = *sp;
+ *sum = xfs_suminfo_get(mp, sp);
return 0;
}
diff --git a/fs/xfs/libxfs/xfs_rtbitmap.h b/fs/xfs/libxfs/xfs_rtbitmap.h
index f241ff8a730c..1f3fc1a3b28d 100644
--- a/fs/xfs/libxfs/xfs_rtbitmap.h
+++ b/fs/xfs/libxfs/xfs_rtbitmap.h
@@ -181,18 +181,18 @@ xfs_rtsumoffs_to_infoword(
}
/* Return a pointer to a summary info word within a rt summary block buffer. */
-static inline xfs_suminfo_t *
+static inline union xfs_suminfo_ondisk *
xfs_rsumbuf_infoptr(
void *buf,
unsigned int infoword)
{
- xfs_suminfo_t *infop = buf;
+ union xfs_suminfo_ondisk *infop = buf;
return &infop[infoword];
}
/* Return a pointer to a summary info word within a rt summary block. */
-static inline xfs_suminfo_t *
+static inline union xfs_suminfo_ondisk *
xfs_rsumblock_infoptr(
struct xfs_buf *bp,
unsigned int infoword)
@@ -275,6 +275,10 @@ xfs_filblks_t xfs_rtsummary_blockcount(struct xfs_mount *mp,
unsigned int rsumlevels, xfs_extlen_t rbmblocks);
unsigned long long xfs_rtsummary_wordcount(struct xfs_mount *mp,
unsigned int rsumlevels, xfs_extlen_t rbmblocks);
+xfs_suminfo_t xfs_suminfo_get(struct xfs_mount *mp,
+ union xfs_suminfo_ondisk *infoptr);
+void xfs_suminfo_add(struct xfs_mount *mp, union xfs_suminfo_ondisk *infoptr,
+ int delta);
#else /* CONFIG_XFS_RT */
# define xfs_rtfree_extent(t,b,l) (-ENOSYS)
# define xfs_rtfree_blocks(t,rb,rl) (-ENOSYS)
diff --git a/fs/xfs/scrub/rtsummary.c b/fs/xfs/scrub/rtsummary.c
index 3a98391732a0..94976317b630 100644
--- a/fs/xfs/scrub/rtsummary.c
+++ b/fs/xfs/scrub/rtsummary.c
@@ -85,9 +85,10 @@ static inline int
xfsum_load(
struct xfs_scrub *sc,
xfs_rtsumoff_t sumoff,
- xfs_suminfo_t *info)
+ union xfs_suminfo_ondisk *rawinfo)
{
- return xfile_obj_load(sc->xfile, info, sizeof(xfs_suminfo_t),
+ return xfile_obj_load(sc->xfile, rawinfo,
+ sizeof(union xfs_suminfo_ondisk),
sumoff << XFS_WORDLOG);
}
@@ -95,9 +96,10 @@ static inline int
xfsum_store(
struct xfs_scrub *sc,
xfs_rtsumoff_t sumoff,
- const xfs_suminfo_t info)
+ const union xfs_suminfo_ondisk rawinfo)
{
- return xfile_obj_store(sc->xfile, &info, sizeof(xfs_suminfo_t),
+ return xfile_obj_store(sc->xfile, &rawinfo,
+ sizeof(union xfs_suminfo_ondisk),
sumoff << XFS_WORDLOG);
}
@@ -105,10 +107,10 @@ inline int
xfsum_copyout(
struct xfs_scrub *sc,
xfs_rtsumoff_t sumoff,
- xfs_suminfo_t *info,
+ union xfs_suminfo_ondisk *rawinfo,
unsigned int nr_words)
{
- return xfile_obj_load(sc->xfile, info, nr_words << XFS_WORDLOG,
+ return xfile_obj_load(sc->xfile, rawinfo, nr_words << XFS_WORDLOG,
sumoff << XFS_WORDLOG);
}
@@ -126,7 +128,7 @@ xchk_rtsum_record_free(
xfs_filblks_t rtlen;
xfs_rtsumoff_t offs;
unsigned int lenlog;
- xfs_suminfo_t v = 0;
+ union xfs_suminfo_ondisk v;
int error = 0;
if (xchk_should_terminate(sc, &error))
@@ -150,9 +152,9 @@ xchk_rtsum_record_free(
if (error)
return error;
- v++;
+ xfs_suminfo_add(mp, &v, 1);
trace_xchk_rtsum_record_free(mp, rec->ar_startext, rec->ar_extcount,
- lenlog, offs, v);
+ lenlog, offs, &v);
return xfsum_store(sc, offs, v);
}
@@ -187,7 +189,7 @@ xchk_rtsum_compare(
int nmap;
for (off = 0; off < XFS_B_TO_FSB(mp, mp->m_rsumsize); off++) {
- xfs_suminfo_t *ondisk_info;
+ union xfs_suminfo_ondisk *ondisk_info;
int error = 0;
if (xchk_should_terminate(sc, &error))
diff --git a/fs/xfs/scrub/rtsummary.h b/fs/xfs/scrub/rtsummary.h
index f5fd55992957..aca13556b3a2 100644
--- a/fs/xfs/scrub/rtsummary.h
+++ b/fs/xfs/scrub/rtsummary.h
@@ -9,6 +9,6 @@
typedef unsigned int xfs_rtsumoff_t;
int xfsum_copyout(struct xfs_scrub *sc, xfs_rtsumoff_t sumoff,
- xfs_suminfo_t *info, unsigned int nr_words);
+ union xfs_suminfo_ondisk *info, unsigned int nr_words);
#endif /* __XFS_SCRUB_RTSUMMARY_H__ */
diff --git a/fs/xfs/scrub/trace.c b/fs/xfs/scrub/trace.c
index 2e36fcc12e40..bb13f0a8e4cf 100644
--- a/fs/xfs/scrub/trace.c
+++ b/fs/xfs/scrub/trace.c
@@ -19,6 +19,7 @@
#include "xfs_da_format.h"
#include "xfs_btree_mem.h"
#include "xfs_rmap.h"
+#include "xfs_rtbitmap.h"
#include "scrub/scrub.h"
#include "scrub/xfile.h"
#include "scrub/xfarray.h"
diff --git a/fs/xfs/scrub/trace.h b/fs/xfs/scrub/trace.h
index 03e51fd7b767..5bc2cb4d4289 100644
--- a/fs/xfs/scrub/trace.h
+++ b/fs/xfs/scrub/trace.h
@@ -1008,7 +1008,7 @@ TRACE_EVENT(xfarray_sort_stats,
TRACE_EVENT(xchk_rtsum_record_free,
TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start,
xfs_rtbxlen_t len, unsigned int log, loff_t pos,
- xfs_suminfo_t v),
+ union xfs_suminfo_ondisk *v),
TP_ARGS(mp, start, len, log, pos, v),
TP_STRUCT__entry(
__field(dev_t, dev)
@@ -1026,7 +1026,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
__entry->len = len;
__entry->log = log;
__entry->pos = pos;
- __entry->v = v;
+ __entry->v = xfs_suminfo_get(mp, v);
),
TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u",
MAJOR(__entry->dev), MINOR(__entry->dev),
diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h
index 7239eb2242bb..ab0c00b63b47 100644
--- a/fs/xfs/xfs_ondisk.h
+++ b/fs/xfs/xfs_ondisk.h
@@ -74,6 +74,7 @@ xfs_check_ondisk_structs(void)
/* realtime structures */
XFS_CHECK_STRUCT_SIZE(union xfs_rtword_ondisk, 4);
+ XFS_CHECK_STRUCT_SIZE(union xfs_suminfo_ondisk, 4);
/*
* m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to