-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
xfs: move the per-AG datatype bitmaps to separate files
Move struct xagb_bitmap to its own pair of C and header files per request of Christoph. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
- Loading branch information
Darrick J. Wong
committed
Dec 15, 2023
1 parent
6ece924
commit 0f08af0
Showing
8 changed files
with
175 additions
and
150 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
/* | ||
* Copyright (C) 2018-2023 Oracle. All Rights Reserved. | ||
* Author: Darrick J. Wong <djwong@kernel.org> | ||
*/ | ||
#include "xfs.h" | ||
#include "xfs_shared.h" | ||
#include "xfs_bit.h" | ||
#include "xfs_format.h" | ||
#include "xfs_trans_resv.h" | ||
#include "xfs_mount.h" | ||
#include "xfs_btree.h" | ||
#include "bitmap.h" | ||
#include "scrub/agb_bitmap.h" | ||
|
||
/* | ||
* Record all btree blocks seen while iterating all records of a btree. | ||
* | ||
* We know that the btree query_all function starts at the left edge and walks | ||
* towards the right edge of the tree. Therefore, we know that we can walk up | ||
* the btree cursor towards the root; if the pointer for a given level points | ||
* to the first record/key in that block, we haven't seen this block before; | ||
* and therefore we need to remember that we saw this block in the btree. | ||
* | ||
* So if our btree is: | ||
* | ||
* 4 | ||
* / | \ | ||
* 1 2 3 | ||
* | ||
* Pretend for this example that each leaf block has 100 btree records. For | ||
* the first btree record, we'll observe that bc_levels[0].ptr == 1, so we | ||
* record that we saw block 1. Then we observe that bc_levels[1].ptr == 1, so | ||
* we record block 4. The list is [1, 4]. | ||
* | ||
* For the second btree record, we see that bc_levels[0].ptr == 2, so we exit | ||
* the loop. The list remains [1, 4]. | ||
* | ||
* For the 101st btree record, we've moved onto leaf block 2. Now | ||
* bc_levels[0].ptr == 1 again, so we record that we saw block 2. We see that | ||
* bc_levels[1].ptr == 2, so we exit the loop. The list is now [1, 4, 2]. | ||
* | ||
* For the 102nd record, bc_levels[0].ptr == 2, so we continue. | ||
* | ||
* For the 201st record, we've moved on to leaf block 3. | ||
* bc_levels[0].ptr == 1, so we add 3 to the list. Now it is [1, 4, 2, 3]. | ||
* | ||
* For the 300th record we just exit, with the list being [1, 4, 2, 3]. | ||
*/ | ||
|
||
/* Mark a btree block to the agblock bitmap. */ | ||
STATIC int | ||
xagb_bitmap_visit_btblock( | ||
struct xfs_btree_cur *cur, | ||
int level, | ||
void *priv) | ||
{ | ||
struct xagb_bitmap *bitmap = priv; | ||
struct xfs_buf *bp; | ||
xfs_fsblock_t fsbno; | ||
xfs_agblock_t agbno; | ||
|
||
xfs_btree_get_block(cur, level, &bp); | ||
if (!bp) | ||
return 0; | ||
|
||
fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp)); | ||
agbno = XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno); | ||
|
||
return xagb_bitmap_set(bitmap, agbno, 1); | ||
} | ||
|
||
/* Mark all (per-AG) btree blocks in the agblock bitmap. */ | ||
int | ||
xagb_bitmap_set_btblocks( | ||
struct xagb_bitmap *bitmap, | ||
struct xfs_btree_cur *cur) | ||
{ | ||
return xfs_btree_visit_blocks(cur, xagb_bitmap_visit_btblock, | ||
XFS_BTREE_VISIT_ALL, bitmap); | ||
} | ||
|
||
/* | ||
* Record all the buffers pointed to by the btree cursor. Callers already | ||
* engaged in a btree walk should call this function to capture the list of | ||
* blocks going from the leaf towards the root. | ||
*/ | ||
int | ||
xagb_bitmap_set_btcur_path( | ||
struct xagb_bitmap *bitmap, | ||
struct xfs_btree_cur *cur) | ||
{ | ||
int i; | ||
int error; | ||
|
||
for (i = 0; i < cur->bc_nlevels && cur->bc_levels[i].ptr == 1; i++) { | ||
error = xagb_bitmap_visit_btblock(cur, i, bitmap); | ||
if (error) | ||
return error; | ||
} | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
/* | ||
* Copyright (C) 2018-2023 Oracle. All Rights Reserved. | ||
* Author: Darrick J. Wong <djwong@kernel.org> | ||
*/ | ||
#ifndef __XFS_SCRUB_AGB_BITMAP_H__ | ||
#define __XFS_SCRUB_AGB_BITMAP_H__ | ||
|
||
/* Bitmaps, but for type-checked for xfs_agblock_t */ | ||
|
||
struct xagb_bitmap { | ||
struct xbitmap32 agbitmap; | ||
}; | ||
|
||
static inline void xagb_bitmap_init(struct xagb_bitmap *bitmap) | ||
{ | ||
xbitmap32_init(&bitmap->agbitmap); | ||
} | ||
|
||
static inline void xagb_bitmap_destroy(struct xagb_bitmap *bitmap) | ||
{ | ||
xbitmap32_destroy(&bitmap->agbitmap); | ||
} | ||
|
||
static inline int xagb_bitmap_clear(struct xagb_bitmap *bitmap, | ||
xfs_agblock_t start, xfs_extlen_t len) | ||
{ | ||
return xbitmap32_clear(&bitmap->agbitmap, start, len); | ||
} | ||
static inline int xagb_bitmap_set(struct xagb_bitmap *bitmap, | ||
xfs_agblock_t start, xfs_extlen_t len) | ||
{ | ||
return xbitmap32_set(&bitmap->agbitmap, start, len); | ||
} | ||
|
||
static inline bool xagb_bitmap_test(struct xagb_bitmap *bitmap, | ||
xfs_agblock_t start, xfs_extlen_t *len) | ||
{ | ||
return xbitmap32_test(&bitmap->agbitmap, start, len); | ||
} | ||
|
||
static inline int xagb_bitmap_disunion(struct xagb_bitmap *bitmap, | ||
struct xagb_bitmap *sub) | ||
{ | ||
return xbitmap32_disunion(&bitmap->agbitmap, &sub->agbitmap); | ||
} | ||
|
||
static inline uint32_t xagb_bitmap_hweight(struct xagb_bitmap *bitmap) | ||
{ | ||
return xbitmap32_hweight(&bitmap->agbitmap); | ||
} | ||
static inline bool xagb_bitmap_empty(struct xagb_bitmap *bitmap) | ||
{ | ||
return xbitmap32_empty(&bitmap->agbitmap); | ||
} | ||
|
||
static inline int xagb_bitmap_walk(struct xagb_bitmap *bitmap, | ||
xbitmap32_walk_fn fn, void *priv) | ||
{ | ||
return xbitmap32_walk(&bitmap->agbitmap, fn, priv); | ||
} | ||
|
||
int xagb_bitmap_set_btblocks(struct xagb_bitmap *bitmap, | ||
struct xfs_btree_cur *cur); | ||
int xagb_bitmap_set_btcur_path(struct xagb_bitmap *bitmap, | ||
struct xfs_btree_cur *cur); | ||
|
||
#endif /* __XFS_SCRUB_AGB_BITMAP_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters