Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b64f3a39 authored by Dave Chinner's avatar Dave Chinner Committed by Ben Myers
Browse files

xfs: use btree block initialisation functions in growfs



Factor xfs_btree_init_block() to be independent of the btree cursor,
and use the function to initialise btree blocks in the growfs code.
This makes adding support for different format btree blocks simple.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by Rich Johnston <rjohnston@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent ee73259b
Loading
Loading
Loading
Loading
+24 −9
Original line number Original line Diff line number Diff line
@@ -853,18 +853,22 @@ xfs_btree_set_sibling(
	}
	}
}
}


STATIC void
void
xfs_btree_init_block(
xfs_btree_init_block(
	struct xfs_btree_cur	*cur,
	struct xfs_mount *mp,
	int			level,
	struct xfs_buf	*bp,
	int			numrecs,
	__u32		magic,
	struct xfs_btree_block	*new)	/* new block */
	__u16		level,
	__u16		numrecs,
	unsigned int	flags)
{
{
	new->bb_magic = cpu_to_be32(xfs_magics[cur->bc_btnum]);
	struct xfs_btree_block	*new = XFS_BUF_TO_BLOCK(bp);

	new->bb_magic = cpu_to_be32(magic);
	new->bb_level = cpu_to_be16(level);
	new->bb_level = cpu_to_be16(level);
	new->bb_numrecs = cpu_to_be16(numrecs);
	new->bb_numrecs = cpu_to_be16(numrecs);


	if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
	if (flags & XFS_BTREE_LONG_PTRS) {
		new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
		new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
		new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
		new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
	} else {
	} else {
@@ -873,6 +877,17 @@ xfs_btree_init_block(
	}
	}
}
}


STATIC void
xfs_btree_init_block_cur(
	struct xfs_btree_cur	*cur,
	int			level,
	int			numrecs,
	struct xfs_buf		*bp)
{
	xfs_btree_init_block(cur->bc_mp, bp, xfs_magics[cur->bc_btnum],
			       level, numrecs, cur->bc_flags);
}

/*
/*
 * Return true if ptr is the last record in the btree and
 * Return true if ptr is the last record in the btree and
 * we need to track updateѕ to this record.  The decision
 * we need to track updateѕ to this record.  The decision
@@ -2183,7 +2198,7 @@ xfs_btree_split(
		goto error0;
		goto error0;


	/* Fill in the btree header for the new right block. */
	/* Fill in the btree header for the new right block. */
	xfs_btree_init_block(cur, xfs_btree_get_level(left), 0, right);
	xfs_btree_init_block_cur(cur, xfs_btree_get_level(left), 0, rbp);


	/*
	/*
	 * Split the entries between the old and the new block evenly.
	 * Split the entries between the old and the new block evenly.
@@ -2492,7 +2507,7 @@ xfs_btree_new_root(
		nptr = 2;
		nptr = 2;
	}
	}
	/* Fill in the new block's btree header and log it. */
	/* Fill in the new block's btree header and log it. */
	xfs_btree_init_block(cur, cur->bc_nlevels, 2, new);
	xfs_btree_init_block_cur(cur, cur->bc_nlevels, 2, nbp);
	xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS);
	xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS);
	ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) &&
	ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) &&
			!xfs_btree_ptr_is_null(cur, &rptr));
			!xfs_btree_ptr_is_null(cur, &rptr));
+11 −0
Original line number Original line Diff line number Diff line
@@ -378,6 +378,17 @@ xfs_btree_reada_bufs(
	xfs_agblock_t		agbno,	/* allocation group block number */
	xfs_agblock_t		agbno,	/* allocation group block number */
	xfs_extlen_t		count);	/* count of filesystem blocks */
	xfs_extlen_t		count);	/* count of filesystem blocks */


/*
 * Initialise a new btree block header
 */
void
xfs_btree_init_block(
	struct xfs_mount *mp,
	struct xfs_buf	*bp,
	__u32		magic,
	__u16		level,
	__u16		numrecs,
	unsigned int	flags);


