diff options
Diffstat (limited to 'fs/xfs/xfs_dir2_data.c')
| -rw-r--r-- | fs/xfs/xfs_dir2_data.c | 32 | 
1 files changed, 32 insertions, 0 deletions
diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index cb117234e32..0ef04f1bf51 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -185,6 +185,38 @@ __xfs_dir2_data_check(  	return 0;  } +static void +xfs_dir2_data_verify( +	struct xfs_buf		*bp) +{ +	struct xfs_mount	*mp = bp->b_target->bt_mount; +	struct xfs_dir2_data_hdr *hdr = bp->b_addr; +	int			block_ok = 0; + +	block_ok = hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC); +	block_ok = block_ok && __xfs_dir2_data_check(NULL, bp) == 0; + +	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); +} + +int +xfs_dir2_data_read( +	struct xfs_trans	*tp, +	struct xfs_inode	*dp, +	xfs_dablk_t		bno, +	xfs_daddr_t		mapped_bno, +	struct xfs_buf		**bpp) +{ +	return xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp, +					XFS_DATA_FORK, xfs_dir2_data_verify); +} +  /*   * Given a data block and an unused entry from that block,   * return the bestfree entry if any that corresponds to it.  |