diff options
Diffstat (limited to 'fs/xfs/xfs_dir2_node.c')
| -rw-r--r-- | fs/xfs/xfs_dir2_node.c | 236 | 
1 files changed, 100 insertions, 136 deletions
diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index b0f26780449d..6c7052406605 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -36,20 +36,20 @@  /*   * Function declarations.   */ -static void xfs_dir2_free_log_header(xfs_trans_t *tp, xfs_dabuf_t *bp); -static int xfs_dir2_leafn_add(xfs_dabuf_t *bp, xfs_da_args_t *args, int index); +static int xfs_dir2_leafn_add(struct xfs_buf *bp, xfs_da_args_t *args, +			      int index);  #ifdef DEBUG -static void xfs_dir2_leafn_check(xfs_inode_t *dp, xfs_dabuf_t *bp); +static void xfs_dir2_leafn_check(struct xfs_inode *dp, struct xfs_buf *bp);  #else  #define	xfs_dir2_leafn_check(dp, bp)  #endif -static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, xfs_dabuf_t *bp_s, -				    int start_s, xfs_dabuf_t *bp_d, int start_d, -				    int count); +static void xfs_dir2_leafn_moveents(xfs_da_args_t *args, struct xfs_buf *bp_s, +				    int start_s, struct xfs_buf *bp_d, +				    int start_d, int count);  static void xfs_dir2_leafn_rebalance(xfs_da_state_t *state,  				     xfs_da_state_blk_t *blk1,  				     xfs_da_state_blk_t *blk2); -static int xfs_dir2_leafn_remove(xfs_da_args_t *args, xfs_dabuf_t *bp, +static int xfs_dir2_leafn_remove(xfs_da_args_t *args, struct xfs_buf *bp,  				 int index, xfs_da_state_blk_t *dblk,  				 int *rval);  static int xfs_dir2_node_addname_int(xfs_da_args_t *args, @@ -60,16 +60,16 @@ static int xfs_dir2_node_addname_int(xfs_da_args_t *args,   */  STATIC void  xfs_dir2_free_log_bests( -	xfs_trans_t		*tp,		/* transaction pointer */ -	xfs_dabuf_t		*bp,		/* freespace buffer */ +	struct xfs_trans	*tp, +	struct xfs_buf		*bp,  	int			first,		/* first entry to log */  	int			last)		/* last entry to log */  {  	xfs_dir2_free_t		*free;		/* freespace structure */ -	free = bp->data; +	free = bp->b_addr;  	ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); -	xfs_da_log_buf(tp, bp, +	xfs_trans_log_buf(tp, bp,  		(uint)((char *)&free->bests[first] - (char *)free),  		(uint)((char *)&free->bests[last] - (char *)free +  		       sizeof(free->bests[0]) - 1)); @@ -80,14 +80,14 @@ xfs_dir2_free_log_bests(   */  static void  xfs_dir2_free_log_header( -	xfs_trans_t		*tp,		/* transaction pointer */ -	xfs_dabuf_t		*bp)		/* freespace buffer */ +	struct xfs_trans	*tp, +	struct xfs_buf		*bp)  {  	xfs_dir2_free_t		*free;		/* freespace structure */ -	free = bp->data; +	free = bp->b_addr;  	ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)); -	xfs_da_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free), +	xfs_trans_log_buf(tp, bp, (uint)((char *)&free->hdr - (char *)free),  		(uint)(sizeof(xfs_dir2_free_hdr_t) - 1));  } @@ -99,11 +99,11 @@ xfs_dir2_free_log_header(  int						/* error */  xfs_dir2_leaf_to_node(  	xfs_da_args_t		*args,		/* operation arguments */ -	xfs_dabuf_t		*lbp)		/* leaf buffer */ +	struct xfs_buf		*lbp)		/* leaf buffer */  {  	xfs_inode_t		*dp;		/* incore directory inode */  	int			error;		/* error return value */ -	xfs_dabuf_t		*fbp;		/* freespace buffer */ +	struct xfs_buf		*fbp;		/* freespace buffer */  	xfs_dir2_db_t		fdb;		/* freespace block number */  	xfs_dir2_free_t		*free;		/* freespace structure */  	__be16			*from;		/* pointer to freespace entry */ @@ -136,8 +136,8 @@ xfs_dir2_leaf_to_node(  		return error;  	}  	ASSERT(fbp != NULL); -	free = fbp->data; -	leaf = lbp->data; +	free = fbp->b_addr; +	leaf = lbp->b_addr;  	ltp = xfs_dir2_leaf_tail_p(mp, leaf);  	/*  	 * Initialize the freespace block header. @@ -164,7 +164,6 @@ xfs_dir2_leaf_to_node(  	xfs_dir2_leaf_log_header(tp, lbp);  	xfs_dir2_free_log_header(tp, fbp);  	xfs_dir2_free_log_bests(tp, fbp, 0, be32_to_cpu(free->hdr.nvalid) - 1); -	xfs_da_buf_done(fbp);  	xfs_dir2_leafn_check(dp, lbp);  	return 0;  } @@ -175,7 +174,7 @@ xfs_dir2_leaf_to_node(   */  static int					/* error */  xfs_dir2_leafn_add( -	xfs_dabuf_t		*bp,		/* leaf buffer */ +	struct xfs_buf		*bp,		/* leaf buffer */  	xfs_da_args_t		*args,		/* operation arguments */  	int			index)		/* insertion pt for new entry */  { @@ -195,7 +194,7 @@ xfs_dir2_leafn_add(  	dp = args->dp;  	mp = dp->i_mount;  	tp = args->trans; -	leaf = bp->data; +	leaf = bp->b_addr;  	/*  	 * Quick check just to make sure we are not going to index @@ -261,15 +260,15 @@ xfs_dir2_leafn_add(   */  void  xfs_dir2_leafn_check( -	xfs_inode_t	*dp,			/* incore directory inode */ -	xfs_dabuf_t	*bp)			/* leaf buffer */ +	struct xfs_inode *dp, +	struct xfs_buf	*bp)  {  	int		i;			/* leaf index */  	xfs_dir2_leaf_t	*leaf;			/* leaf structure */  	xfs_mount_t	*mp;			/* filesystem mount point */  	int		stale;			/* count of stale leaves */ -	leaf = bp->data; +	leaf = bp->b_addr;  	mp = dp->i_mount;  	ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  	ASSERT(be16_to_cpu(leaf->hdr.count) <= xfs_dir2_max_leaf_ents(mp)); @@ -291,12 +290,12 @@ xfs_dir2_leafn_check(   */  xfs_dahash_t					/* hash value */  xfs_dir2_leafn_lasthash( -	xfs_dabuf_t	*bp,			/* leaf buffer */ +	struct xfs_buf	*bp,			/* leaf buffer */  	int		*count)			/* count of entries in leaf */  {  	xfs_dir2_leaf_t	*leaf;			/* leaf structure */ -	leaf = bp->data; +	leaf = bp->b_addr;  	ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  	if (count)  		*count = be16_to_cpu(leaf->hdr.count); @@ -311,12 +310,12 @@ xfs_dir2_leafn_lasthash(   */  STATIC int  xfs_dir2_leafn_lookup_for_addname( -	xfs_dabuf_t		*bp,		/* leaf buffer */ +	struct xfs_buf		*bp,		/* leaf buffer */  	xfs_da_args_t		*args,		/* operation arguments */  	int			*indexp,	/* out: leaf entry index */  	xfs_da_state_t		*state)		/* state to fill in */  { -	xfs_dabuf_t		*curbp = NULL;	/* current data/free buffer */ +	struct xfs_buf		*curbp = NULL;	/* current data/free buffer */  	xfs_dir2_db_t		curdb = -1;	/* current data block number */  	xfs_dir2_db_t		curfdb = -1;	/* current free block number */  	xfs_inode_t		*dp;		/* incore directory inode */ @@ -335,7 +334,7 @@ xfs_dir2_leafn_lookup_for_addname(  	dp = args->dp;  	tp = args->trans;  	mp = dp->i_mount; -	leaf = bp->data; +	leaf = bp->b_addr;  	ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  #ifdef __KERNEL__  	ASSERT(be16_to_cpu(leaf->hdr.count) > 0); @@ -352,7 +351,7 @@ xfs_dir2_leafn_lookup_for_addname(  		/* If so, it's a free block buffer, get the block number. */  		curbp = state->extrablk.bp;  		curfdb = state->extrablk.blkno; -		free = curbp->data; +		free = curbp->b_addr;  		ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));  	}  	length = xfs_dir2_data_entsize(args->namelen); @@ -394,7 +393,7 @@ xfs_dir2_leafn_lookup_for_addname(  				 * If we had one before, drop it.  				 */  				if (curbp) -					xfs_da_brelse(tp, curbp); +					xfs_trans_brelse(tp, curbp);  				/*  				 * Read the free block.  				 */ @@ -403,7 +402,7 @@ xfs_dir2_leafn_lookup_for_addname(  						-1, &curbp, XFS_DATA_FORK);  				if (error)  					return error; -				free = curbp->data; +				free = curbp->b_addr;  				ASSERT(be32_to_cpu(free->hdr.magic) ==  					XFS_DIR2_FREE_MAGIC);  				ASSERT((be32_to_cpu(free->hdr.firstdb) % @@ -424,7 +423,7 @@ xfs_dir2_leafn_lookup_for_addname(  				XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int",  							XFS_ERRLEVEL_LOW, mp);  				if (curfdb != newfdb) -					xfs_da_brelse(tp, curbp); +					xfs_trans_brelse(tp, curbp);  				return XFS_ERROR(EFSCORRUPTED);  			}  			curfdb = newfdb; @@ -459,12 +458,12 @@ out:   */  STATIC int  xfs_dir2_leafn_lookup_for_entry( -	xfs_dabuf_t		*bp,		/* leaf buffer */ +	struct xfs_buf		*bp,		/* leaf buffer */  	xfs_da_args_t		*args,		/* operation arguments */  	int			*indexp,	/* out: leaf entry index */  	xfs_da_state_t		*state)		/* state to fill in */  { -	xfs_dabuf_t		*curbp = NULL;	/* current data/free buffer */ +	struct xfs_buf		*curbp = NULL;	/* current data/free buffer */  	xfs_dir2_db_t		curdb = -1;	/* current data block number */  	xfs_dir2_data_entry_t	*dep;		/* data block entry */  	xfs_inode_t		*dp;		/* incore directory inode */ @@ -480,7 +479,7 @@ xfs_dir2_leafn_lookup_for_entry(  	dp = args->dp;  	tp = args->trans;  	mp = dp->i_mount; -	leaf = bp->data; +	leaf = bp->b_addr;  	ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  #ifdef __KERNEL__  	ASSERT(be16_to_cpu(leaf->hdr.count) > 0); @@ -525,7 +524,7 @@ xfs_dir2_leafn_lookup_for_entry(  			 */  			if (curbp && (args->cmpresult == XFS_CMP_DIFFERENT ||  						curdb != state->extrablk.blkno)) -				xfs_da_brelse(tp, curbp); +				xfs_trans_brelse(tp, curbp);  			/*  			 * If needing the block that is saved with a CI match,  			 * use it otherwise read in the new data block. @@ -547,7 +546,7 @@ xfs_dir2_leafn_lookup_for_entry(  		/*  		 * Point to the data entry.  		 */ -		dep = (xfs_dir2_data_entry_t *)((char *)curbp->data + +		dep = (xfs_dir2_data_entry_t *)((char *)curbp->b_addr +  			xfs_dir2_dataptr_to_off(mp, be32_to_cpu(lep->address)));  		/*  		 * Compare the entry and if it's an exact match, return @@ -559,7 +558,7 @@ xfs_dir2_leafn_lookup_for_entry(  			/* If there is a CI match block, drop it */  			if (args->cmpresult != XFS_CMP_DIFFERENT &&  						curdb != state->extrablk.blkno) -				xfs_da_brelse(tp, state->extrablk.bp); +				xfs_trans_brelse(tp, state->extrablk.bp);  			args->cmpresult = cmp;  			args->inumber = be64_to_cpu(dep->inumber);  			*indexp = index; @@ -567,7 +566,7 @@ xfs_dir2_leafn_lookup_for_entry(  			state->extrablk.bp = curbp;  			state->extrablk.blkno = curdb;  			state->extrablk.index = (int)((char *)dep - -							(char *)curbp->data); +							(char *)curbp->b_addr);  			state->extrablk.magic = XFS_DIR2_DATA_MAGIC;  			if (cmp == XFS_CMP_EXACT)  				return XFS_ERROR(EEXIST); @@ -586,7 +585,7 @@ xfs_dir2_leafn_lookup_for_entry(  		} else {  			/* If the curbp is not the CI match block, drop it */  			if (state->extrablk.bp != curbp) -				xfs_da_brelse(tp, curbp); +				xfs_trans_brelse(tp, curbp);  		}  	} else {  		state->extravalid = 0; @@ -602,7 +601,7 @@ xfs_dir2_leafn_lookup_for_entry(   */  int  xfs_dir2_leafn_lookup_int( -	xfs_dabuf_t		*bp,		/* leaf buffer */ +	struct xfs_buf		*bp,		/* leaf buffer */  	xfs_da_args_t		*args,		/* operation arguments */  	int			*indexp,	/* out: leaf entry index */  	xfs_da_state_t		*state)		/* state to fill in */ @@ -620,9 +619,9 @@ xfs_dir2_leafn_lookup_int(  static void  xfs_dir2_leafn_moveents(  	xfs_da_args_t	*args,			/* operation arguments */ -	xfs_dabuf_t	*bp_s,			/* source leaf buffer */ +	struct xfs_buf	*bp_s,			/* source leaf buffer */  	int		start_s,		/* source leaf index */ -	xfs_dabuf_t	*bp_d,			/* destination leaf buffer */ +	struct xfs_buf	*bp_d,			/* destination leaf buffer */  	int		start_d,		/* destination leaf index */  	int		count)			/* count of leaves to copy */  { @@ -640,8 +639,8 @@ xfs_dir2_leafn_moveents(  		return;  	}  	tp = args->trans; -	leaf_s = bp_s->data; -	leaf_d = bp_d->data; +	leaf_s = bp_s->b_addr; +	leaf_d = bp_d->b_addr;  	/*  	 * If the destination index is not the end of the current  	 * destination leaf entries, open up a hole in the destination @@ -702,14 +701,14 @@ xfs_dir2_leafn_moveents(   */  int						/* sort order */  xfs_dir2_leafn_order( -	xfs_dabuf_t	*leaf1_bp,		/* leaf1 buffer */ -	xfs_dabuf_t	*leaf2_bp)		/* leaf2 buffer */ +	struct xfs_buf	*leaf1_bp,		/* leaf1 buffer */ +	struct xfs_buf	*leaf2_bp)		/* leaf2 buffer */  {  	xfs_dir2_leaf_t	*leaf1;			/* leaf1 structure */  	xfs_dir2_leaf_t	*leaf2;			/* leaf2 structure */ -	leaf1 = leaf1_bp->data; -	leaf2 = leaf2_bp->data; +	leaf1 = leaf1_bp->b_addr; +	leaf2 = leaf2_bp->b_addr;  	ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  	ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  	if (be16_to_cpu(leaf1->hdr.count) > 0 && @@ -757,8 +756,8 @@ xfs_dir2_leafn_rebalance(  		blk1 = blk2;  		blk2 = tmp;  	} -	leaf1 = blk1->bp->data; -	leaf2 = blk2->bp->data; +	leaf1 = blk1->bp->b_addr; +	leaf2 = blk2->bp->b_addr;  	oldsum = be16_to_cpu(leaf1->hdr.count) + be16_to_cpu(leaf2->hdr.count);  #ifdef DEBUG  	oldstale = be16_to_cpu(leaf1->hdr.stale) + be16_to_cpu(leaf2->hdr.stale); @@ -834,14 +833,14 @@ xfs_dir2_leafn_rebalance(  static int					/* error */  xfs_dir2_leafn_remove(  	xfs_da_args_t		*args,		/* operation arguments */ -	xfs_dabuf_t		*bp,		/* leaf buffer */ +	struct xfs_buf		*bp,		/* leaf buffer */  	int			index,		/* leaf entry index */  	xfs_da_state_blk_t	*dblk,		/* data block */  	int			*rval)		/* resulting block needs join */  {  	xfs_dir2_data_hdr_t	*hdr;		/* data block header */  	xfs_dir2_db_t		db;		/* data block number */ -	xfs_dabuf_t		*dbp;		/* data block buffer */ +	struct xfs_buf		*dbp;		/* data block buffer */  	xfs_dir2_data_entry_t	*dep;		/* data block entry */  	xfs_inode_t		*dp;		/* incore directory inode */  	xfs_dir2_leaf_t		*leaf;		/* leaf structure */ @@ -858,7 +857,7 @@ xfs_dir2_leafn_remove(  	dp = args->dp;  	tp = args->trans;  	mp = dp->i_mount; -	leaf = bp->data; +	leaf = bp->b_addr;  	ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  	/*  	 * Point to the entry we're removing. @@ -884,7 +883,7 @@ xfs_dir2_leafn_remove(  	 * in the data block in case it changes.  	 */  	dbp = dblk->bp; -	hdr = dbp->data; +	hdr = dbp->b_addr;  	dep = (xfs_dir2_data_entry_t *)((char *)hdr + off);  	longest = be16_to_cpu(hdr->bestfree[0].length);  	needlog = needscan = 0; @@ -905,7 +904,7 @@ xfs_dir2_leafn_remove(  	 */  	if (longest < be16_to_cpu(hdr->bestfree[0].length)) {  		int		error;		/* error return value */ -		xfs_dabuf_t	*fbp;		/* freeblock buffer */ +		struct xfs_buf	*fbp;		/* freeblock buffer */  		xfs_dir2_db_t	fdb;		/* freeblock block number */  		int		findex;		/* index in freeblock entries */  		xfs_dir2_free_t	*free;		/* freeblock structure */ @@ -920,7 +919,7 @@ xfs_dir2_leafn_remove(  				-1, &fbp, XFS_DATA_FORK))) {  			return error;  		} -		free = fbp->data; +		free = fbp->b_addr;  		ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));  		ASSERT(be32_to_cpu(free->hdr.firstdb) ==  		       xfs_dir2_free_max_bests(mp) * @@ -948,9 +947,7 @@ xfs_dir2_leafn_remove(  			 * In this case just drop the buffer and some one else  			 * will eventually get rid of the empty block.  			 */ -			else if (error == ENOSPC && args->total == 0) -				xfs_da_buf_done(dbp); -			else +			else if (!(error == ENOSPC && args->total == 0))  				return error;  		}  		/* @@ -1018,11 +1015,6 @@ xfs_dir2_leafn_remove(  		 */  		if (logfree)  			xfs_dir2_free_log_bests(tp, fbp, findex, findex); -		/* -		 * Drop the buffer if we still have it. -		 */ -		if (fbp) -			xfs_da_buf_done(fbp);  	}  	xfs_dir2_leafn_check(dp, bp);  	/* @@ -1114,7 +1106,7 @@ xfs_dir2_leafn_toosmall(  {  	xfs_da_state_blk_t	*blk;		/* leaf block */  	xfs_dablk_t		blkno;		/* leaf block number */ -	xfs_dabuf_t		*bp;		/* leaf buffer */ +	struct xfs_buf		*bp;		/* leaf buffer */  	int			bytes;		/* bytes in use */  	int			count;		/* leaf live entry count */  	int			error;		/* error return value */ @@ -1130,7 +1122,7 @@ xfs_dir2_leafn_toosmall(  	 * to coalesce with a sibling.  	 */  	blk = &state->path.blk[state->path.active - 1]; -	info = blk->bp->data; +	info = blk->bp->b_addr;  	ASSERT(info->magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  	leaf = (xfs_dir2_leaf_t *)info;  	count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale); @@ -1189,7 +1181,7 @@ xfs_dir2_leafn_toosmall(  		leaf = (xfs_dir2_leaf_t *)info;  		count = be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale);  		bytes = state->blocksize - (state->blocksize >> 2); -		leaf = bp->data; +		leaf = bp->b_addr;  		ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  		count += be16_to_cpu(leaf->hdr.count) - be16_to_cpu(leaf->hdr.stale);  		bytes -= count * (uint)sizeof(leaf->ents[0]); @@ -1198,7 +1190,7 @@ xfs_dir2_leafn_toosmall(  		 */  		if (bytes >= 0)  			break; -		xfs_da_brelse(state->args->trans, bp); +		xfs_trans_brelse(state->args->trans, bp);  	}  	/*  	 * Didn't like either block, give up. @@ -1207,11 +1199,7 @@ xfs_dir2_leafn_toosmall(  		*action = 0;  		return 0;  	} -	/* -	 * Done with the sibling leaf block here, drop the dabuf -	 * so path_shift can get it. -	 */ -	xfs_da_buf_done(bp); +  	/*  	 * Make altpath point to the block we want to keep (the lower  	 * numbered block) and path point to the block we want to drop. @@ -1247,8 +1235,8 @@ xfs_dir2_leafn_unbalance(  	args = state->args;  	ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC);  	ASSERT(save_blk->magic == XFS_DIR2_LEAFN_MAGIC); -	drop_leaf = drop_blk->bp->data; -	save_leaf = save_blk->bp->data; +	drop_leaf = drop_blk->bp->b_addr; +	save_leaf = save_blk->bp->b_addr;  	ASSERT(drop_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  	ASSERT(save_leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC));  	/* @@ -1356,13 +1344,13 @@ xfs_dir2_node_addname_int(  {  	xfs_dir2_data_hdr_t	*hdr;		/* data block header */  	xfs_dir2_db_t		dbno;		/* data block number */ -	xfs_dabuf_t		*dbp;		/* data block buffer */ +	struct xfs_buf		*dbp;		/* data block buffer */  	xfs_dir2_data_entry_t	*dep;		/* data entry pointer */  	xfs_inode_t		*dp;		/* incore directory inode */  	xfs_dir2_data_unused_t	*dup;		/* data unused entry pointer */  	int			error;		/* error return value */  	xfs_dir2_db_t		fbno;		/* freespace block number */ -	xfs_dabuf_t		*fbp;		/* freespace buffer */ +	struct xfs_buf		*fbp;		/* freespace buffer */  	int			findex;		/* freespace entry index */  	xfs_dir2_free_t		*free=NULL;	/* freespace block structure */  	xfs_dir2_db_t		ifbno;		/* initial freespace block no */ @@ -1390,7 +1378,7 @@ xfs_dir2_node_addname_int(  		 * Remember initial freespace block number.  		 */  		ifbno = fblk->blkno; -		free = fbp->data; +		free = fbp->b_addr;  		ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));  		findex = fblk->index;  		/* @@ -1474,7 +1462,7 @@ xfs_dir2_node_addname_int(  			if (unlikely(fbp == NULL)) {  				continue;  			} -			free = fbp->data; +			free = fbp->b_addr;  			ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));  			findex = 0;  		} @@ -1492,7 +1480,7 @@ xfs_dir2_node_addname_int(  				/*  				 * Drop the block.  				 */ -				xfs_da_brelse(tp, fbp); +				xfs_trans_brelse(tp, fbp);  				fbp = NULL;  				if (fblk && fblk->bp)  					fblk->bp = NULL; @@ -1507,36 +1495,23 @@ xfs_dir2_node_addname_int(  		/*  		 * Not allowed to allocate, return failure.  		 */ -		if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || -							args->total == 0) { -			/* -			 * Drop the freespace buffer unless it came from our -			 * caller. -			 */ -			if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) -				xfs_da_buf_done(fbp); +		if ((args->op_flags & XFS_DA_OP_JUSTCHECK) || args->total == 0)  			return XFS_ERROR(ENOSPC); -		} +  		/*  		 * Allocate and initialize the new data block.  		 */  		if (unlikely((error = xfs_dir2_grow_inode(args,  							 XFS_DIR2_DATA_SPACE,  							 &dbno)) || -		    (error = xfs_dir2_data_init(args, dbno, &dbp)))) { -			/* -			 * Drop the freespace buffer unless it came from our -			 * caller. -			 */ -			if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) -				xfs_da_buf_done(fbp); +		    (error = xfs_dir2_data_init(args, dbno, &dbp))))  			return error; -		} +  		/*  		 * If (somehow) we have a freespace block, get rid of it.  		 */  		if (fbp) -			xfs_da_brelse(tp, fbp); +			xfs_trans_brelse(tp, fbp);  		if (fblk && fblk->bp)  			fblk->bp = NULL; @@ -1547,10 +1522,9 @@ xfs_dir2_node_addname_int(  		fbno = xfs_dir2_db_to_fdb(mp, dbno);  		if (unlikely(error = xfs_da_read_buf(tp, dp,  				xfs_dir2_db_to_da(mp, fbno), -2, &fbp, -				XFS_DATA_FORK))) { -			xfs_da_buf_done(dbp); +				XFS_DATA_FORK)))  			return error; -  		} +  		/*  		 * If there wasn't a freespace block, the read will  		 * return a NULL fbp.  Allocate and initialize a new one. @@ -1598,7 +1572,7 @@ xfs_dir2_node_addname_int(  			 * Initialize the new block to be empty, and remember  			 * its first slot as our empty slot.  			 */ -			free = fbp->data; +			free = fbp->b_addr;  			free->hdr.magic = cpu_to_be32(XFS_DIR2_FREE_MAGIC);  			free->hdr.firstdb = cpu_to_be32(  				(fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * @@ -1606,7 +1580,7 @@ xfs_dir2_node_addname_int(  			free->hdr.nvalid = 0;  			free->hdr.nused = 0;  		} else { -			free = fbp->data; +			free = fbp->b_addr;  			ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));  		} @@ -1639,7 +1613,7 @@ xfs_dir2_node_addname_int(  		 * We haven't allocated the data entry yet so this will  		 * change again.  		 */ -		hdr = dbp->data; +		hdr = dbp->b_addr;  		free->bests[findex] = hdr->bestfree[0].length;  		logfree = 1;  	} @@ -1650,22 +1624,17 @@ xfs_dir2_node_addname_int(  		/*  		 * If just checking, we succeeded.  		 */ -		if (args->op_flags & XFS_DA_OP_JUSTCHECK) { -			if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) -				xfs_da_buf_done(fbp); +		if (args->op_flags & XFS_DA_OP_JUSTCHECK)  			return 0; -		} +  		/*  		 * Read the data block in.  		 */ -		if (unlikely( -		    error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, dbno), -				-1, &dbp, XFS_DATA_FORK))) { -			if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) -				xfs_da_buf_done(fbp); +		error = xfs_da_read_buf(tp, dp, xfs_dir2_db_to_da(mp, dbno), +				-1, &dbp, XFS_DATA_FORK); +		if (error)  			return error; -		} -		hdr = dbp->data; +		hdr = dbp->b_addr;  		logfree = 0;  	}  	ASSERT(be16_to_cpu(hdr->bestfree[0].length) >= length); @@ -1714,16 +1683,10 @@ xfs_dir2_node_addname_int(  	if (logfree)  		xfs_dir2_free_log_bests(tp, fbp, findex, findex);  	/* -	 * If the caller didn't hand us the freespace block, drop it. -	 */ -	if ((fblk == NULL || fblk->bp == NULL) && fbp != NULL) -		xfs_da_buf_done(fbp); -	/*  	 * Return the data block and offset in args, then drop the data block.  	 */  	args->blkno = (xfs_dablk_t)dbno;  	args->index = be16_to_cpu(*tagp); -	xfs_da_buf_done(dbp);  	return 0;  } @@ -1761,22 +1724,23 @@ xfs_dir2_node_lookup(  		/* If a CI match, dup the actual name and return EEXIST */  		xfs_dir2_data_entry_t	*dep; -		dep = (xfs_dir2_data_entry_t *)((char *)state->extrablk.bp-> -						data + state->extrablk.index); +		dep = (xfs_dir2_data_entry_t *) +			((char *)state->extrablk.bp->b_addr + +						 state->extrablk.index);  		rval = xfs_dir_cilookup_result(args, dep->name, dep->namelen);  	}  	/*  	 * Release the btree blocks and leaf block.  	 */  	for (i = 0; i < state->path.active; i++) { -		xfs_da_brelse(args->trans, state->path.blk[i].bp); +		xfs_trans_brelse(args->trans, state->path.blk[i].bp);  		state->path.blk[i].bp = NULL;  	}  	/*  	 * Release the data block if we have it.  	 */  	if (state->extravalid && state->extrablk.bp) { -		xfs_da_brelse(args->trans, state->extrablk.bp); +		xfs_trans_brelse(args->trans, state->extrablk.bp);  		state->extrablk.bp = NULL;  	}  	xfs_da_state_free(state); @@ -1893,13 +1857,13 @@ xfs_dir2_node_replace(  		 */  		blk = &state->path.blk[state->path.active - 1];  		ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); -		leaf = blk->bp->data; +		leaf = blk->bp->b_addr;  		lep = &leaf->ents[blk->index];  		ASSERT(state->extravalid);  		/*  		 * Point to the data entry.  		 */ -		hdr = state->extrablk.bp->data; +		hdr = state->extrablk.bp->b_addr;  		ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC));  		dep = (xfs_dir2_data_entry_t *)  		      ((char *)hdr + @@ -1916,14 +1880,14 @@ xfs_dir2_node_replace(  	 * Didn't find it, and we're holding a data block.  Drop it.  	 */  	else if (state->extravalid) { -		xfs_da_brelse(args->trans, state->extrablk.bp); +		xfs_trans_brelse(args->trans, state->extrablk.bp);  		state->extrablk.bp = NULL;  	}  	/*  	 * Release all the buffers in the cursor.  	 */  	for (i = 0; i < state->path.active; i++) { -		xfs_da_brelse(args->trans, state->path.blk[i].bp); +		xfs_trans_brelse(args->trans, state->path.blk[i].bp);  		state->path.blk[i].bp = NULL;  	}  	xfs_da_state_free(state); @@ -1940,7 +1904,7 @@ xfs_dir2_node_trim_free(  	xfs_fileoff_t		fo,		/* free block number */  	int			*rvalp)		/* out: did something */  { -	xfs_dabuf_t		*bp;		/* freespace buffer */ +	struct xfs_buf		*bp;		/* freespace buffer */  	xfs_inode_t		*dp;		/* incore directory inode */  	int			error;		/* error return code */  	xfs_dir2_free_t		*free;		/* freespace structure */ @@ -1965,13 +1929,13 @@ xfs_dir2_node_trim_free(  	if (bp == NULL) {  		return 0;  	} -	free = bp->data; +	free = bp->b_addr;  	ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC));  	/*  	 * If there are used entries, there's nothing to do.  	 */  	if (be32_to_cpu(free->hdr.nused) > 0) { -		xfs_da_brelse(tp, bp); +		xfs_trans_brelse(tp, bp);  		*rvalp = 0;  		return 0;  	} @@ -1987,7 +1951,7 @@ xfs_dir2_node_trim_free(  		 * pieces.  This is the last block of an extent.  		 */  		ASSERT(error != ENOSPC); -		xfs_da_brelse(tp, bp); +		xfs_trans_brelse(tp, bp);  		return error;  	}  	/*  | 
