Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2023 Oracle. All Rights Reserved.
4 * Author: Darrick J. Wong <djwong@kernel.org>
5 */
6#ifndef __XFS_SCRUB_RTBITMAP_H__
7#define __XFS_SCRUB_RTBITMAP_H__
8
9/*
10 * We use an xfile to construct new bitmap blocks for the portion of the
11 * rtbitmap file that we're replacing. Whereas the ondisk bitmap must be
12 * accessed through the buffer cache, the xfile bitmap supports direct
13 * word-level accesses. Therefore, we create a small abstraction for linear
14 * access.
15 */
16typedef unsigned long long xrep_wordoff_t;
17typedef unsigned int xrep_wordcnt_t;
18
19/* Mask to round an rtx down to the nearest bitmap word. */
20#define XREP_RTBMP_WORDMASK ((1ULL << XFS_NBWORDLOG) - 1)
21
22
23struct xchk_rtbitmap {
24 struct xfs_scrub *sc;
25
26 uint64_t rextents;
27 uint64_t rbmblocks;
28 unsigned int rextslog;
29 unsigned int resblks;
30
31 /* The next free rt group block number that we expect to see. */
32 xfs_rgblock_t next_free_rgbno;
33
34#ifdef CONFIG_XFS_ONLINE_REPAIR
35 /* stuff for staging a new bitmap */
36 struct xfs_rtalloc_args args;
37 struct xrep_tempexch tempexch;
38#endif
39
40 /* The next rtgroup block we expect to see during our rtrmapbt walk. */
41 xfs_rgblock_t next_rgbno;
42
43 /* rtgroup lock flags */
44 unsigned int rtglock_flags;
45
46 /* rtword position of xfile as we write buffers to disk. */
47 xrep_wordoff_t prep_wordoff;
48
49 /* In-Memory rtbitmap for repair. */
50 union xfs_rtword_raw words[];
51};
52
53#ifdef CONFIG_XFS_ONLINE_REPAIR
54int xrep_setup_rtbitmap(struct xfs_scrub *sc, struct xchk_rtbitmap *rtb);
55
56/*
57 * How big should the words[] buffer be?
58 *
59 * For repairs, we want a full fsblock worth of space so that we can memcpy a
60 * buffer full of 1s into the xfile bitmap. The xfile bitmap doesn't have
61 * rtbitmap block headers, so we don't use blockwsize. Scrub doesn't use the
62 * words buffer at all.
63 */
64static inline unsigned int
65xchk_rtbitmap_wordcnt(
66 struct xfs_scrub *sc)
67{
68 if (xchk_could_repair(sc))
69 return sc->mp->m_sb.sb_blocksize >> XFS_WORDLOG;
70 return 0;
71}
72#else
73# define xrep_setup_rtbitmap(sc, rtb) (0)
74# define xchk_rtbitmap_wordcnt(sc) (0)
75#endif /* CONFIG_XFS_ONLINE_REPAIR */
76
77#endif /* __XFS_SCRUB_RTBITMAP_H__ */