/*
/*
 * Common btree core entry points.
 * Common btree core entry points.
+13 −24
Original line number Original line Diff line number Diff line
@@ -125,7 +125,6 @@ xfs_growfs_data_private(
	xfs_extlen_t		agsize;
	xfs_extlen_t		agsize;
	xfs_extlen_t		tmpsize;
	xfs_extlen_t		tmpsize;
	xfs_alloc_rec_t		*arec;
	xfs_alloc_rec_t		*arec;
	struct xfs_btree_block	*block;
	xfs_buf_t		*bp;
	xfs_buf_t		*bp;
	int			bucket;
	int			bucket;
	int			dpct;
	int			dpct;
@@ -263,17 +262,14 @@ xfs_growfs_data_private(
			error = ENOMEM;
			error = ENOMEM;
			goto error0;
			goto error0;
		}
		}
		block = XFS_BUF_TO_BLOCK(bp);
		xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
		memset(block, 0, mp->m_sb.sb_blocksize);
		xfs_btree_init_block(mp, bp, XFS_ABTB_MAGIC, 0, 1, 0);
		block->bb_magic = cpu_to_be32(XFS_ABTB_MAGIC);

		block->bb_level = 0;
		arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1);
		block->bb_numrecs = cpu_to_be16(1);
		block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
		block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
		arec = XFS_ALLOC_REC_ADDR(mp, block, 1);
		arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
		arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
		arec->ar_blockcount = cpu_to_be32(
		arec->ar_blockcount = cpu_to_be32(
			agsize - be32_to_cpu(arec->ar_startblock));
			agsize - be32_to_cpu(arec->ar_startblock));

		error = xfs_bwrite(bp);
		error = xfs_bwrite(bp);
		xfs_buf_relse(bp);
		xfs_buf_relse(bp);
		if (error)
		if (error)
@@ -289,18 +285,15 @@ xfs_growfs_data_private(
			error = ENOMEM;
			error = ENOMEM;
			goto error0;
			goto error0;
		}
		}
		block = XFS_BUF_TO_BLOCK(bp);
		xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
		memset(block, 0, mp->m_sb.sb_blocksize);
		xfs_btree_init_block(mp, bp, XFS_ABTC_MAGIC, 0, 1, 0);
		block->bb_magic = cpu_to_be32(XFS_ABTC_MAGIC);

		block->bb_level = 0;
		arec = XFS_ALLOC_REC_ADDR(mp, XFS_BUF_TO_BLOCK(bp), 1);
		block->bb_numrecs = cpu_to_be16(1);
		block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
		block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
		arec = XFS_ALLOC_REC_ADDR(mp, block, 1);
		arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
		arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
		arec->ar_blockcount = cpu_to_be32(
		arec->ar_blockcount = cpu_to_be32(
			agsize - be32_to_cpu(arec->ar_startblock));
			agsize - be32_to_cpu(arec->ar_startblock));
		nfree += be32_to_cpu(arec->ar_blockcount);
		nfree += be32_to_cpu(arec->ar_blockcount);

		error = xfs_bwrite(bp);
		error = xfs_bwrite(bp);
		xfs_buf_relse(bp);
		xfs_buf_relse(bp);
		if (error)
		if (error)
@@ -316,13 +309,9 @@ xfs_growfs_data_private(
			error = ENOMEM;
			error = ENOMEM;
			goto error0;
			goto error0;
		}
		}
		block = XFS_BUF_TO_BLOCK(bp);
		xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
		memset(block, 0, mp->m_sb.sb_blocksize);
		xfs_btree_init_block(mp, bp, XFS_IBT_MAGIC, 0, 0, 0);
		block->bb_magic = cpu_to_be32(XFS_IBT_MAGIC);

		block->bb_level = 0;
		block->bb_numrecs = 0;
		block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
		block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
		error = xfs_bwrite(bp);
		error = xfs_bwrite(bp);
		xfs_buf_relse(bp);
		xfs_buf_relse(bp);
		if (error)
		if (error)