| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // SPDX-License-Identifier: GPL-2.0-or-later
- /*
- * Copyright (C) 2023 Oracle. All Rights Reserved.
- * Author: Darrick J. Wong <djwong@kernel.org>
- */
- #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__ */
|