diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_dir2_data.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_dir2_data.c | 26 | 
1 files changed, 18 insertions, 8 deletions
| diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c index 725fc7841fde..d478065b9544 100644 --- a/fs/xfs/libxfs/xfs_dir2_data.c +++ b/fs/xfs/libxfs/xfs_dir2_data.c @@ -329,7 +329,7 @@ xfs_dir3_data_read(  	err = xfs_da_read_buf(tp, dp, bno, mapped_bno, bpp,  				XFS_DATA_FORK, &xfs_dir3_data_buf_ops); -	if (!err && tp) +	if (!err && tp && *bpp)  		xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_DATA_BUF);  	return err;  } @@ -505,8 +505,9 @@ xfs_dir2_data_freeremove(   * Given a data block, reconstruct its bestfree map.   */  void -xfs_dir2_data_freescan( -	struct xfs_inode	*dp, +xfs_dir2_data_freescan_int( +	struct xfs_da_geometry	*geo, +	const struct xfs_dir_ops *ops,  	struct xfs_dir2_data_hdr *hdr,  	int			*loghead)  { @@ -516,7 +517,6 @@ xfs_dir2_data_freescan(  	struct xfs_dir2_data_free *bf;  	char			*endp;		/* end of block's data */  	char			*p;		/* current entry pointer */ -	struct xfs_da_geometry	*geo = dp->i_mount->m_dir_geo;  	ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) ||  	       hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || @@ -526,13 +526,13 @@ xfs_dir2_data_freescan(  	/*  	 * Start by clearing the table.  	 */ -	bf = dp->d_ops->data_bestfree_p(hdr); +	bf = ops->data_bestfree_p(hdr);  	memset(bf, 0, sizeof(*bf) * XFS_DIR2_DATA_FD_COUNT);  	*loghead = 1;  	/*  	 * Set up pointers.  	 */ -	p = (char *)dp->d_ops->data_entry_p(hdr); +	p = (char *)ops->data_entry_p(hdr);  	if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) ||  	    hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) {  		btp = xfs_dir2_block_tail_p(geo, hdr); @@ -559,12 +559,22 @@ xfs_dir2_data_freescan(  		else {  			dep = (xfs_dir2_data_entry_t *)p;  			ASSERT((char *)dep - (char *)hdr == -			       be16_to_cpu(*dp->d_ops->data_entry_tag_p(dep))); -			p += dp->d_ops->data_entsize(dep->namelen); +			       be16_to_cpu(*ops->data_entry_tag_p(dep))); +			p += ops->data_entsize(dep->namelen);  		}  	}  } +void +xfs_dir2_data_freescan( +	struct xfs_inode	*dp, +	struct xfs_dir2_data_hdr *hdr, +	int			*loghead) +{ +	return xfs_dir2_data_freescan_int(dp->i_mount->m_dir_geo, dp->d_ops, +			hdr, loghead); +} +  /*   * Initialize a data block at the given block number in the directory.   * Give back the buffer for the created block. |