mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 21:35:07 +00:00
xfs: provide a query_range function for freespace btrees
Implement a query_range function for the bnobt and cntbt. This will be used for getfsmap fallback if there is no rmapbt and by the online scrub and repair code. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
parent
08438b1e38
commit
2d520bfaa2
@ -2868,3 +2868,45 @@ err:
|
||||
xfs_trans_brelse(tp, agbp);
|
||||
return error;
|
||||
}
|
||||
|
||||
struct xfs_alloc_query_range_info {
|
||||
xfs_alloc_query_range_fn fn;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
/* Format btree record and pass to our callback. */
|
||||
STATIC int
|
||||
xfs_alloc_query_range_helper(
|
||||
struct xfs_btree_cur *cur,
|
||||
union xfs_btree_rec *rec,
|
||||
void *priv)
|
||||
{
|
||||
struct xfs_alloc_query_range_info *query = priv;
|
||||
struct xfs_alloc_rec_incore irec;
|
||||
|
||||
irec.ar_startblock = be32_to_cpu(rec->alloc.ar_startblock);
|
||||
irec.ar_blockcount = be32_to_cpu(rec->alloc.ar_blockcount);
|
||||
return query->fn(cur, &irec, query->priv);
|
||||
}
|
||||
|
||||
/* Find all free space within a given range of blocks. */
|
||||
int
|
||||
xfs_alloc_query_range(
|
||||
struct xfs_btree_cur *cur,
|
||||
struct xfs_alloc_rec_incore *low_rec,
|
||||
struct xfs_alloc_rec_incore *high_rec,
|
||||
xfs_alloc_query_range_fn fn,
|
||||
void *priv)
|
||||
{
|
||||
union xfs_btree_irec low_brec;
|
||||
union xfs_btree_irec high_brec;
|
||||
struct xfs_alloc_query_range_info query;
|
||||
|
||||
ASSERT(cur->bc_btnum == XFS_BTNUM_BNO);
|
||||
low_brec.a = *low_rec;
|
||||
high_brec.a = *high_rec;
|
||||
query.priv = priv;
|
||||
query.fn = fn;
|
||||
return xfs_btree_query_range(cur, &low_brec, &high_brec,
|
||||
xfs_alloc_query_range_helper, &query);
|
||||
}
|
||||
|
@ -219,4 +219,14 @@ int xfs_free_extent_fix_freelist(struct xfs_trans *tp, xfs_agnumber_t agno,
|
||||
|
||||
xfs_extlen_t xfs_prealloc_blocks(struct xfs_mount *mp);
|
||||
|
||||
typedef int (*xfs_alloc_query_range_fn)(
|
||||
struct xfs_btree_cur *cur,
|
||||
struct xfs_alloc_rec_incore *rec,
|
||||
void *priv);
|
||||
|
||||
int xfs_alloc_query_range(struct xfs_btree_cur *cur,
|
||||
struct xfs_alloc_rec_incore *low_rec,
|
||||
struct xfs_alloc_rec_incore *high_rec,
|
||||
xfs_alloc_query_range_fn fn, void *priv);
|
||||
|
||||
#endif /* __XFS_ALLOC_H__ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user