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

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

xfs: factor dir2 leaf read



Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarPhil White <pwhite@sgi.com>
Signed-off-by: default avatarBen Myers <bpm@sgi.com>
parent e4813572
Loading
Loading
Loading
Loading
+62 −11
Original line number Diff line number Diff line
@@ -48,6 +48,62 @@ static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp,
				    int first, int last);
static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp);

static void
xfs_dir2_leaf_verify(
	struct xfs_buf		*bp,
	__be16			magic)
{
	struct xfs_mount	*mp = bp->b_target->bt_mount;
	struct xfs_dir2_leaf_hdr *hdr = bp->b_addr;
	int			block_ok = 0;

	block_ok = hdr->info.magic == magic;
	if (!block_ok) {
		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr);
		xfs_buf_ioerror(bp, EFSCORRUPTED);
	}

	bp->b_iodone = NULL;
	xfs_buf_ioend(bp, 0);
}

static void
xfs_dir2_leaf1_verify(
	struct xfs_buf		*bp)
{
	xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAF1_MAGIC));
}

static void
xfs_dir2_leafn_verify(
	struct xfs_buf		*bp)
{
	xfs_dir2_leaf_verify(bp, cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));
}

static int
xfs_dir2_leaf_read(
	struct xfs_trans	*tp,
	struct xfs_inode	*dp,
	xfs_dablk_t		fbno,
	xfs_daddr_t		mappedbno,
	struct xfs_buf		**bpp)
{
	return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp,
					XFS_DATA_FORK, xfs_dir2_leaf1_verify);
}

int
xfs_dir2_leafn_read(
	struct xfs_trans	*tp,
	struct xfs_inode	*dp,
	xfs_dablk_t		fbno,
	xfs_daddr_t		mappedbno,
	struct xfs_buf		**bpp)
{
	return xfs_da_read_buf(tp, dp, fbno, mappedbno, bpp,
					XFS_DATA_FORK, xfs_dir2_leafn_verify);
}

/*
 * Convert a block form directory to a leaf form directory.
@@ -311,14 +367,11 @@ xfs_dir2_leaf_addname(
	dp = args->dp;
	tp = args->trans;
	mp = dp->i_mount;
	/*
	 * Read the leaf block.
	 */
	error = xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp,
				XFS_DATA_FORK, NULL);

	error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp);
	if (error)
		return error;
	ASSERT(lbp != NULL);

	/*
	 * Look up the entry by hash value and name.
	 * We know it's not there, our caller has already done a lookup.
@@ -1369,13 +1422,11 @@ xfs_dir2_leaf_lookup_int(
	dp = args->dp;
	tp = args->trans;
	mp = dp->i_mount;
	/*
	 * Read the leaf block into the buffer.
	 */
	error = xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp,
							XFS_DATA_FORK, NULL);

	error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp);
	if (error)
		return error;

	*lbpp = lbp;
	leaf = lbp->b_addr;
	xfs_dir2_leaf_check(dp, lbp);
+3 −3
Original line number Diff line number Diff line
@@ -1232,11 +1232,11 @@ xfs_dir2_leafn_toosmall(
		/*
		 * Read the sibling leaf block.
		 */
		error = xfs_da_read_buf(state->args->trans, state->args->dp,
					blkno, -1, &bp, XFS_DATA_FORK, NULL);
		error = xfs_dir2_leafn_read(state->args->trans, state->args->dp,
					    blkno, -1, &bp);
		if (error)
			return error;
		ASSERT(bp != NULL);

		/*
		 * Count bytes in the two blocks combined.
		 */
+2 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp,
		xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp);

/* xfs_dir2_leaf.c */
extern int xfs_dir2_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp,
		xfs_dablk_t fbno, xfs_daddr_t mappedbno, struct xfs_buf **bpp);
extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args,
		struct xfs_buf *dbp);
extern int xfs_dir2_leaf_addname(struct xfs_da_args *args);