mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-17 20:54:10 +00:00
xfs: add scrub cross-referencing helpers for the free space btrees
Add a couple of functions to the free space btrees that will be used to cross-reference metadata against the bnobt/cntbt, and a generic btree function that provides the real implementation. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
c468562879
commit
ce1d802e6a
4 changed files with 62 additions and 1 deletions
|
@ -167,7 +167,7 @@ xfs_alloc_lookup_ge(
|
||||||
* Lookup the first record less than or equal to [bno, len]
|
* Lookup the first record less than or equal to [bno, len]
|
||||||
* in the btree given by cur.
|
* in the btree given by cur.
|
||||||
*/
|
*/
|
||||||
static int /* error */
|
int /* error */
|
||||||
xfs_alloc_lookup_le(
|
xfs_alloc_lookup_le(
|
||||||
struct xfs_btree_cur *cur, /* btree cursor */
|
struct xfs_btree_cur *cur, /* btree cursor */
|
||||||
xfs_agblock_t bno, /* starting block of extent */
|
xfs_agblock_t bno, /* starting block of extent */
|
||||||
|
@ -2996,3 +2996,22 @@ xfs_verify_fsbno(
|
||||||
return false;
|
return false;
|
||||||
return xfs_verify_agbno(mp, agno, XFS_FSB_TO_AGBNO(mp, fsbno));
|
return xfs_verify_agbno(mp, agno, XFS_FSB_TO_AGBNO(mp, fsbno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Is there a record covering a given extent? */
|
||||||
|
int
|
||||||
|
xfs_alloc_has_record(
|
||||||
|
struct xfs_btree_cur *cur,
|
||||||
|
xfs_agblock_t bno,
|
||||||
|
xfs_extlen_t len,
|
||||||
|
bool *exists)
|
||||||
|
{
|
||||||
|
union xfs_btree_irec low;
|
||||||
|
union xfs_btree_irec high;
|
||||||
|
|
||||||
|
memset(&low, 0, sizeof(low));
|
||||||
|
low.a.ar_startblock = bno;
|
||||||
|
memset(&high, 0xFF, sizeof(high));
|
||||||
|
high.a.ar_startblock = bno + len - 1;
|
||||||
|
|
||||||
|
return xfs_btree_has_record(cur, &low, &high, exists);
|
||||||
|
}
|
||||||
|
|
|
@ -197,6 +197,13 @@ xfs_free_extent(
|
||||||
struct xfs_owner_info *oinfo, /* extent owner */
|
struct xfs_owner_info *oinfo, /* extent owner */
|
||||||
enum xfs_ag_resv_type type); /* block reservation type */
|
enum xfs_ag_resv_type type); /* block reservation type */
|
||||||
|
|
||||||
|
int /* error */
|
||||||
|
xfs_alloc_lookup_le(
|
||||||
|
struct xfs_btree_cur *cur, /* btree cursor */
|
||||||
|
xfs_agblock_t bno, /* starting block of extent */
|
||||||
|
xfs_extlen_t len, /* length of extent */
|
||||||
|
int *stat); /* success/failure */
|
||||||
|
|
||||||
int /* error */
|
int /* error */
|
||||||
xfs_alloc_lookup_ge(
|
xfs_alloc_lookup_ge(
|
||||||
struct xfs_btree_cur *cur, /* btree cursor */
|
struct xfs_btree_cur *cur, /* btree cursor */
|
||||||
|
@ -237,4 +244,7 @@ bool xfs_verify_agbno(struct xfs_mount *mp, xfs_agnumber_t agno,
|
||||||
xfs_agblock_t agbno);
|
xfs_agblock_t agbno);
|
||||||
bool xfs_verify_fsbno(struct xfs_mount *mp, xfs_fsblock_t fsbno);
|
bool xfs_verify_fsbno(struct xfs_mount *mp, xfs_fsblock_t fsbno);
|
||||||
|
|
||||||
|
int xfs_alloc_has_record(struct xfs_btree_cur *cur, xfs_agblock_t bno,
|
||||||
|
xfs_extlen_t len, bool *exist);
|
||||||
|
|
||||||
#endif /* __XFS_ALLOC_H__ */
|
#endif /* __XFS_ALLOC_H__ */
|
||||||
|
|
|
@ -4998,3 +4998,33 @@ xfs_btree_diff_two_ptrs(
|
||||||
return (int64_t)be64_to_cpu(a->l) - be64_to_cpu(b->l);
|
return (int64_t)be64_to_cpu(a->l) - be64_to_cpu(b->l);
|
||||||
return (int64_t)be32_to_cpu(a->s) - be32_to_cpu(b->s);
|
return (int64_t)be32_to_cpu(a->s) - be32_to_cpu(b->s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If there's an extent, we're done. */
|
||||||
|
STATIC int
|
||||||
|
xfs_btree_has_record_helper(
|
||||||
|
struct xfs_btree_cur *cur,
|
||||||
|
union xfs_btree_rec *rec,
|
||||||
|
void *priv)
|
||||||
|
{
|
||||||
|
return XFS_BTREE_QUERY_RANGE_ABORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Is there a record covering a given range of keys? */
|
||||||
|
int
|
||||||
|
xfs_btree_has_record(
|
||||||
|
struct xfs_btree_cur *cur,
|
||||||
|
union xfs_btree_irec *low,
|
||||||
|
union xfs_btree_irec *high,
|
||||||
|
bool *exists)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
error = xfs_btree_query_range(cur, low, high,
|
||||||
|
&xfs_btree_has_record_helper, NULL);
|
||||||
|
if (error == XFS_BTREE_QUERY_RANGE_ABORT) {
|
||||||
|
*exists = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*exists = false;
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
|
@ -547,5 +547,7 @@ void xfs_btree_get_keys(struct xfs_btree_cur *cur,
|
||||||
struct xfs_btree_block *block, union xfs_btree_key *key);
|
struct xfs_btree_block *block, union xfs_btree_key *key);
|
||||||
union xfs_btree_key *xfs_btree_high_key_from_key(struct xfs_btree_cur *cur,
|
union xfs_btree_key *xfs_btree_high_key_from_key(struct xfs_btree_cur *cur,
|
||||||
union xfs_btree_key *key);
|
union xfs_btree_key *key);
|
||||||
|
int xfs_btree_has_record(struct xfs_btree_cur *cur, union xfs_btree_irec *low,
|
||||||
|
union xfs_btree_irec *high, bool *exists);
|
||||||
|
|
||||||
#endif /* __XFS_BTREE_H__ */
|
#endif /* __XFS_BTREE_H__ */
|
||||||
|
|
Loading…
Add table
Reference in a new issue