|
|
|
@ -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); |
|
|
|
|