Commit f73def90 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: create predicate to determine if cursor is at inode root level



Create a predicate to decide if the given cursor and level point to the
root block in the inode immediate area instead of a disk block, and get
rid of the open-coded logic everywhere.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 88ee2f48
Loading
Loading
Loading
Loading
+22 −30
Original line number Diff line number Diff line
@@ -749,8 +749,7 @@ xfs_btree_get_block(
	int			level,	/* level in btree */
	struct xfs_buf		**bpp)	/* buffer containing the block */
{
	if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
	    level == cur->bc_nlevels - 1) {
	if (xfs_btree_at_iroot(cur, level)) {
		*bpp = NULL;
		return xfs_btree_get_iroot(cur);
	}
@@ -992,8 +991,7 @@ xfs_btree_readahead(
	 * No readahead needed if we are at the root level and the
	 * btree root is stored in the inode.
	 */
	if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
	    lev == cur->bc_nlevels - 1)
	if (xfs_btree_at_iroot(cur, lev))
		return 0;

	if ((cur->bc_levels[lev].ra | lr) == cur->bc_levels[lev].ra)
@@ -1814,8 +1812,7 @@ xfs_btree_lookup_get_block(
	int			error = 0;

	/* special case the root block if in an inode */
	if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
	    level == cur->bc_nlevels - 1) {
	if (xfs_btree_at_iroot(cur, level)) {
		*blkp = xfs_btree_get_iroot(cur);
		return 0;
	}
@@ -2350,8 +2347,7 @@ xfs_btree_lshift(
	int			error;		/* error return value */
	int			i;

	if ((cur->bc_ops->type == XFS_BTREE_TYPE_INODE) &&
	    level == cur->bc_nlevels - 1)
	if (xfs_btree_at_iroot(cur, level))
		goto out0;

	/* Set up variables for this block as "right". */
@@ -2546,8 +2542,7 @@ xfs_btree_rshift(
	int			error;		/* error return value */
	int			i;		/* loop counter */

	if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
	    level == cur->bc_nlevels - 1)
	if (xfs_btree_at_iroot(cur, level))
		goto out0;

	/* Set up variables for this block as "left". */
@@ -3246,8 +3241,7 @@ xfs_btree_make_block_unfull(
{
	int			error = 0;

	if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
	    level == cur->bc_nlevels - 1) {
	if (xfs_btree_at_iroot(cur, level)) {
		struct xfs_inode *ip = cur->bc_ino.ip;

		if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) {
@@ -3856,10 +3850,8 @@ xfs_btree_delrec(
	 * Try to get rid of the next level down.  If we can't then there's
	 * nothing left to do.
	 */
	if (level == cur->bc_nlevels - 1) {
		if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE) {
			xfs_iroot_realloc(cur->bc_ino.ip, -1,
					  cur->bc_ino.whichfork);
	if (xfs_btree_at_iroot(cur, level)) {
		xfs_iroot_realloc(cur->bc_ino.ip, -1, cur->bc_ino.whichfork);

		error = xfs_btree_kill_iroot(cur);
		if (error)
@@ -3873,10 +3865,10 @@ xfs_btree_delrec(
	}

	/*
		 * If this is the root level, and there's only one entry left,
		 * and it's NOT the leaf level, then we can get rid of this
		 * level.
	 * If this is the root level, and there's only one entry left, and it's
	 * NOT the leaf level, then we can get rid of this level.
	 */
	if (level == cur->bc_nlevels - 1) {
		if (numrecs == 1 && level > 0) {
			union xfs_btree_ptr	*pp;
			/*
+10 −0
Original line number Diff line number Diff line
@@ -747,4 +747,14 @@ void xfs_btree_destroy_cur_caches(void);

int xfs_btree_goto_left_edge(struct xfs_btree_cur *cur);

/* Does this level of the cursor point to the inode root (and not a block)? */
static inline bool
xfs_btree_at_iroot(
	const struct xfs_btree_cur	*cur,
	int				level)
{
	return cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
	       level == cur->bc_nlevels - 1;
}

#endif	/* __XFS_BTREE_H__ */
+1 −2
Original line number Diff line number Diff line
@@ -398,8 +398,7 @@ xfs_btree_bload_prep_block(
	struct xfs_btree_block		*new_block;
	int				ret;

	if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
	    level == cur->bc_nlevels - 1) {
	if (xfs_btree_at_iroot(cur, level)) {
		struct xfs_ifork	*ifp = xfs_btree_ifork_ptr(cur);
		size_t			new_size;