mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-29 13:00:35 +00:00
xfs: add repair helpers for the reference count btree
Add a couple of functions to the refcount btree and generic btree code that will be used to repair the refcountbt. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
4d4f86b49f
commit
08daa3ccf5
@ -4919,3 +4919,24 @@ xfs_btree_has_record(
|
||||
*exists = false;
|
||||
return error;
|
||||
}
|
||||
|
||||
/* Are there more records in this btree? */
|
||||
bool
|
||||
xfs_btree_has_more_records(
|
||||
struct xfs_btree_cur *cur)
|
||||
{
|
||||
struct xfs_btree_block *block;
|
||||
struct xfs_buf *bp;
|
||||
|
||||
block = xfs_btree_get_block(cur, 0, &bp);
|
||||
|
||||
/* There are still records in this block. */
|
||||
if (cur->bc_ptrs[0] < xfs_btree_get_numrecs(block))
|
||||
return true;
|
||||
|
||||
/* There are more record blocks. */
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
|
||||
return block->bb_u.l.bb_rightsib != cpu_to_be64(NULLFSBLOCK);
|
||||
else
|
||||
return block->bb_u.s.bb_rightsib != cpu_to_be32(NULLAGBLOCK);
|
||||
}
|
||||
|
@ -528,5 +528,6 @@ union xfs_btree_key *xfs_btree_high_key_from_key(struct xfs_btree_cur *cur,
|
||||
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);
|
||||
bool xfs_btree_has_more_records(struct xfs_btree_cur *cur);
|
||||
|
||||
#endif /* __XFS_BTREE_H__ */
|
||||
|
@ -88,6 +88,23 @@ xfs_refcount_lookup_ge(
|
||||
return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat);
|
||||
}
|
||||
|
||||
/*
|
||||
* Look up the first record equal to [bno, len] in the btree
|
||||
* given by cur.
|
||||
*/
|
||||
int
|
||||
xfs_refcount_lookup_eq(
|
||||
struct xfs_btree_cur *cur,
|
||||
xfs_agblock_t bno,
|
||||
int *stat)
|
||||
{
|
||||
trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno,
|
||||
XFS_LOOKUP_LE);
|
||||
cur->bc_rec.rc.rc_startblock = bno;
|
||||
cur->bc_rec.rc.rc_blockcount = 0;
|
||||
return xfs_btree_lookup(cur, XFS_LOOKUP_EQ, stat);
|
||||
}
|
||||
|
||||
/* Convert on-disk record to in-core format. */
|
||||
void
|
||||
xfs_refcount_btrec_to_irec(
|
||||
|
@ -24,6 +24,8 @@ extern int xfs_refcount_lookup_le(struct xfs_btree_cur *cur,
|
||||
xfs_agblock_t bno, int *stat);
|
||||
extern int xfs_refcount_lookup_ge(struct xfs_btree_cur *cur,
|
||||
xfs_agblock_t bno, int *stat);
|
||||
extern int xfs_refcount_lookup_eq(struct xfs_btree_cur *cur,
|
||||
xfs_agblock_t bno, int *stat);
|
||||
extern int xfs_refcount_get_rec(struct xfs_btree_cur *cur,
|
||||
struct xfs_refcount_irec *irec, int *stat);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user