blob: fe52b877253d356bf1df49d3ac32b6cf46cf4d03 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2023 Oracle. All Rights Reserved.
* Author: Darrick J. Wong <[email protected]>
*/
#ifndef __XFS_SCRUB_RTBITMAP_H__
#define __XFS_SCRUB_RTBITMAP_H__
/*
* We use an xfile to construct new bitmap blocks for the portion of the
* rtbitmap file that we're replacing. Whereas the ondisk bitmap must be
* accessed through the buffer cache, the xfile bitmap supports direct
* word-level accesses. Therefore, we create a small abstraction for linear
* access.
*/
typedef unsigned long long xrep_wordoff_t;
typedef unsigned int xrep_wordcnt_t;
/* Mask to round an rtx down to the nearest bitmap word. */
#define XREP_RTBMP_WORDMASK ((1ULL << XFS_NBWORDLOG) - 1)
struct xchk_rtbitmap {
struct xfs_scrub *sc;
uint64_t rextents;
uint64_t rbmblocks;
unsigned int rextslog;
unsigned int resblks;
/* The next free rt group block number that we expect to see. */
xfs_rgblock_t next_free_rgbno;
#ifdef CONFIG_XFS_ONLINE_REPAIR
/* stuff for staging a new bitmap */
struct xfs_rtalloc_args args;
struct xrep_tempexch tempexch;
#endif
/* The next rtgroup block we expect to see during our rtrmapbt walk. */
xfs_rgblock_t next_rgbno;
/* rtgroup lock flags */
unsigned int rtglock_flags;
/* rtword position of xfile as we write buffers to disk. */
xrep_wordoff_t prep_wordoff;
/* In-Memory rtbitmap for repair. */
union xfs_rtword_raw words[];
};
#ifdef CONFIG_XFS_ONLINE_REPAIR
int xrep_setup_rtbitmap(struct xfs_scrub *sc, struct xchk_rtbitmap *rtb);
/*
* How big should the words[] buffer be?
*
* For repairs, we want a full fsblock worth of space so that we can memcpy a
* buffer full of 1s into the xfile bitmap. The xfile bitmap doesn't have
* rtbitmap block headers, so we don't use blockwsize. Scrub doesn't use the
* words buffer at all.
*/
static inline unsigned int
xchk_rtbitmap_wordcnt(
struct xfs_scrub *sc)
{
if (xchk_could_repair(sc))
return sc->mp->m_sb.sb_blocksize >> XFS_WORDLOG;
return 0;
}
#else
# define xrep_setup_rtbitmap(sc, rtb) (0)
# define xchk_rtbitmap_wordcnt(sc) (0)
#endif /* CONFIG_XFS_ONLINE_REPAIR */
#endif /* __XFS_SCRUB_RTBITMAP_H__ */