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

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
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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
 * ==============
+8 −7
Original line number Diff line number Diff line
@@ -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 = *sp;
			*sum = val;
	} else if (sum) {
		*sum = xfs_suminfo_get(bp, infoword);
	}
	return 0;
}

+26 −2
Original line number Diff line number Diff line
@@ -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.
 */
+22 −10
Original line number Diff line number Diff line
@@ -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))
+1 −0
Original line number Diff line number Diff line
@@ -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"
Loading