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

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
...@@ -1043,6 +1043,17 @@ xfs_btree_set_ptr_null( ...@@ -1043,6 +1043,17 @@ xfs_btree_set_ptr_null(
ptr->s = cpu_to_be32(NULLAGBLOCK); 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 * Get/set/init sibling pointers
*/ */
...@@ -4365,7 +4376,7 @@ xfs_btree_visit_block( ...@@ -4365,7 +4376,7 @@ xfs_btree_visit_block(
{ {
struct xfs_btree_block *block; struct xfs_btree_block *block;
struct xfs_buf *bp; struct xfs_buf *bp;
union xfs_btree_ptr rptr; union xfs_btree_ptr rptr, bufptr;
int error; int error;
/* do right sibling readahead */ /* do right sibling readahead */
...@@ -4388,19 +4399,12 @@ xfs_btree_visit_block( ...@@ -4388,19 +4399,12 @@ xfs_btree_visit_block(
* return the same block without checking if the right sibling points * return the same block without checking if the right sibling points
* back to us and creates a cyclic reference in the btree. * back to us and creates a cyclic reference in the btree.
*/ */
if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN) { xfs_btree_buf_to_ptr(cur, bp, &bufptr);
if (be64_to_cpu(rptr.l) == XFS_DADDR_TO_FSB(cur->bc_mp, if (xfs_btree_ptrs_equal(cur, &rptr, &bufptr)) {
xfs_buf_daddr(bp))) {
xfs_btree_mark_sick(cur); xfs_btree_mark_sick(cur);
return -EFSCORRUPTED; 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); return xfs_btree_lookup_get_block(cur, level, &rptr, &block);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment