diff options
| author | Christoph Hellwig <hch@infradead.org> | 2008-10-30 16:55:45 +1100 | 
|---|---|---|
| committer | Lachlan McIlroy <lachlan@sgi.com> | 2008-10-30 16:55:45 +1100 | 
| commit | 637aa50f461b8ea6b1e8bf9877b0d13d00085043 (patch) | |
| tree | a7c00b821dca04fe90614461749b74eff40bd8ed /fs/xfs/xfs_bmap_btree.c | |
| parent | 65f1eaeac0efc968797f3ac955b85ba3f5d4f9c8 (diff) | |
| download | olio-linux-3.10-637aa50f461b8ea6b1e8bf9877b0d13d00085043.tar.xz olio-linux-3.10-637aa50f461b8ea6b1e8bf9877b0d13d00085043.zip  | |
[XFS] implement generic xfs_btree_increment
From: Dave Chinner <dgc@sgi.com>
Because this is the first major generic btree routine this patch includes
some infrastrucure, first a few routines to deal with a btree block that
can be either in short or long form, second xfs_btree_read_buf_block,
which is the new central routine to read a btree block given a cursor, and
third the new xfs_btree_ptr_addr routine to calculate the address for a
given btree pointer record.
[hch: split out from bigger patch and minor adaptions]
SGI-PV: 985583
SGI-Modid: xfs-linux-melb:xfs-kern:32190a
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: Bill O'Donnell <billodo@sgi.com>
Signed-off-by: David Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/xfs_bmap_btree.c')
| -rw-r--r-- | fs/xfs/xfs_bmap_btree.c | 88 | 
1 files changed, 4 insertions, 84 deletions
diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index a71010abf6e..2d29a4980cf 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -254,7 +254,7 @@ xfs_bmbt_delrec(  	if (rbno != NULLFSBLOCK) {  		i = xfs_btree_lastrec(tcur, level);  		XFS_WANT_CORRUPTED_GOTO(i == 1, error0); -		if ((error = xfs_bmbt_increment(tcur, level, &i))) { +		if ((error = xfs_btree_increment(tcur, level, &i))) {  			XFS_BMBT_TRACE_CURSOR(cur, ERROR);  			goto error0;  		} @@ -445,7 +445,7 @@ xfs_bmbt_delrec(  		cur->bc_bufs[level] = lbp;  		cur->bc_ptrs[level] += lrecs;  		cur->bc_ra[level] = 0; -	} else if ((error = xfs_bmbt_increment(cur, level + 1, &i))) { +	} else if ((error = xfs_btree_increment(cur, level + 1, &i))) {  		XFS_BMBT_TRACE_CURSOR(cur, ERROR);  		goto error0;  	} @@ -929,7 +929,7 @@ xfs_bmbt_lookup(  		if (dir == XFS_LOOKUP_GE && keyno > be16_to_cpu(block->bb_numrecs) &&  		    be64_to_cpu(block->bb_rightsib) != NULLDFSBNO) {  			cur->bc_ptrs[0] = keyno; -			if ((error = xfs_bmbt_increment(cur, 0, &i))) { +			if ((error = xfs_btree_increment(cur, 0, &i))) {  				XFS_BMBT_TRACE_CURSOR(cur, ERROR);  				return error;  			} @@ -1202,7 +1202,7 @@ xfs_bmbt_rshift(  	}  	i = xfs_btree_lastrec(tcur, level);  	XFS_WANT_CORRUPTED_GOTO(i == 1, error0); -	if ((error = xfs_bmbt_increment(tcur, level, &i))) { +	if ((error = xfs_btree_increment(tcur, level, &i))) {  		XFS_BMBT_TRACE_CURSOR(tcur, ERROR);  		goto error1;  	} @@ -1761,86 +1761,6 @@ xfs_bmbt_disk_get_startoff(  }  /* - * Increment cursor by one record at the level. - * For nonzero levels the leaf-ward information is untouched. - */ -int						/* error */ -xfs_bmbt_increment( -	xfs_btree_cur_t		*cur, -	int			level, -	int			*stat)		/* success/failure */ -{ -	xfs_bmbt_block_t	*block; -	xfs_buf_t		*bp; -	int			error;		/* error return value */ -	xfs_fsblock_t		fsbno; -	int			lev; -	xfs_mount_t		*mp; -	xfs_trans_t		*tp; - -	XFS_BMBT_TRACE_CURSOR(cur, ENTRY); -	XFS_BMBT_TRACE_ARGI(cur, level); -	ASSERT(level < cur->bc_nlevels); - -	xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); -	block = xfs_bmbt_get_block(cur, level, &bp); -#ifdef DEBUG -	if ((error = xfs_btree_check_lblock(cur, block, level, bp))) { -		XFS_BMBT_TRACE_CURSOR(cur, ERROR); -		return error; -	} -#endif -	if (++cur->bc_ptrs[level] <= be16_to_cpu(block->bb_numrecs)) { -		XFS_BMBT_TRACE_CURSOR(cur, EXIT); -		*stat = 1; -		return 0; -	} -	if (be64_to_cpu(block->bb_rightsib) == NULLDFSBNO) { -		XFS_BMBT_TRACE_CURSOR(cur, EXIT); -		*stat = 0; -		return 0; -	} -	for (lev = level + 1; lev < cur->bc_nlevels; lev++) { -		block = xfs_bmbt_get_block(cur, lev, &bp); -#ifdef DEBUG -		if ((error = xfs_btree_check_lblock(cur, block, lev, bp))) { -			XFS_BMBT_TRACE_CURSOR(cur, ERROR); -			return error; -		} -#endif -		if (++cur->bc_ptrs[lev] <= be16_to_cpu(block->bb_numrecs)) -			break; -		xfs_btree_readahead(cur, lev, XFS_BTCUR_RIGHTRA); -	} -	if (lev == cur->bc_nlevels) { -		XFS_BMBT_TRACE_CURSOR(cur, EXIT); -		*stat = 0; -		return 0; -	} -	tp = cur->bc_tp; -	mp = cur->bc_mp; -	for (block = xfs_bmbt_get_block(cur, lev, &bp); lev > level; ) { -		fsbno = be64_to_cpu(*XFS_BMAP_PTR_IADDR(block, cur->bc_ptrs[lev], cur)); -		if ((error = xfs_btree_read_bufl(mp, tp, fsbno, 0, &bp, -				XFS_BMAP_BTREE_REF))) { -			XFS_BMBT_TRACE_CURSOR(cur, ERROR); -			return error; -		} -		lev--; -		xfs_btree_setbuf(cur, lev, bp); -		block = XFS_BUF_TO_BMBT_BLOCK(bp); -		if ((error = xfs_btree_check_lblock(cur, block, lev, bp))) { -			XFS_BMBT_TRACE_CURSOR(cur, ERROR); -			return error; -		} -		cur->bc_ptrs[lev] = 1; -	} -	XFS_BMBT_TRACE_CURSOR(cur, EXIT); -	*stat = 1; -	return 0; -} - -/*   * Insert the current record at the point referenced by cur.   *   * A multi-level split of the tree on insert will invalidate the original  |