]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: add repair helpers for the reference count btree
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 28 Jun 2018 20:11:56 +0000 (15:11 -0500)
committerEric Sandeen <sandeen@redhat.com>
Thu, 28 Jun 2018 20:11:56 +0000 (15:11 -0500)
Source kernel commit: 08daa3ccf541b8cc59d198daaccefae17fe565ae

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>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/xfs_btree.c
libxfs/xfs_btree.h
libxfs/xfs_refcount.c
libxfs/xfs_refcount.h

index f7dc567198f1816ebd45f51aedaab4d8c86bc581..2bd9dd3596b9914682502ac26ca1e0367d13dab6 100644 (file)
@@ -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);
+}
index d870dbfcd613fd00d3a7107db966b79471e85119..4ef7bfbd2bfc54b46516b806c84890994b41ee50 100644 (file)
@@ -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__ */
index f2d366355cbd792b85fb65d2eb40418138b36bd2..988a0a74c242d4b012c0a413c3229db0f83c80ca 100644 (file)
@@ -87,6 +87,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(
index 5856abb265ecd99f58b84287afd50052f1605715..a92ad9078bc16ca20768c865bdd7e797e2519920 100644 (file)
@@ -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);