xfs: factor dir2 leaf read
Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Phil White <pwhite@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
e481357264
commit
e6f7667c4e
|
@ -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(
|
||||||
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(
|
||||||
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(
|
||||||
/*
|
/*
|
||||||
* 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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue