diff options
Diffstat (limited to 'fs/xfs/xfs_bmap.c')
| -rw-r--r-- | fs/xfs/xfs_bmap.c | 327 | 
1 files changed, 42 insertions, 285 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 99587ded043f..23f14e595c18 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -30,13 +30,10 @@  #include "xfs_alloc_btree.h"  #include "xfs_ialloc_btree.h"  #include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h"  #include "xfs_dinode.h"  #include "xfs_inode.h"  #include "xfs_btree.h" -#include "xfs_dmapi.h"  #include "xfs_mount.h" -#include "xfs_ialloc.h"  #include "xfs_itable.h"  #include "xfs_dir2_data.h"  #include "xfs_dir2_leaf.h" @@ -104,7 +101,6 @@ xfs_bmap_add_extent(  	xfs_fsblock_t		*first,	/* pointer to firstblock variable */  	xfs_bmap_free_t		*flist,	/* list of extents to be freed */  	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			whichfork, /* data or attr fork */  	int			rsvd);	/* OK to allocate reserved blocks */ @@ -122,7 +118,6 @@ xfs_bmap_add_extent_delay_real(  	xfs_fsblock_t		*first,	/* pointer to firstblock variable */  	xfs_bmap_free_t		*flist,	/* list of extents to be freed */  	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			rsvd);	/* OK to allocate reserved blocks */  /* @@ -135,7 +130,6 @@ xfs_bmap_add_extent_hole_delay(  	xfs_extnum_t		idx,	/* extent number to update/insert */  	xfs_bmbt_irec_t		*new,	/* new data to add to file extents */  	int			*logflagsp,/* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			rsvd);	/* OK to allocate reserved blocks */  /* @@ -149,7 +143,6 @@ xfs_bmap_add_extent_hole_real(  	xfs_btree_cur_t		*cur,	/* if null, not a btree */  	xfs_bmbt_irec_t		*new,	/* new data to add to file extents */  	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			whichfork); /* data or attr fork */  /* @@ -162,8 +155,7 @@ xfs_bmap_add_extent_unwritten_real(  	xfs_extnum_t		idx,	/* extent number to update/insert */  	xfs_btree_cur_t		**curp,	/* if *curp is null, not a btree */  	xfs_bmbt_irec_t		*new,	/* new data to add to file extents */ -	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta); /* Change made to incore extents */ +	int			*logflagsp); /* inode logging flags */  /*   * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. @@ -200,7 +192,6 @@ xfs_bmap_del_extent(  	xfs_btree_cur_t		*cur,	/* if null, not a btree */  	xfs_bmbt_irec_t		*new,	/* new data to add to file extents */  	int			*logflagsp,/* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			whichfork, /* data or attr fork */  	int			rsvd);	 /* OK to allocate reserved blocks */ @@ -489,7 +480,6 @@ xfs_bmap_add_extent(  	xfs_fsblock_t		*first,	/* pointer to firstblock variable */  	xfs_bmap_free_t		*flist,	/* list of extents to be freed */  	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			whichfork, /* data or attr fork */  	int			rsvd)	/* OK to use reserved data blocks */  { @@ -524,15 +514,6 @@ xfs_bmap_add_extent(  			logflags = XFS_ILOG_CORE | xfs_ilog_fext(whichfork);  		} else  			logflags = 0; -		/* DELTA: single new extent */ -		if (delta) { -			if (delta->xed_startoff > new->br_startoff) -				delta->xed_startoff = new->br_startoff; -			if (delta->xed_blockcount < -					new->br_startoff + new->br_blockcount) -				delta->xed_blockcount = new->br_startoff + -						new->br_blockcount; -		}  	}  	/*  	 * Any kind of new delayed allocation goes here. @@ -542,7 +523,7 @@ xfs_bmap_add_extent(  			ASSERT((cur->bc_private.b.flags &  				XFS_BTCUR_BPRV_WASDEL) == 0);  		if ((error = xfs_bmap_add_extent_hole_delay(ip, idx, new, -				&logflags, delta, rsvd))) +				&logflags, rsvd)))  			goto done;  	}  	/* @@ -553,7 +534,7 @@ xfs_bmap_add_extent(  			ASSERT((cur->bc_private.b.flags &  				XFS_BTCUR_BPRV_WASDEL) == 0);  		if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, new, -				&logflags, delta, whichfork))) +				&logflags, whichfork)))  			goto done;  	} else {  		xfs_bmbt_irec_t	prev;	/* old extent at offset idx */ @@ -578,17 +559,17 @@ xfs_bmap_add_extent(  						XFS_BTCUR_BPRV_WASDEL);  				if ((error = xfs_bmap_add_extent_delay_real(ip,  					idx, &cur, new, &da_new, first, flist, -					&logflags, delta, rsvd))) +					&logflags, rsvd)))  					goto done;  			} else if (new->br_state == XFS_EXT_NORM) {  				ASSERT(new->br_state == XFS_EXT_NORM);  				if ((error = xfs_bmap_add_extent_unwritten_real( -					ip, idx, &cur, new, &logflags, delta))) +					ip, idx, &cur, new, &logflags)))  					goto done;  			} else {  				ASSERT(new->br_state == XFS_EXT_UNWRITTEN);  				if ((error = xfs_bmap_add_extent_unwritten_real( -					ip, idx, &cur, new, &logflags, delta))) +					ip, idx, &cur, new, &logflags)))  					goto done;  			}  			ASSERT(*curp == cur || *curp == NULL); @@ -601,7 +582,7 @@ xfs_bmap_add_extent(  				ASSERT((cur->bc_private.b.flags &  					XFS_BTCUR_BPRV_WASDEL) == 0);  			if ((error = xfs_bmap_add_extent_hole_real(ip, idx, cur, -					new, &logflags, delta, whichfork))) +					new, &logflags, whichfork)))  				goto done;  		}  	} @@ -666,7 +647,6 @@ xfs_bmap_add_extent_delay_real(  	xfs_fsblock_t		*first,	/* pointer to firstblock variable */  	xfs_bmap_free_t		*flist,	/* list of extents to be freed */  	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			rsvd)	/* OK to use reserved data block allocation */  {  	xfs_btree_cur_t		*cur;	/* btree cursor */ @@ -797,11 +777,6 @@ xfs_bmap_add_extent_delay_real(  				goto done;  		}  		*dnew = 0; -		/* DELTA: Three in-core extents are replaced by one. */ -		temp = LEFT.br_startoff; -		temp2 = LEFT.br_blockcount + -			PREV.br_blockcount + -			RIGHT.br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: @@ -832,10 +807,6 @@ xfs_bmap_add_extent_delay_real(  				goto done;  		}  		*dnew = 0; -		/* DELTA: Two in-core extents are replaced by one. */ -		temp = LEFT.br_startoff; -		temp2 = LEFT.br_blockcount + -			PREV.br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -867,10 +838,6 @@ xfs_bmap_add_extent_delay_real(  				goto done;  		}  		*dnew = 0; -		/* DELTA: Two in-core extents are replaced by one. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount + -			RIGHT.br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: @@ -900,9 +867,6 @@ xfs_bmap_add_extent_delay_real(  			XFS_WANT_CORRUPTED_GOTO(i == 1, done);  		}  		*dnew = 0; -		/* DELTA: The in-core extent described by new changed type. */ -		temp = new->br_startoff; -		temp2 = new->br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: @@ -942,10 +906,6 @@ xfs_bmap_add_extent_delay_real(  		xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));  		trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_);  		*dnew = temp; -		/* DELTA: The boundary between two in-core extents moved. */ -		temp = LEFT.br_startoff; -		temp2 = LEFT.br_blockcount + -			PREV.br_blockcount;  		break;  	case BMAP_LEFT_FILLING: @@ -990,9 +950,6 @@ xfs_bmap_add_extent_delay_real(  		xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));  		trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_);  		*dnew = temp; -		/* DELTA: One in-core extent is split in two. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount;  		break;  	case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -1031,10 +988,6 @@ xfs_bmap_add_extent_delay_real(  		xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));  		trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_);  		*dnew = temp; -		/* DELTA: The boundary between two in-core extents moved. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount + -			RIGHT.br_blockcount;  		break;  	case BMAP_RIGHT_FILLING: @@ -1078,9 +1031,6 @@ xfs_bmap_add_extent_delay_real(  		xfs_bmbt_set_startblock(ep, nullstartblock((int)temp));  		trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_);  		*dnew = temp; -		/* DELTA: One in-core extent is split in two. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount;  		break;  	case 0: @@ -1161,9 +1111,6 @@ xfs_bmap_add_extent_delay_real(  			nullstartblock((int)temp2));  		trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_);  		*dnew = temp + temp2; -		/* DELTA: One in-core extent is split in three. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: @@ -1179,13 +1126,6 @@ xfs_bmap_add_extent_delay_real(  		ASSERT(0);  	}  	*curp = cur; -	if (delta) { -		temp2 += temp; -		if (delta->xed_startoff > temp) -			delta->xed_startoff = temp; -		if (delta->xed_blockcount < temp2) -			delta->xed_blockcount = temp2; -	}  done:  	*logflagsp = rval;  	return error; @@ -1204,8 +1144,7 @@ xfs_bmap_add_extent_unwritten_real(  	xfs_extnum_t		idx,	/* extent number to update/insert */  	xfs_btree_cur_t		**curp,	/* if *curp is null, not a btree */  	xfs_bmbt_irec_t		*new,	/* new data to add to file extents */ -	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta) /* Change made to incore extents */ +	int			*logflagsp) /* inode logging flags */  {  	xfs_btree_cur_t		*cur;	/* btree cursor */  	xfs_bmbt_rec_host_t	*ep;	/* extent entry for idx */ @@ -1219,8 +1158,6 @@ xfs_bmap_add_extent_unwritten_real(  					/* left is 0, right is 1, prev is 2 */  	int			rval=0;	/* return value (logging flags) */  	int			state = 0;/* state bits, accessed thru macros */ -	xfs_filblks_t		temp=0; -	xfs_filblks_t		temp2=0;  #define	LEFT		r[0]  #define	RIGHT		r[1] @@ -1341,11 +1278,6 @@ xfs_bmap_add_extent_unwritten_real(  				RIGHT.br_blockcount, LEFT.br_state)))  				goto done;  		} -		/* DELTA: Three in-core extents are replaced by one. */ -		temp = LEFT.br_startoff; -		temp2 = LEFT.br_blockcount + -			PREV.br_blockcount + -			RIGHT.br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: @@ -1382,10 +1314,6 @@ xfs_bmap_add_extent_unwritten_real(  				LEFT.br_state)))  				goto done;  		} -		/* DELTA: Two in-core extents are replaced by one. */ -		temp = LEFT.br_startoff; -		temp2 = LEFT.br_blockcount + -			PREV.br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -1422,10 +1350,6 @@ xfs_bmap_add_extent_unwritten_real(  				newext)))  				goto done;  		} -		/* DELTA: Two in-core extents are replaced by one. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount + -			RIGHT.br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: @@ -1453,9 +1377,6 @@ xfs_bmap_add_extent_unwritten_real(  				newext)))  				goto done;  		} -		/* DELTA: The in-core extent described by new changed type. */ -		temp = new->br_startoff; -		temp2 = new->br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: @@ -1501,10 +1422,6 @@ xfs_bmap_add_extent_unwritten_real(  				LEFT.br_state))  				goto done;  		} -		/* DELTA: The boundary between two in-core extents moved. */ -		temp = LEFT.br_startoff; -		temp2 = LEFT.br_blockcount + -			PREV.br_blockcount;  		break;  	case BMAP_LEFT_FILLING: @@ -1544,9 +1461,6 @@ xfs_bmap_add_extent_unwritten_real(  				goto done;  			XFS_WANT_CORRUPTED_GOTO(i == 1, done);  		} -		/* DELTA: One in-core extent is split in two. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount;  		break;  	case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: @@ -1587,10 +1501,6 @@ xfs_bmap_add_extent_unwritten_real(  				newext)))  				goto done;  		} -		/* DELTA: The boundary between two in-core extents moved. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount + -			RIGHT.br_blockcount;  		break;  	case BMAP_RIGHT_FILLING: @@ -1630,9 +1540,6 @@ xfs_bmap_add_extent_unwritten_real(  				goto done;  			XFS_WANT_CORRUPTED_GOTO(i == 1, done);  		} -		/* DELTA: One in-core extent is split in two. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount;  		break;  	case 0: @@ -1692,9 +1599,6 @@ xfs_bmap_add_extent_unwritten_real(  				goto done;  			XFS_WANT_CORRUPTED_GOTO(i == 1, done);  		} -		/* DELTA: One in-core extent is split in three. */ -		temp = PREV.br_startoff; -		temp2 = PREV.br_blockcount;  		break;  	case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: @@ -1710,13 +1614,6 @@ xfs_bmap_add_extent_unwritten_real(  		ASSERT(0);  	}  	*curp = cur; -	if (delta) { -		temp2 += temp; -		if (delta->xed_startoff > temp) -			delta->xed_startoff = temp; -		if (delta->xed_blockcount < temp2) -			delta->xed_blockcount = temp2; -	}  done:  	*logflagsp = rval;  	return error; @@ -1736,7 +1633,6 @@ xfs_bmap_add_extent_hole_delay(  	xfs_extnum_t		idx,	/* extent number to update/insert */  	xfs_bmbt_irec_t		*new,	/* new data to add to file extents */  	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			rsvd)		/* OK to allocate reserved blocks */  {  	xfs_bmbt_rec_host_t	*ep;	/* extent record for idx */ @@ -1747,7 +1643,6 @@ xfs_bmap_add_extent_hole_delay(  	xfs_bmbt_irec_t		right;	/* right neighbor extent entry */  	int			state;  /* state bits, accessed thru macros */  	xfs_filblks_t		temp=0;	/* temp for indirect calculations */ -	xfs_filblks_t		temp2=0;  	ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);  	ep = xfs_iext_get_ext(ifp, idx); @@ -1819,9 +1714,6 @@ xfs_bmap_add_extent_hole_delay(  		xfs_iext_remove(ip, idx, 1, state);  		ip->i_df.if_lastex = idx - 1; -		/* DELTA: Two in-core extents were replaced by one. */ -		temp2 = temp; -		temp = left.br_startoff;  		break;  	case BMAP_LEFT_CONTIG: @@ -1841,9 +1733,6 @@ xfs_bmap_add_extent_hole_delay(  		trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_);  		ip->i_df.if_lastex = idx - 1; -		/* DELTA: One in-core extent grew into a hole. */ -		temp2 = temp; -		temp = left.br_startoff;  		break;  	case BMAP_RIGHT_CONTIG: @@ -1862,9 +1751,6 @@ xfs_bmap_add_extent_hole_delay(  		trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_);  		ip->i_df.if_lastex = idx; -		/* DELTA: One in-core extent grew into a hole. */ -		temp2 = temp; -		temp = new->br_startoff;  		break;  	case 0: @@ -1876,9 +1762,6 @@ xfs_bmap_add_extent_hole_delay(  		oldlen = newlen = 0;  		xfs_iext_insert(ip, idx, 1, new, state);  		ip->i_df.if_lastex = idx; -		/* DELTA: A new in-core extent was added in a hole. */ -		temp2 = new->br_blockcount; -		temp = new->br_startoff;  		break;  	}  	if (oldlen != newlen) { @@ -1889,13 +1772,6 @@ xfs_bmap_add_extent_hole_delay(  		 * Nothing to do for disk quota accounting here.  		 */  	} -	if (delta) { -		temp2 += temp; -		if (delta->xed_startoff > temp) -			delta->xed_startoff = temp; -		if (delta->xed_blockcount < temp2) -			delta->xed_blockcount = temp2; -	}  	*logflagsp = 0;  	return 0;  } @@ -1911,7 +1787,6 @@ xfs_bmap_add_extent_hole_real(  	xfs_btree_cur_t		*cur,	/* if null, not a btree */  	xfs_bmbt_irec_t		*new,	/* new data to add to file extents */  	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			whichfork) /* data or attr fork */  {  	xfs_bmbt_rec_host_t	*ep;	/* pointer to extent entry ins. point */ @@ -1922,8 +1797,6 @@ xfs_bmap_add_extent_hole_real(  	xfs_bmbt_irec_t		right;	/* right neighbor extent entry */  	int			rval=0;	/* return value (logging flags) */  	int			state;	/* state bits, accessed thru macros */ -	xfs_filblks_t		temp=0; -	xfs_filblks_t		temp2=0;  	ifp = XFS_IFORK_PTR(ip, whichfork);  	ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); @@ -2020,11 +1893,6 @@ xfs_bmap_add_extent_hole_real(  					left.br_state)))  				goto done;  		} -		/* DELTA: Two in-core extents were replaced by one. */ -		temp = left.br_startoff; -		temp2 = left.br_blockcount + -			new->br_blockcount + -			right.br_blockcount;  		break;  	case BMAP_LEFT_CONTIG: @@ -2056,10 +1924,6 @@ xfs_bmap_add_extent_hole_real(  					left.br_state)))  				goto done;  		} -		/* DELTA: One in-core extent grew. */ -		temp = left.br_startoff; -		temp2 = left.br_blockcount + -			new->br_blockcount;  		break;  	case BMAP_RIGHT_CONTIG: @@ -2092,10 +1956,6 @@ xfs_bmap_add_extent_hole_real(  					right.br_state)))  				goto done;  		} -		/* DELTA: One in-core extent grew. */ -		temp = new->br_startoff; -		temp2 = new->br_blockcount + -			right.br_blockcount;  		break;  	case 0: @@ -2123,18 +1983,8 @@ xfs_bmap_add_extent_hole_real(  				goto done;  			XFS_WANT_CORRUPTED_GOTO(i == 1, done);  		} -		/* DELTA: A new extent was added in a hole. */ -		temp = new->br_startoff; -		temp2 = new->br_blockcount;  		break;  	} -	if (delta) { -		temp2 += temp; -		if (delta->xed_startoff > temp) -			delta->xed_startoff = temp; -		if (delta->xed_blockcount < temp2) -			delta->xed_blockcount = temp2; -	}  done:  	*logflagsp = rval;  	return error; @@ -2959,7 +2809,6 @@ xfs_bmap_del_extent(  	xfs_btree_cur_t		*cur,	/* if null, not a btree */  	xfs_bmbt_irec_t		*del,	/* data to remove from extents */  	int			*logflagsp, /* inode logging flags */ -	xfs_extdelta_t		*delta, /* Change made to incore extents */  	int			whichfork, /* data or attr fork */  	int			rsvd)	/* OK to allocate reserved blocks */  { @@ -3265,14 +3114,6 @@ xfs_bmap_del_extent(  	if (da_old > da_new)  		xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new),  			rsvd); -	if (delta) { -		/* DELTA: report the original extent. */ -		if (delta->xed_startoff > got.br_startoff) -			delta->xed_startoff = got.br_startoff; -		if (delta->xed_blockcount < got.br_startoff+got.br_blockcount) -			delta->xed_blockcount = got.br_startoff + -							got.br_blockcount; -	}  done:  	*logflagsp = flags;  	return error; @@ -3754,9 +3595,10 @@ xfs_bmap_add_attrfork(  		ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;  	}  	ASSERT(ip->i_d.di_anextents == 0); -	IHOLD(ip); -	xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + +	xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);  	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); +  	switch (ip->i_d.di_format) {  	case XFS_DINODE_FMT_DEV:  		ip->i_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; @@ -4483,8 +4325,7 @@ xfs_bmapi(  	xfs_extlen_t	total,		/* total blocks needed */  	xfs_bmbt_irec_t	*mval,		/* output: map values */  	int		*nmap,		/* i/o: mval size/count */ -	xfs_bmap_free_t	*flist,		/* i/o: list extents to free */ -	xfs_extdelta_t	*delta)		/* o: change made to incore extents */ +	xfs_bmap_free_t	*flist)		/* i/o: list extents to free */  {  	xfs_fsblock_t	abno;		/* allocated block number */  	xfs_extlen_t	alen;		/* allocated extent length */ @@ -4596,10 +4437,7 @@ xfs_bmapi(  	end = bno + len;  	obno = bno;  	bma.ip = NULL; -	if (delta) { -		delta->xed_startoff = NULLFILEOFF; -		delta->xed_blockcount = 0; -	} +  	while (bno < end && n < *nmap) {  		/*  		 * Reading past eof, act as though there's a hole @@ -4620,19 +4458,13 @@ xfs_bmapi(  			 * allocate the stuff asked for in this bmap call  			 * but that wouldn't be as good.  			 */ -			if (wasdelay && !(flags & XFS_BMAPI_EXACT)) { +			if (wasdelay) {  				alen = (xfs_extlen_t)got.br_blockcount;  				aoff = got.br_startoff;  				if (lastx != NULLEXTNUM && lastx) {  					ep = xfs_iext_get_ext(ifp, lastx - 1);  					xfs_bmbt_get_all(ep, &prev);  				} -			} else if (wasdelay) { -				alen = (xfs_extlen_t) -					XFS_FILBLKS_MIN(len, -						(got.br_startoff + -						 got.br_blockcount) - bno); -				aoff = bno;  			} else {  				alen = (xfs_extlen_t)  					XFS_FILBLKS_MIN(len, MAXEXTLEN); @@ -4831,7 +4663,7 @@ xfs_bmapi(  					got.br_state = XFS_EXT_UNWRITTEN;  			}  			error = xfs_bmap_add_extent(ip, lastx, &cur, &got, -				firstblock, flist, &tmp_logflags, delta, +				firstblock, flist, &tmp_logflags,  				whichfork, (flags & XFS_BMAPI_RSVBLOCKS));  			logflags |= tmp_logflags;  			if (error) @@ -4927,7 +4759,7 @@ xfs_bmapi(  			}  			mval->br_state = XFS_EXT_NORM;  			error = xfs_bmap_add_extent(ip, lastx, &cur, mval, -				firstblock, flist, &tmp_logflags, delta, +				firstblock, flist, &tmp_logflags,  				whichfork, (flags & XFS_BMAPI_RSVBLOCKS));  			logflags |= tmp_logflags;  			if (error) @@ -5017,14 +4849,6 @@ xfs_bmapi(  	ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE ||  	       XFS_IFORK_NEXTENTS(ip, whichfork) > ifp->if_ext_max);  	error = 0; -	if (delta && delta->xed_startoff != NULLFILEOFF) { -		/* A change was actually made. -		 * Note that delta->xed_blockount is an offset at this -		 * point and needs to be converted to a block count. -		 */ -		ASSERT(delta->xed_blockcount > delta->xed_startoff); -		delta->xed_blockcount -= delta->xed_startoff; -	}  error0:  	/*  	 * Log everything.  Do this after conversion, there's no point in @@ -5136,8 +4960,6 @@ xfs_bunmapi(  	xfs_fsblock_t		*firstblock,	/* first allocated block  						   controls a.g. for allocs */  	xfs_bmap_free_t		*flist,		/* i/o: list extents to free */ -	xfs_extdelta_t		*delta,		/* o: change made to incore -						   extents */  	int			*done)		/* set if not done yet */  {  	xfs_btree_cur_t		*cur;		/* bmap btree cursor */ @@ -5196,10 +5018,7 @@ xfs_bunmapi(  	bno = start + len - 1;  	ep = xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got,  		&prev); -	if (delta) { -		delta->xed_startoff = NULLFILEOFF; -		delta->xed_blockcount = 0; -	} +  	/*  	 * Check to see if the given block number is past the end of the  	 * file, back up to the last block if so... @@ -5297,7 +5116,7 @@ xfs_bunmapi(  			}  			del.br_state = XFS_EXT_UNWRITTEN;  			error = xfs_bmap_add_extent(ip, lastx, &cur, &del, -				firstblock, flist, &logflags, delta, +				firstblock, flist, &logflags,  				XFS_DATA_FORK, 0);  			if (error)  				goto error0; @@ -5352,7 +5171,7 @@ xfs_bunmapi(  				prev.br_state = XFS_EXT_UNWRITTEN;  				error = xfs_bmap_add_extent(ip, lastx - 1, &cur,  					&prev, firstblock, flist, &logflags, -					delta, XFS_DATA_FORK, 0); +					XFS_DATA_FORK, 0);  				if (error)  					goto error0;  				goto nodelete; @@ -5361,7 +5180,7 @@ xfs_bunmapi(  				del.br_state = XFS_EXT_UNWRITTEN;  				error = xfs_bmap_add_extent(ip, lastx, &cur,  					&del, firstblock, flist, &logflags, -					delta, XFS_DATA_FORK, 0); +					XFS_DATA_FORK, 0);  				if (error)  					goto error0;  				goto nodelete; @@ -5414,7 +5233,7 @@ xfs_bunmapi(  			goto error0;  		}  		error = xfs_bmap_del_extent(ip, tp, lastx, flist, cur, &del, -				&tmp_logflags, delta, whichfork, rsvd); +				&tmp_logflags, whichfork, rsvd);  		logflags |= tmp_logflags;  		if (error)  			goto error0; @@ -5471,14 +5290,6 @@ nodelete:  	ASSERT(ifp->if_ext_max ==  	       XFS_IFORK_SIZE(ip, whichfork) / (uint)sizeof(xfs_bmbt_rec_t));  	error = 0; -	if (delta && delta->xed_startoff != NULLFILEOFF) { -		/* A change was actually made. -		 * Note that delta->xed_blockount is an offset at this -		 * point and needs to be converted to a block count. -		 */ -		ASSERT(delta->xed_blockcount > delta->xed_startoff); -		delta->xed_blockcount -= delta->xed_startoff; -	}  error0:  	/*  	 * Log everything.  Do this after conversion, there's no point in @@ -5605,28 +5416,6 @@ xfs_getbmap(  		prealloced = 0;  		fixlen = 1LL << 32;  	} else { -		/* -		 * If the BMV_IF_NO_DMAPI_READ interface bit specified, do -		 * not generate a DMAPI read event.  Otherwise, if the -		 * DM_EVENT_READ bit is set for the file, generate a read -		 * event in order that the DMAPI application may do its thing -		 * before we return the extents.  Usually this means restoring -		 * user file data to regions of the file that look like holes. -		 * -		 * The "old behavior" (from XFS_IOC_GETBMAP) is to not specify -		 * BMV_IF_NO_DMAPI_READ so that read events are generated. -		 * If this were not true, callers of ioctl(XFS_IOC_GETBMAP) -		 * could misinterpret holes in a DMAPI file as true holes, -		 * when in fact they may represent offline user data. -		 */ -		if (DM_EVENT_ENABLED(ip, DM_EVENT_READ) && -		    !(iflags & BMV_IF_NO_DMAPI_READ)) { -			error = XFS_SEND_DATA(mp, DM_EVENT_READ, ip, -					      0, 0, 0, NULL); -			if (error) -				return XFS_ERROR(error); -		} -  		if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS &&  		    ip->i_d.di_format != XFS_DINODE_FMT_BTREE &&  		    ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) @@ -5713,7 +5502,7 @@ xfs_getbmap(  		error = xfs_bmapi(NULL, ip, XFS_BB_TO_FSBT(mp, bmv->bmv_offset),  				  XFS_BB_TO_FSB(mp, bmv->bmv_length),  				  bmapi_flags, NULL, 0, map, &nmap, -				  NULL, NULL); +				  NULL);  		if (error)  			goto out_free_map;  		ASSERT(nmap <= subnex); @@ -5859,66 +5648,34 @@ xfs_bmap_eof(  }  #ifdef DEBUG -STATIC -xfs_buf_t * +STATIC struct xfs_buf *  xfs_bmap_get_bp( -	xfs_btree_cur_t         *cur, +	struct xfs_btree_cur	*cur,  	xfs_fsblock_t		bno)  { -	int i; -	xfs_buf_t *bp; +	struct xfs_log_item_desc *lidp; +	int			i;  	if (!cur) -		return(NULL); - -	bp = NULL; -	for(i = 0; i < XFS_BTREE_MAXLEVELS; i++) { -		bp = cur->bc_bufs[i]; -		if (!bp) break; -		if (XFS_BUF_ADDR(bp) == bno) -			break;	/* Found it */ -	} -	if (i == XFS_BTREE_MAXLEVELS) -		bp = NULL; - -	if (!bp) { /* Chase down all the log items to see if the bp is there */ -		xfs_log_item_chunk_t    *licp; -		xfs_trans_t		*tp; - -		tp = cur->bc_tp; -		licp = &tp->t_items; -		while (!bp && licp != NULL) { -			if (xfs_lic_are_all_free(licp)) { -				licp = licp->lic_next; -				continue; -			} -			for (i = 0; i < licp->lic_unused; i++) { -				xfs_log_item_desc_t	*lidp; -				xfs_log_item_t		*lip; -				xfs_buf_log_item_t	*bip; -				xfs_buf_t		*lbp; - -				if (xfs_lic_isfree(licp, i)) { -					continue; -				} - -				lidp = xfs_lic_slot(licp, i); -				lip = lidp->lid_item; -				if (lip->li_type != XFS_LI_BUF) -					continue; +		return NULL; -				bip = (xfs_buf_log_item_t *)lip; -				lbp = bip->bli_buf; +	for (i = 0; i < XFS_BTREE_MAXLEVELS; i++) { +		if (!cur->bc_bufs[i]) +			break; +		if (XFS_BUF_ADDR(cur->bc_bufs[i]) == bno) +			return cur->bc_bufs[i]; +	} -				if (XFS_BUF_ADDR(lbp) == bno) { -					bp = lbp; -					break; /* Found it */ -				} -			} -			licp = licp->lic_next; -		} +	/* Chase down all the log items to see if the bp is there */ +	list_for_each_entry(lidp, &cur->bc_tp->t_items, lid_trans) { +		struct xfs_buf_log_item	*bip; +		bip = (struct xfs_buf_log_item *)lidp->lid_item; +		if (bip->bli_item.li_type == XFS_LI_BUF && +		    XFS_BUF_ADDR(bip->bli_buf) == bno) +			return bip->bli_buf;  	} -	return(bp); + +	return NULL;  }  STATIC void  | 
