2023-12-15 10:03:43 -08:00
|
|
|
// 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__
|
|
|
|
|
2024-11-20 16:20:41 -08:00
|
|
|
/*
|
|
|
|
* 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)
|
|
|
|
|
|
|
|
|
2023-12-15 10:03:43 -08:00
|
|
|
struct xchk_rtbitmap {
|
2024-11-20 16:20:36 -08:00
|
|
|
struct xfs_scrub *sc;
|
|
|
|
|
2023-12-15 10:03:43 -08:00
|
|
|
uint64_t rextents;
|
|
|
|
uint64_t rbmblocks;
|
|
|
|
unsigned int rextslog;
|
|
|
|
unsigned int resblks;
|
2024-11-20 16:20:36 -08:00
|
|
|
|
|
|
|
/* The next free rt group block number that we expect to see. */
|
|
|
|
xfs_rgblock_t next_free_rgbno;
|
2024-11-20 16:20:41 -08:00
|
|
|
|
|
|
|
#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[];
|
2023-12-15 10:03:43 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
#ifdef CONFIG_XFS_ONLINE_REPAIR
|
|
|
|
int xrep_setup_rtbitmap(struct xfs_scrub *sc, struct xchk_rtbitmap *rtb);
|
2024-11-20 16:20:41 -08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 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;
|
|
|
|
}
|
2023-12-15 10:03:43 -08:00
|
|
|
#else
|
|
|
|
# define xrep_setup_rtbitmap(sc, rtb) (0)
|
2024-11-20 16:20:41 -08:00
|
|
|
# define xchk_rtbitmap_wordcnt(sc) (0)
|
2023-12-15 10:03:43 -08:00
|
|
|
#endif /* CONFIG_XFS_ONLINE_REPAIR */
|
|
|
|
|
|
|
|
#endif /* __XFS_SCRUB_RTBITMAP_H__ */
|