Commit 663b8db7 authored by Darrick J. Wong's avatar Darrick J. Wong

xfs: use accessor functions for summary info words

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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent bd85af28
...@@ -698,6 +698,14 @@ union xfs_rtword_raw { ...@@ -698,6 +698,14 @@ union xfs_rtword_raw {
__u32 old; __u32 old;
}; };
/*
* Realtime summary counts are accessed by the word, which is currently
* stored in host-endian format.
*/
union xfs_suminfo_raw {
__u32 old;
};
/* /*
* XFS Timestamps * XFS Timestamps
* ============== * ==============
......
...@@ -451,7 +451,6 @@ xfs_rtmodify_summary_int( ...@@ -451,7 +451,6 @@ xfs_rtmodify_summary_int(
int error; /* error value */ int error; /* error value */
xfs_fileoff_t sb; /* summary fsblock */ xfs_fileoff_t sb; /* summary fsblock */
xfs_rtsumoff_t so; /* index into the summary file */ xfs_rtsumoff_t so; /* index into the summary file */
xfs_suminfo_t *sp; /* pointer to returned data */
unsigned int infoword; unsigned int infoword;
/* /*
...@@ -490,19 +489,21 @@ xfs_rtmodify_summary_int( ...@@ -490,19 +489,21 @@ xfs_rtmodify_summary_int(
* Point to the summary information, modify/log it, and/or copy it out. * Point to the summary information, modify/log it, and/or copy it out.
*/ */
infoword = xfs_rtsumoffs_to_infoword(mp, so); infoword = xfs_rtsumoffs_to_infoword(mp, so);
sp = xfs_rsumblock_infoptr(bp, infoword);
if (delta) { if (delta) {
*sp += delta; xfs_suminfo_t val = xfs_suminfo_add(bp, infoword, delta);
if (mp->m_rsum_cache) { if (mp->m_rsum_cache) {
if (*sp == 0 && log == mp->m_rsum_cache[bbno]) if (val == 0 && log == mp->m_rsum_cache[bbno])
mp->m_rsum_cache[bbno]++; mp->m_rsum_cache[bbno]++;
if (*sp != 0 && log < mp->m_rsum_cache[bbno]) if (val != 0 && log < mp->m_rsum_cache[bbno])
mp->m_rsum_cache[bbno] = log; mp->m_rsum_cache[bbno] = log;
} }
xfs_trans_log_rtsummary(tp, bp, infoword); xfs_trans_log_rtsummary(tp, bp, infoword);
if (sum)
*sum = val;
} else if (sum) {
*sum = xfs_suminfo_get(bp, infoword);
} }
if (sum)
*sum = *sp;
return 0; return 0;
} }
......
...@@ -232,16 +232,40 @@ xfs_rtsumoffs_to_infoword( ...@@ -232,16 +232,40 @@ xfs_rtsumoffs_to_infoword(
} }
/* Return a pointer to a summary info word within a rt summary block. */ /* Return a pointer to a summary info word within a rt summary block. */
static inline xfs_suminfo_t * static inline union xfs_suminfo_raw *
xfs_rsumblock_infoptr( xfs_rsumblock_infoptr(
struct xfs_buf *bp, struct xfs_buf *bp,
unsigned int index) unsigned int index)
{ {
xfs_suminfo_t *info = bp->b_addr; union xfs_suminfo_raw *info = bp->b_addr;
return info + index; return info + index;
} }
/* Get the current value of a summary counter. */
static inline xfs_suminfo_t
xfs_suminfo_get(
struct xfs_buf *bp,
unsigned int index)
{
union xfs_suminfo_raw *info = xfs_rsumblock_infoptr(bp, index);
return info->old;
}
/* Add to the current value of a summary counter and return the new value. */
static inline xfs_suminfo_t
xfs_suminfo_add(
struct xfs_buf *bp,
unsigned int index,
int delta)
{
union xfs_suminfo_raw *info = xfs_rsumblock_infoptr(bp, index);
info->old += delta;
return info->old;
}
/* /*
* Functions for walking free space rtextents in the realtime bitmap. * Functions for walking free space rtextents in the realtime bitmap.
*/ */
......
...@@ -82,9 +82,10 @@ static inline int ...@@ -82,9 +82,10 @@ static inline int
xfsum_load( xfsum_load(
struct xfs_scrub *sc, struct xfs_scrub *sc,
xfs_rtsumoff_t sumoff, xfs_rtsumoff_t sumoff,
xfs_suminfo_t *info) union xfs_suminfo_raw *rawinfo)
{ {
return xfile_obj_load(sc->xfile, info, sizeof(xfs_suminfo_t), return xfile_obj_load(sc->xfile, rawinfo,
sizeof(union xfs_suminfo_raw),
sumoff << XFS_WORDLOG); sumoff << XFS_WORDLOG);
} }
...@@ -92,9 +93,10 @@ static inline int ...@@ -92,9 +93,10 @@ static inline int
xfsum_store( xfsum_store(
struct xfs_scrub *sc, struct xfs_scrub *sc,
xfs_rtsumoff_t sumoff, xfs_rtsumoff_t sumoff,
const xfs_suminfo_t info) const union xfs_suminfo_raw rawinfo)
{ {
return xfile_obj_store(sc->xfile, &info, sizeof(xfs_suminfo_t), return xfile_obj_store(sc->xfile, &rawinfo,
sizeof(union xfs_suminfo_raw),
sumoff << XFS_WORDLOG); sumoff << XFS_WORDLOG);
} }
...@@ -102,13 +104,22 @@ static inline int ...@@ -102,13 +104,22 @@ static inline int
xfsum_copyout( xfsum_copyout(
struct xfs_scrub *sc, struct xfs_scrub *sc,
xfs_rtsumoff_t sumoff, xfs_rtsumoff_t sumoff,
xfs_suminfo_t *info, union xfs_suminfo_raw *rawinfo,
unsigned int nr_words) 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); sumoff << XFS_WORDLOG);
} }
static inline xfs_suminfo_t
xchk_rtsum_inc(
struct xfs_mount *mp,
union xfs_suminfo_raw *v)
{
v->old += 1;
return v->old;
}
/* Update the summary file to reflect the free extent that we've accumulated. */ /* Update the summary file to reflect the free extent that we've accumulated. */
STATIC int STATIC int
xchk_rtsum_record_free( xchk_rtsum_record_free(
...@@ -123,7 +134,8 @@ xchk_rtsum_record_free( ...@@ -123,7 +134,8 @@ xchk_rtsum_record_free(
xfs_filblks_t rtlen; xfs_filblks_t rtlen;
xfs_rtsumoff_t offs; xfs_rtsumoff_t offs;
unsigned int lenlog; unsigned int lenlog;
xfs_suminfo_t v = 0; union xfs_suminfo_raw v;
xfs_suminfo_t value;
int error = 0; int error = 0;
if (xchk_should_terminate(sc, &error)) if (xchk_should_terminate(sc, &error))
...@@ -147,9 +159,9 @@ xchk_rtsum_record_free( ...@@ -147,9 +159,9 @@ xchk_rtsum_record_free(
if (error) if (error)
return error; return error;
v++; value = xchk_rtsum_inc(sc->mp, &v);
trace_xchk_rtsum_record_free(mp, rec->ar_startext, rec->ar_extcount, trace_xchk_rtsum_record_free(mp, rec->ar_startext, rec->ar_extcount,
lenlog, offs, v); lenlog, offs, value);
return xfsum_store(sc, offs, v); return xfsum_store(sc, offs, v);
} }
...@@ -184,7 +196,7 @@ xchk_rtsum_compare( ...@@ -184,7 +196,7 @@ xchk_rtsum_compare(
int nmap; int nmap;
for (off = 0; off < XFS_B_TO_FSB(mp, mp->m_rsumsize); off++) { for (off = 0; off < XFS_B_TO_FSB(mp, mp->m_rsumsize); off++) {
xfs_suminfo_t *ondisk_info; union xfs_suminfo_raw *ondisk_info;
int error = 0; int error = 0;
if (xchk_should_terminate(sc, &error)) if (xchk_should_terminate(sc, &error))
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "xfs_inode.h" #include "xfs_inode.h"
#include "xfs_btree.h" #include "xfs_btree.h"
#include "xfs_ag.h" #include "xfs_ag.h"
#include "xfs_rtbitmap.h"
#include "scrub/scrub.h" #include "scrub/scrub.h"
#include "scrub/xfile.h" #include "scrub/xfile.h"
#include "scrub/xfarray.h" #include "scrub/xfarray.h"
......
...@@ -1038,8 +1038,8 @@ TRACE_EVENT(xfarray_sort_stats, ...@@ -1038,8 +1038,8 @@ TRACE_EVENT(xfarray_sort_stats,
TRACE_EVENT(xchk_rtsum_record_free, TRACE_EVENT(xchk_rtsum_record_free,
TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start, TP_PROTO(struct xfs_mount *mp, xfs_rtxnum_t start,
xfs_rtbxlen_t len, unsigned int log, loff_t pos, xfs_rtbxlen_t len, unsigned int log, loff_t pos,
xfs_suminfo_t v), xfs_suminfo_t value),
TP_ARGS(mp, start, len, log, pos, v), TP_ARGS(mp, start, len, log, pos, value),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(dev_t, dev) __field(dev_t, dev)
__field(dev_t, rtdev) __field(dev_t, rtdev)
...@@ -1047,7 +1047,7 @@ TRACE_EVENT(xchk_rtsum_record_free, ...@@ -1047,7 +1047,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
__field(unsigned long long, len) __field(unsigned long long, len)
__field(unsigned int, log) __field(unsigned int, log)
__field(loff_t, pos) __field(loff_t, pos)
__field(xfs_suminfo_t, v) __field(xfs_suminfo_t, value)
), ),
TP_fast_assign( TP_fast_assign(
__entry->dev = mp->m_super->s_dev; __entry->dev = mp->m_super->s_dev;
...@@ -1056,7 +1056,7 @@ TRACE_EVENT(xchk_rtsum_record_free, ...@@ -1056,7 +1056,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
__entry->len = len; __entry->len = len;
__entry->log = log; __entry->log = log;
__entry->pos = pos; __entry->pos = pos;
__entry->v = v; __entry->value = value;
), ),
TP_printk("dev %d:%d rtdev %d:%d rtx 0x%llx rtxcount 0x%llx log %u rsumpos 0x%llx sumcount %u", 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), MAJOR(__entry->dev), MINOR(__entry->dev),
...@@ -1065,7 +1065,7 @@ TRACE_EVENT(xchk_rtsum_record_free, ...@@ -1065,7 +1065,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
__entry->len, __entry->len,
__entry->log, __entry->log,
__entry->pos, __entry->pos,
__entry->v) __entry->value)
); );
#endif /* CONFIG_XFS_RT */ #endif /* CONFIG_XFS_RT */
......
...@@ -74,6 +74,7 @@ xfs_check_ondisk_structs(void) ...@@ -74,6 +74,7 @@ xfs_check_ondisk_structs(void)
/* realtime structures */ /* realtime structures */
XFS_CHECK_STRUCT_SIZE(union xfs_rtword_raw, 4); XFS_CHECK_STRUCT_SIZE(union xfs_rtword_raw, 4);
XFS_CHECK_STRUCT_SIZE(union xfs_suminfo_raw, 4);
/* /*
* m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to * m68k has problems with xfs_attr_leaf_name_remote_t, but we pad it to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment