提交 e6f7667c 编写于 作者: D Dave Chinner 提交者: Ben Myers

xfs: factor dir2 leaf read

Signed-off-by: NDave Chinner <dchinner@redhat.com>
Reviewed-by: NPhil White <pwhite@sgi.com>
Signed-off-by: NBen Myers <bpm@sgi.com>
上级 e4813572
...@@ -48,6 +48,62 @@ static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp, ...@@ -48,6 +48,62 @@ static void xfs_dir2_leaf_log_bests(struct xfs_trans *tp, struct xfs_buf *bp,
int first, int last); int first, int last);
static void xfs_dir2_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); 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. * Convert a block form directory to a leaf form directory.
...@@ -311,14 +367,11 @@ xfs_dir2_leaf_addname( ...@@ -311,14 +367,11 @@ xfs_dir2_leaf_addname(
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;
mp = dp->i_mount; mp = dp->i_mount;
/*
* Read the leaf block. error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp);
*/
error = xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp,
XFS_DATA_FORK, NULL);
if (error) if (error)
return error; return error;
ASSERT(lbp != NULL);
/* /*
* Look up the entry by hash value and name. * Look up the entry by hash value and name.
* We know it's not there, our caller has already done a lookup. * We know it's not there, our caller has already done a lookup.
...@@ -1369,13 +1422,11 @@ xfs_dir2_leaf_lookup_int( ...@@ -1369,13 +1422,11 @@ xfs_dir2_leaf_lookup_int(
dp = args->dp; dp = args->dp;
tp = args->trans; tp = args->trans;
mp = dp->i_mount; mp = dp->i_mount;
/*
* Read the leaf block into the buffer. error = xfs_dir2_leaf_read(tp, dp, mp->m_dirleafblk, -1, &lbp);
*/
error = xfs_da_read_buf(tp, dp, mp->m_dirleafblk, -1, &lbp,
XFS_DATA_FORK, NULL);
if (error) if (error)
return error; return error;
*lbpp = lbp; *lbpp = lbp;
leaf = lbp->b_addr; leaf = lbp->b_addr;
xfs_dir2_leaf_check(dp, lbp); xfs_dir2_leaf_check(dp, lbp);
......
...@@ -1232,11 +1232,11 @@ xfs_dir2_leafn_toosmall( ...@@ -1232,11 +1232,11 @@ xfs_dir2_leafn_toosmall(
/* /*
* Read the sibling leaf block. * Read the sibling leaf block.
*/ */
error = xfs_da_read_buf(state->args->trans, state->args->dp, error = xfs_dir2_leafn_read(state->args->trans, state->args->dp,
blkno, -1, &bp, XFS_DATA_FORK, NULL); blkno, -1, &bp);
if (error) if (error)
return error; return error;
ASSERT(bp != NULL);
/* /*
* Count bytes in the two blocks combined. * Count bytes in the two blocks combined.
*/ */
......
...@@ -70,6 +70,8 @@ extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, ...@@ -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_data_aoff_t len, int *needlogp, int *needscanp);
/* xfs_dir2_leaf.c */ /* 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, extern int xfs_dir2_block_to_leaf(struct xfs_da_args *args,
struct xfs_buf *dbp); struct xfs_buf *dbp);
extern int xfs_dir2_leaf_addname(struct xfs_da_args *args); extern int xfs_dir2_leaf_addname(struct xfs_da_args *args);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册