diff options
Diffstat (limited to 'fs/xfs/xfs_dir2_block.c')
| -rw-r--r-- | fs/xfs/xfs_dir2_block.c | 187 | 
1 files changed, 96 insertions, 91 deletions
diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 0957aa98b6c..c7cd3154026 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -18,25 +18,25 @@   */  #include "xfs.h"  #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h"  #include "xfs_sb.h"  #include "xfs_ag.h"  #include "xfs_mount.h" +#include "xfs_da_format.h"  #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h"  #include "xfs_inode.h" +#include "xfs_trans.h"  #include "xfs_inode_item.h"  #include "xfs_bmap.h"  #include "xfs_buf_item.h" -#include "xfs_dir2_format.h"  #include "xfs_dir2.h"  #include "xfs_dir2_priv.h"  #include "xfs_error.h"  #include "xfs_trace.h"  #include "xfs_cksum.h" +#include "xfs_dinode.h"  /*   * Local function prototypes. @@ -89,13 +89,14 @@ xfs_dir3_block_read_verify(  {  	struct xfs_mount	*mp = bp->b_target->bt_mount; -	if ((xfs_sb_version_hascrc(&mp->m_sb) && -	     !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), -					  XFS_DIR3_DATA_CRC_OFF)) || -	    !xfs_dir3_block_verify(bp)) { -		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); +	if (xfs_sb_version_hascrc(&mp->m_sb) && +	     !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) +		xfs_buf_ioerror(bp, EFSBADCRC); +	else if (!xfs_dir3_block_verify(bp))  		xfs_buf_ioerror(bp, EFSCORRUPTED); -	} + +	if (bp->b_error) +		xfs_verifier_error(bp);  }  static void @@ -107,8 +108,8 @@ xfs_dir3_block_write_verify(  	struct xfs_dir3_blk_hdr	*hdr3 = bp->b_addr;  	if (!xfs_dir3_block_verify(bp)) { -		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr);  		xfs_buf_ioerror(bp, EFSCORRUPTED); +		xfs_verifier_error(bp);  		return;  	} @@ -118,7 +119,7 @@ xfs_dir3_block_write_verify(  	if (bip)  		hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn); -	xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_DATA_CRC_OFF); +	xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF);  }  const struct xfs_buf_ops xfs_dir3_block_buf_ops = { @@ -135,7 +136,7 @@ xfs_dir3_block_read(  	struct xfs_mount	*mp = dp->i_mount;  	int			err; -	err = xfs_da_read_buf(tp, dp, mp->m_dirdatablk, -1, bpp, +	err = xfs_da_read_buf(tp, dp, mp->m_dir_geo->datablk, -1, bpp,  				XFS_DATA_FORK, &xfs_dir3_block_buf_ops);  	if (!err && tp)  		xfs_trans_buf_set_type(tp, *bpp, XFS_BLFT_DIR_BLOCK_BUF); @@ -168,6 +169,7 @@ xfs_dir3_block_init(  static void  xfs_dir2_block_need_space( +	struct xfs_inode		*dp,  	struct xfs_dir2_data_hdr	*hdr,  	struct xfs_dir2_block_tail	*btp,  	struct xfs_dir2_leaf_entry	*blp, @@ -183,7 +185,7 @@ xfs_dir2_block_need_space(  	struct xfs_dir2_data_unused	*enddup = NULL;  	*compact = 0; -	bf = xfs_dir3_data_bestfree_p(hdr); +	bf = dp->d_ops->data_bestfree_p(hdr);  	/*  	 * If there are stale entries we'll use one for the leaf. @@ -279,7 +281,7 @@ out:   */  static void  xfs_dir2_block_compact( -	struct xfs_trans		*tp, +	struct xfs_da_args		*args,  	struct xfs_buf			*bp,  	struct xfs_dir2_data_hdr	*hdr,  	struct xfs_dir2_block_tail	*btp, @@ -312,18 +314,17 @@ xfs_dir2_block_compact(  	*lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1);  	*lfloghigh -= be32_to_cpu(btp->stale) - 1;  	be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); -	xfs_dir2_data_make_free(tp, bp, +	xfs_dir2_data_make_free(args, bp,  		(xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr),  		(xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)),  		needlog, &needscan); -	blp += be32_to_cpu(btp->stale) - 1;  	btp->stale = cpu_to_be32(1);  	/*  	 * If we now need to rebuild the bestfree map, do so.  	 * This needs to happen before the next call to use_free.  	 */  	if (needscan) -		xfs_dir2_data_freescan(tp->t_mountp, hdr, needlog); +		xfs_dir2_data_freescan(args->dp, hdr, needlog);  }  /* @@ -369,20 +370,20 @@ xfs_dir2_block_addname(  	if (error)  		return error; -	len = xfs_dir3_data_entsize(mp, args->namelen); +	len = dp->d_ops->data_entsize(args->namelen);  	/*  	 * Set up pointers to parts of the block.  	 */  	hdr = bp->b_addr; -	btp = xfs_dir2_block_tail_p(mp, hdr); +	btp = xfs_dir2_block_tail_p(args->geo, hdr);  	blp = xfs_dir2_block_leaf_p(btp);  	/*  	 * Find out if we can reuse stale entries or whether we need extra  	 * space for entry and new leaf.  	 */ -	xfs_dir2_block_need_space(hdr, btp, blp, &tagp, &dup, +	xfs_dir2_block_need_space(dp, hdr, btp, blp, &tagp, &dup,  				  &enddup, &compact, len);  	/* @@ -418,7 +419,7 @@ xfs_dir2_block_addname(  	 * If need to compact the leaf entries, do it now.  	 */  	if (compact) { -		xfs_dir2_block_compact(tp, bp, hdr, btp, blp, &needlog, +		xfs_dir2_block_compact(args, bp, hdr, btp, blp, &needlog,  				      &lfloghigh, &lfloglow);  		/* recalculate blp post-compaction */  		blp = xfs_dir2_block_leaf_p(btp); @@ -453,7 +454,7 @@ xfs_dir2_block_addname(  		/*  		 * Mark the space needed for the new leaf entry, now in use.  		 */ -		xfs_dir2_data_use_free(tp, bp, enddup, +		xfs_dir2_data_use_free(args, bp, enddup,  			(xfs_dir2_data_aoff_t)  			((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) -  			 sizeof(*blp)), @@ -468,7 +469,7 @@ xfs_dir2_block_addname(  		 * This needs to happen before the next call to use_free.  		 */  		if (needscan) { -			xfs_dir2_data_freescan(mp, hdr, &needlog); +			xfs_dir2_data_freescan(dp, hdr, &needlog);  			needscan = 0;  		}  		/* @@ -534,13 +535,13 @@ xfs_dir2_block_addname(  	 * Fill in the leaf entry.  	 */  	blp[mid].hashval = cpu_to_be32(args->hashval); -	blp[mid].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, +	blp[mid].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(  				(char *)dep - (char *)hdr));  	xfs_dir2_block_log_leaf(tp, bp, lfloglow, lfloghigh);  	/*  	 * Mark space for the data entry used.  	 */ -	xfs_dir2_data_use_free(tp, bp, dup, +	xfs_dir2_data_use_free(args, bp, dup,  		(xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),  		(xfs_dir2_data_aoff_t)len, &needlog, &needscan);  	/* @@ -549,18 +550,18 @@ xfs_dir2_block_addname(  	dep->inumber = cpu_to_be64(args->inumber);  	dep->namelen = args->namelen;  	memcpy(dep->name, args->name, args->namelen); -	xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); -	tagp = xfs_dir3_data_entry_tag_p(mp, dep); +	dp->d_ops->data_put_ftype(dep, args->filetype); +	tagp = dp->d_ops->data_entry_tag_p(dep);  	*tagp = cpu_to_be16((char *)dep - (char *)hdr);  	/*  	 * Clean up the bestfree array and log the header, tail, and entry.  	 */  	if (needscan) -		xfs_dir2_data_freescan(mp, hdr, &needlog); +		xfs_dir2_data_freescan(dp, hdr, &needlog);  	if (needlog) -		xfs_dir2_data_log_header(tp, bp); +		xfs_dir2_data_log_header(args, bp);  	xfs_dir2_block_log_tail(tp, bp); -	xfs_dir2_data_log_entry(tp, bp, dep); +	xfs_dir2_data_log_entry(args, bp, dep);  	xfs_dir3_data_check(dp, bp);  	return 0;  } @@ -579,7 +580,7 @@ xfs_dir2_block_log_leaf(  	xfs_dir2_leaf_entry_t	*blp;  	xfs_dir2_block_tail_t	*btp; -	btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); +	btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr);  	blp = xfs_dir2_block_leaf_p(btp);  	xfs_trans_log_buf(tp, bp, (uint)((char *)&blp[first] - (char *)hdr),  		(uint)((char *)&blp[last + 1] - (char *)hdr - 1)); @@ -596,7 +597,7 @@ xfs_dir2_block_log_tail(  	xfs_dir2_data_hdr_t	*hdr = bp->b_addr;  	xfs_dir2_block_tail_t	*btp; -	btp = xfs_dir2_block_tail_p(tp->t_mountp, hdr); +	btp = xfs_dir2_block_tail_p(tp->t_mountp->m_dir_geo, hdr);  	xfs_trans_log_buf(tp, bp, (uint)((char *)btp - (char *)hdr),  		(uint)((char *)(btp + 1) - (char *)hdr - 1));  } @@ -631,18 +632,19 @@ xfs_dir2_block_lookup(  	mp = dp->i_mount;  	hdr = bp->b_addr;  	xfs_dir3_data_check(dp, bp); -	btp = xfs_dir2_block_tail_p(mp, hdr); +	btp = xfs_dir2_block_tail_p(args->geo, hdr);  	blp = xfs_dir2_block_leaf_p(btp);  	/*  	 * Get the offset from the leaf entry, to point to the data.  	 */  	dep = (xfs_dir2_data_entry_t *)((char *)hdr + -		xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); +			xfs_dir2_dataptr_to_off(args->geo, +						be32_to_cpu(blp[ent].address)));  	/*  	 * Fill in inode number, CI name if appropriate, release the block.  	 */  	args->inumber = be64_to_cpu(dep->inumber); -	args->filetype = xfs_dir3_dirent_get_ftype(mp, dep); +	args->filetype = dp->d_ops->data_get_ftype(dep);  	error = xfs_dir_cilookup_result(args, dep->name, dep->namelen);  	xfs_trans_brelse(args->trans, bp);  	return XFS_ERROR(error); @@ -683,7 +685,7 @@ xfs_dir2_block_lookup_int(  	hdr = bp->b_addr;  	xfs_dir3_data_check(dp, bp); -	btp = xfs_dir2_block_tail_p(mp, hdr); +	btp = xfs_dir2_block_tail_p(args->geo, hdr);  	blp = xfs_dir2_block_leaf_p(btp);  	/*  	 * Loop doing a binary search for our hash value. @@ -721,7 +723,7 @@ xfs_dir2_block_lookup_int(  		 * Get pointer to the entry from the leaf.  		 */  		dep = (xfs_dir2_data_entry_t *) -			((char *)hdr + xfs_dir2_dataptr_to_off(mp, addr)); +			((char *)hdr + xfs_dir2_dataptr_to_off(args->geo, addr));  		/*  		 * Compare name and if it's an exact match, return the index  		 * and buffer. If it's the first case-insensitive match, store @@ -788,20 +790,21 @@ xfs_dir2_block_removename(  	tp = args->trans;  	mp = dp->i_mount;  	hdr = bp->b_addr; -	btp = xfs_dir2_block_tail_p(mp, hdr); +	btp = xfs_dir2_block_tail_p(args->geo, hdr);  	blp = xfs_dir2_block_leaf_p(btp);  	/*  	 * Point to the data entry using the leaf entry.  	 */ -	dep = (xfs_dir2_data_entry_t *) -	      ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); +	dep = (xfs_dir2_data_entry_t *)((char *)hdr + +			xfs_dir2_dataptr_to_off(args->geo, +						be32_to_cpu(blp[ent].address)));  	/*  	 * Mark the data entry's space free.  	 */  	needlog = needscan = 0; -	xfs_dir2_data_make_free(tp, bp, +	xfs_dir2_data_make_free(args, bp,  		(xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), -		xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); +		dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan);  	/*  	 * Fix up the block tail.  	 */ @@ -816,9 +819,9 @@ xfs_dir2_block_removename(  	 * Fix up bestfree, log the header if necessary.  	 */  	if (needscan) -		xfs_dir2_data_freescan(mp, hdr, &needlog); +		xfs_dir2_data_freescan(dp, hdr, &needlog);  	if (needlog) -		xfs_dir2_data_log_header(tp, bp); +		xfs_dir2_data_log_header(args, bp);  	xfs_dir3_data_check(dp, bp);  	/*  	 * See if the size as a shortform is good enough. @@ -863,20 +866,21 @@ xfs_dir2_block_replace(  	dp = args->dp;  	mp = dp->i_mount;  	hdr = bp->b_addr; -	btp = xfs_dir2_block_tail_p(mp, hdr); +	btp = xfs_dir2_block_tail_p(args->geo, hdr);  	blp = xfs_dir2_block_leaf_p(btp);  	/*  	 * Point to the data entry we need to change.  	 */ -	dep = (xfs_dir2_data_entry_t *) -	      ((char *)hdr + xfs_dir2_dataptr_to_off(mp, be32_to_cpu(blp[ent].address))); +	dep = (xfs_dir2_data_entry_t *)((char *)hdr + +			xfs_dir2_dataptr_to_off(args->geo, +						be32_to_cpu(blp[ent].address)));  	ASSERT(be64_to_cpu(dep->inumber) != args->inumber);  	/*  	 * Change the inode number to the new value.  	 */  	dep->inumber = cpu_to_be64(args->inumber); -	xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); -	xfs_dir2_data_log_entry(args->trans, bp, dep); +	dp->d_ops->data_put_ftype(dep, args->filetype); +	xfs_dir2_data_log_entry(args, bp, dep);  	xfs_dir3_data_check(dp, bp);  	return 0;  } @@ -934,9 +938,9 @@ xfs_dir2_leaf_to_block(  	tp = args->trans;  	mp = dp->i_mount;  	leaf = lbp->b_addr; -	xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); -	ents = xfs_dir3_leaf_ents_p(leaf); -	ltp = xfs_dir2_leaf_tail_p(mp, leaf); +	dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); +	ents = dp->d_ops->leaf_ents_p(leaf); +	ltp = xfs_dir2_leaf_tail_p(args->geo, leaf);  	ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC ||  	       leafhdr.magic == XFS_DIR3_LEAF1_MAGIC); @@ -946,13 +950,13 @@ xfs_dir2_leaf_to_block(  	 * been left behind during no-space-reservation operations.  	 * These will show up in the leaf bests table.  	 */ -	while (dp->i_d.di_size > mp->m_dirblksize) { +	while (dp->i_d.di_size > args->geo->blksize) {  		int hdrsz; -		hdrsz = xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); +		hdrsz = dp->d_ops->data_entry_offset;  		bestsp = xfs_dir2_leaf_bests_p(ltp);  		if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == -					    mp->m_dirblksize - hdrsz) { +					    args->geo->blksize - hdrsz) {  			if ((error =  			    xfs_dir2_leaf_trim_data(args, lbp,  				    (xfs_dir2_db_t)(be32_to_cpu(ltp->bestcount) - 1)))) @@ -964,7 +968,7 @@ xfs_dir2_leaf_to_block(  	 * Read the data block if we don't already have it, give up if it fails.  	 */  	if (!dbp) { -		error = xfs_dir3_data_read(tp, dp, mp->m_dirdatablk, -1, &dbp); +		error = xfs_dir3_data_read(tp, dp, args->geo->datablk, -1, &dbp);  		if (error)  			return error;  	} @@ -980,7 +984,7 @@ xfs_dir2_leaf_to_block(  	/*  	 * Look at the last data entry.  	 */ -	tagp = (__be16 *)((char *)hdr + mp->m_dirblksize) - 1; +	tagp = (__be16 *)((char *)hdr + args->geo->blksize) - 1;  	dup = (xfs_dir2_data_unused_t *)((char *)hdr + be16_to_cpu(*tagp));  	/*  	 * If it's not free or is too short we can't do it. @@ -999,12 +1003,12 @@ xfs_dir2_leaf_to_block(  	/*  	 * Use up the space at the end of the block (blp/btp).  	 */ -	xfs_dir2_data_use_free(tp, dbp, dup, mp->m_dirblksize - size, size, +	xfs_dir2_data_use_free(args, dbp, dup, args->geo->blksize - size, size,  		&needlog, &needscan);  	/*  	 * Initialize the block tail.  	 */ -	btp = xfs_dir2_block_tail_p(mp, hdr); +	btp = xfs_dir2_block_tail_p(args->geo, hdr);  	btp->count = cpu_to_be32(leafhdr.count - leafhdr.stale);  	btp->stale = 0;  	xfs_dir2_block_log_tail(tp, dbp); @@ -1023,13 +1027,13 @@ xfs_dir2_leaf_to_block(  	 * Scan the bestfree if we need it and log the data block header.  	 */  	if (needscan) -		xfs_dir2_data_freescan(mp, hdr, &needlog); +		xfs_dir2_data_freescan(dp, hdr, &needlog);  	if (needlog) -		xfs_dir2_data_log_header(tp, dbp); +		xfs_dir2_data_log_header(args, dbp);  	/*  	 * Pitch the old leaf block.  	 */ -	error = xfs_da_shrink_inode(args, mp->m_dirleafblk, lbp); +	error = xfs_da_shrink_inode(args, args->geo->leafblk, lbp);  	if (error)  		return error; @@ -1136,15 +1140,15 @@ xfs_dir2_sf_to_block(  	 * The whole thing is initialized to free by the init routine.  	 * Say we're using the leaf and tail area.  	 */ -	dup = xfs_dir3_data_unused_p(hdr); +	dup = dp->d_ops->data_unused_p(hdr);  	needlog = needscan = 0; -	xfs_dir2_data_use_free(tp, bp, dup, mp->m_dirblksize - i, i, &needlog, -		&needscan); +	xfs_dir2_data_use_free(args, bp, dup, args->geo->blksize - i, +			       i, &needlog, &needscan);  	ASSERT(needscan == 0);  	/*  	 * Fill in the tail.  	 */ -	btp = xfs_dir2_block_tail_p(mp, hdr); +	btp = xfs_dir2_block_tail_p(args->geo, hdr);  	btp->count = cpu_to_be32(sfp->count + 2);	/* ., .. */  	btp->stale = 0;  	blp = xfs_dir2_block_leaf_p(btp); @@ -1152,38 +1156,38 @@ xfs_dir2_sf_to_block(  	/*  	 * Remove the freespace, we'll manage it.  	 */ -	xfs_dir2_data_use_free(tp, bp, dup, +	xfs_dir2_data_use_free(args, bp, dup,  		(xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr),  		be16_to_cpu(dup->length), &needlog, &needscan);  	/*  	 * Create entry for .  	 */ -	dep = xfs_dir3_data_dot_entry_p(hdr); +	dep = dp->d_ops->data_dot_entry_p(hdr);  	dep->inumber = cpu_to_be64(dp->i_ino);  	dep->namelen = 1;  	dep->name[0] = '.'; -	xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); -	tagp = xfs_dir3_data_entry_tag_p(mp, dep); +	dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); +	tagp = dp->d_ops->data_entry_tag_p(dep);  	*tagp = cpu_to_be16((char *)dep - (char *)hdr); -	xfs_dir2_data_log_entry(tp, bp, dep); +	xfs_dir2_data_log_entry(args, bp, dep);  	blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); -	blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, +	blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(  				(char *)dep - (char *)hdr));  	/*  	 * Create entry for ..  	 */ -	dep = xfs_dir3_data_dotdot_entry_p(hdr); -	dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); +	dep = dp->d_ops->data_dotdot_entry_p(hdr); +	dep->inumber = cpu_to_be64(dp->d_ops->sf_get_parent_ino(sfp));  	dep->namelen = 2;  	dep->name[0] = dep->name[1] = '.'; -	xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); -	tagp = xfs_dir3_data_entry_tag_p(mp, dep); +	dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); +	tagp = dp->d_ops->data_entry_tag_p(dep);  	*tagp = cpu_to_be16((char *)dep - (char *)hdr); -	xfs_dir2_data_log_entry(tp, bp, dep); +	xfs_dir2_data_log_entry(args, bp, dep);  	blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); -	blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, +	blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(  				(char *)dep - (char *)hdr)); -	offset = xfs_dir3_data_first_offset(hdr); +	offset = dp->d_ops->data_first_offset;  	/*  	 * Loop over existing entries, stuff them in.  	 */ @@ -1213,8 +1217,10 @@ xfs_dir2_sf_to_block(  			dup->length = cpu_to_be16(newoffset - offset);  			*xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16(  				((char *)dup - (char *)hdr)); -			xfs_dir2_data_log_unused(tp, bp, dup); -			xfs_dir2_data_freeinsert(hdr, dup, &dummy); +			xfs_dir2_data_log_unused(args, bp, dup); +			xfs_dir2_data_freeinsert(hdr, +						 dp->d_ops->data_bestfree_p(hdr), +						 dup, &dummy);  			offset += be16_to_cpu(dup->length);  			continue;  		} @@ -1222,25 +1228,24 @@ xfs_dir2_sf_to_block(  		 * Copy a real entry.  		 */  		dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); -		dep->inumber = cpu_to_be64(xfs_dir3_sfe_get_ino(mp, sfp, sfep)); +		dep->inumber = cpu_to_be64(dp->d_ops->sf_get_ino(sfp, sfep));  		dep->namelen = sfep->namelen; -		xfs_dir3_dirent_put_ftype(mp, dep, -					xfs_dir3_sfe_get_ftype(mp, sfp, sfep)); +		dp->d_ops->data_put_ftype(dep, dp->d_ops->sf_get_ftype(sfep));  		memcpy(dep->name, sfep->name, dep->namelen); -		tagp = xfs_dir3_data_entry_tag_p(mp, dep); +		tagp = dp->d_ops->data_entry_tag_p(dep);  		*tagp = cpu_to_be16((char *)dep - (char *)hdr); -		xfs_dir2_data_log_entry(tp, bp, dep); +		xfs_dir2_data_log_entry(args, bp, dep);  		name.name = sfep->name;  		name.len = sfep->namelen;  		blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops->  							hashname(&name)); -		blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, +		blp[2 + i].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(  						 (char *)dep - (char *)hdr));  		offset = (int)((char *)(tagp + 1) - (char *)hdr);  		if (++i == sfp->count)  			sfep = NULL;  		else -			sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); +			sfep = dp->d_ops->sf_nextentry(sfp, sfep);  	}  	/* Done with the temporary buffer */  	kmem_free(sfp);  | 
