xfs: drop all altpath buffers at the end of the sibling check
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 25 Mar 2020 03:10:55 +0000 (20:10 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Thu, 26 Mar 2020 15:19:24 +0000 (08:19 -0700)
commitafbabf56305f7b5fb64557484abd0502ab4bde93
tree208289f79f1b1e429c574af86275ed37c39823b4
parent5885539f0af371024d07afd14974bfdc3fff84c5
xfs: drop all altpath buffers at the end of the sibling check

The dirattr btree checking code uses the altpath substructure of the
dirattr state structure to check the sibling pointers of dir/attr tree
blocks.  At the end of sibling checks, xfs_da3_path_shift could have
changed multiple levels of buffer pointers in the altpath structure.
Although we release the leaf level buffer, this isn't enough -- we also
need to release the node buffers that are unique to the altpath.

Not releasing all of the altpath buffers leaves them locked to the
transaction.  This is suboptimal because we should release resources
when we don't need them anymore.  Fix the function to loop all levels of
the altpath, and fix the return logic so that we always run the loop.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/scrub/dabtree.c