xfs: create a ranged query function for refcount btrees
Implement ranged queries for refcount records. The next patch will use this to scan refcount data. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
48a72f6086
commit
d12bf8bac8
@ -2031,6 +2031,47 @@ xfs_refcount_has_records(
|
||||
return xfs_btree_has_records(cur, &low, &high, NULL, outcome);
|
||||
}
|
||||
|
||||
struct xfs_refcount_query_range_info {
|
||||
xfs_refcount_query_range_fn fn;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
/* Format btree record and pass to our callback. */
|
||||
STATIC int
|
||||
xfs_refcount_query_range_helper(
|
||||
struct xfs_btree_cur *cur,
|
||||
const union xfs_btree_rec *rec,
|
||||
void *priv)
|
||||
{
|
||||
struct xfs_refcount_query_range_info *query = priv;
|
||||
struct xfs_refcount_irec irec;
|
||||
xfs_failaddr_t fa;
|
||||
|
||||
xfs_refcount_btrec_to_irec(rec, &irec);
|
||||
fa = xfs_refcount_check_irec(cur->bc_ag.pag, &irec);
|
||||
if (fa)
|
||||
return xfs_refcount_complain_bad_rec(cur, fa, &irec);
|
||||
|
||||
return query->fn(cur, &irec, query->priv);
|
||||
}
|
||||
|
||||
/* Find all refcount records between two keys. */
|
||||
int
|
||||
xfs_refcount_query_range(
|
||||
struct xfs_btree_cur *cur,
|
||||
const struct xfs_refcount_irec *low_rec,
|
||||
const struct xfs_refcount_irec *high_rec,
|
||||
xfs_refcount_query_range_fn fn,
|
||||
void *priv)
|
||||
{
|
||||
union xfs_btree_irec low_brec = { .rc = *low_rec };
|
||||
union xfs_btree_irec high_brec = { .rc = *high_rec };
|
||||
struct xfs_refcount_query_range_info query = { .priv = priv, .fn = fn };
|
||||
|
||||
return xfs_btree_query_range(cur, &low_brec, &high_brec,
|
||||
xfs_refcount_query_range_helper, &query);
|
||||
}
|
||||
|
||||
int __init
|
||||
xfs_refcount_intent_init_cache(void)
|
||||
{
|
||||
|
@ -127,4 +127,14 @@ extern struct kmem_cache *xfs_refcount_intent_cache;
|
||||
int __init xfs_refcount_intent_init_cache(void);
|
||||
void xfs_refcount_intent_destroy_cache(void);
|
||||
|
||||
typedef int (*xfs_refcount_query_range_fn)(
|
||||
struct xfs_btree_cur *cur,
|
||||
const struct xfs_refcount_irec *rec,
|
||||
void *priv);
|
||||
|
||||
int xfs_refcount_query_range(struct xfs_btree_cur *cur,
|
||||
const struct xfs_refcount_irec *low_rec,
|
||||
const struct xfs_refcount_irec *high_rec,
|
||||
xfs_refcount_query_range_fn fn, void *priv);
|
||||
|
||||
#endif /* __XFS_REFCOUNT_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user