Commit 8c1771c4 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong
Browse files

xfs: add a xfs_btree_ptrs_equal helper



This only has a single caller and thus might be a bit questionable,
but I think it really improves the readability of
xfs_btree_visit_block.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent 5076a604
Loading
Loading
Loading
Loading
+17 −13
Original line number Diff line number Diff line
@@ -1043,6 +1043,17 @@ xfs_btree_set_ptr_null(
		ptr->s = cpu_to_be32(NULLAGBLOCK);
}

static inline bool
xfs_btree_ptrs_equal(
	struct xfs_btree_cur		*cur,
	union xfs_btree_ptr		*ptr1,
	union xfs_btree_ptr		*ptr2)
{
	if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN)
		return ptr1->l == ptr2->l;
	return ptr1->s == ptr2->s;
}

/*
 * Get/set/init sibling pointers
 */
@@ -4365,7 +4376,7 @@ xfs_btree_visit_block(
{
	struct xfs_btree_block		*block;
	struct xfs_buf			*bp;
	union xfs_btree_ptr		rptr;
	union xfs_btree_ptr		rptr, bufptr;
	int				error;

	/* do right sibling readahead */
@@ -4388,19 +4399,12 @@ xfs_btree_visit_block(
	 * return the same block without checking if the right sibling points
	 * back to us and creates a cyclic reference in the btree.
	 */
	if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN) {
		if (be64_to_cpu(rptr.l) == XFS_DADDR_TO_FSB(cur->bc_mp,
							xfs_buf_daddr(bp))) {
	xfs_btree_buf_to_ptr(cur, bp, &bufptr);
	if (xfs_btree_ptrs_equal(cur, &rptr, &bufptr)) {
		xfs_btree_mark_sick(cur);
		return -EFSCORRUPTED;
	}
	} else {
		if (be32_to_cpu(rptr.s) == xfs_daddr_to_agbno(cur->bc_mp,
							xfs_buf_daddr(bp))) {
			xfs_btree_mark_sick(cur);
			return -EFSCORRUPTED;
		}
	}

	return xfs_btree_lookup_get_block(cur, level, &rptr, &block);
}