mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-11 15:49:56 +00:00
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: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
bd85af280d
commit
663b8db7b0
@ -698,6 +698,14 @@ union xfs_rtword_raw {
|
||||
__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
|
||||
* ==============
|
||||
|
@ -451,7 +451,6 @@ 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 */
|
||||
unsigned int infoword;
|
||||
|
||||
/*
|
||||
@ -490,19 +489,21 @@ xfs_rtmodify_summary_int(
|
||||
* Point to the summary information, modify/log it, and/or copy it out.
|
||||
*/
|
||||
infoword = xfs_rtsumoffs_to_infoword(mp, so);
|
||||
sp = xfs_rsumblock_infoptr(bp, infoword);
|
||||
if (delta) {
|
||||
*sp += delta;
|
||||
xfs_suminfo_t val = xfs_suminfo_add(bp, infoword, delta);
|
||||
|
||||
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]++;
|
||||
if (*sp != 0 && log < mp->m_rsum_cache[bbno])
|
||||
if (val != 0 && log < mp->m_rsum_cache[bbno])
|
||||
mp->m_rsum_cache[bbno] = log;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -232,16 +232,40 @@ xfs_rtsumoffs_to_infoword(
|
||||
}
|
||||
|
||||
/* 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(
|
||||
struct xfs_buf *bp,
|
||||
unsigned int index)
|
||||
{
|
||||
xfs_suminfo_t *info = bp->b_addr;
|
||||
union xfs_suminfo_raw *info = bp->b_addr;
|
||||
|
||||
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.
|
||||
*/
|
||||
|
@ -82,9 +82,10 @@ static inline int
|
||||
xfsum_load(
|
||||
struct xfs_scrub *sc,
|
||||
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);
|
||||
}
|
||||
|
||||
@ -92,9 +93,10 @@ static inline int
|
||||
xfsum_store(
|
||||
struct xfs_scrub *sc,
|
||||
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);
|
||||
}
|
||||
|
||||
@ -102,13 +104,22 @@ static inline int
|
||||
xfsum_copyout(
|
||||
struct xfs_scrub *sc,
|
||||
xfs_rtsumoff_t sumoff,
|
||||
xfs_suminfo_t *info,
|
||||
union xfs_suminfo_raw *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);
|
||||
}
|
||||
|
||||
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. */
|
||||
STATIC int
|
||||
xchk_rtsum_record_free(
|
||||
@ -123,7 +134,8 @@ xchk_rtsum_record_free(
|
||||
xfs_filblks_t rtlen;
|
||||
xfs_rtsumoff_t offs;
|
||||
unsigned int lenlog;
|
||||
xfs_suminfo_t v = 0;
|
||||
union xfs_suminfo_raw v;
|
||||
xfs_suminfo_t value;
|
||||
int error = 0;
|
||||
|
||||
if (xchk_should_terminate(sc, &error))
|
||||
@ -147,9 +159,9 @@ xchk_rtsum_record_free(
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
v++;
|
||||
value = xchk_rtsum_inc(sc->mp, &v);
|
||||
trace_xchk_rtsum_record_free(mp, rec->ar_startext, rec->ar_extcount,
|
||||
lenlog, offs, v);
|
||||
lenlog, offs, value);
|
||||
|
||||
return xfsum_store(sc, offs, v);
|
||||
}
|
||||
@ -184,7 +196,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_raw *ondisk_info;
|
||||
int error = 0;
|
||||
|
||||
if (xchk_should_terminate(sc, &error))
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "xfs_inode.h"
|
||||
#include "xfs_btree.h"
|
||||
#include "xfs_ag.h"
|
||||
#include "xfs_rtbitmap.h"
|
||||
#include "scrub/scrub.h"
|
||||
#include "scrub/xfile.h"
|
||||
#include "scrub/xfarray.h"
|
||||
|
@ -1038,8 +1038,8 @@ 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),
|
||||
TP_ARGS(mp, start, len, log, pos, v),
|
||||
xfs_suminfo_t value),
|
||||
TP_ARGS(mp, start, len, log, pos, value),
|
||||
TP_STRUCT__entry(
|
||||
__field(dev_t, dev)
|
||||
__field(dev_t, rtdev)
|
||||
@ -1047,7 +1047,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
|
||||
__field(unsigned long long, len)
|
||||
__field(unsigned int, log)
|
||||
__field(loff_t, pos)
|
||||
__field(xfs_suminfo_t, v)
|
||||
__field(xfs_suminfo_t, value)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->dev = mp->m_super->s_dev;
|
||||
@ -1056,7 +1056,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
|
||||
__entry->len = len;
|
||||
__entry->log = log;
|
||||
__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",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
@ -1065,7 +1065,7 @@ TRACE_EVENT(xchk_rtsum_record_free,
|
||||
__entry->len,
|
||||
__entry->log,
|
||||
__entry->pos,
|
||||
__entry->v)
|
||||
__entry->value)
|
||||
);
|
||||
#endif /* CONFIG_XFS_RT */
|
||||
|
||||
|
@ -74,6 +74,7 @@ xfs_check_ondisk_structs(void)
|
||||
|
||||
/* realtime structures */
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user