diff options
| author | Christoph Hellwig <hch@infradead.org> | 2008-10-30 16:56:22 +1100 | 
|---|---|---|
| committer | Lachlan McIlroy <lachlan@sgi.com> | 2008-10-30 16:56:22 +1100 | 
| commit | 38bb74237d2d94c1aced2ec626d7d0f317e360da (patch) | |
| tree | e37dfdad942de0e98c36c0fdf781cc29cd2daf0c /fs/xfs/xfs_btree.c | |
| parent | fe033cc848489851f0c7de48f0b1bab5d744ad8a (diff) | |
| download | olio-linux-3.10-38bb74237d2d94c1aced2ec626d7d0f317e360da.tar.xz olio-linux-3.10-38bb74237d2d94c1aced2ec626d7d0f317e360da.zip  | |
[XFS] implement generic xfs_btree_updkey
From: Dave Chinner <dgc@sgi.com>
Note that there are many > 80 char lines introduced due to the
xfs_btree_key casts. But the places where this happens is throw-away code
once the whole btree code gets merged into a common implementation.
The same is true for the temporary xfs_alloc_log_keys define to the new
name. All old users will be gone after a few patches.
[hch: split out from bigger patch and minor adaptions]
SGI-PV: 985583
SGI-Modid: xfs-linux-melb:xfs-kern:32193a
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_btree.c')
| -rw-r--r-- | fs/xfs/xfs_btree.c | 87 | 
1 files changed, 87 insertions, 0 deletions
diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 41912a01bec..1459a2b9a72 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -34,6 +34,7 @@  #include "xfs_attr_sf.h"  #include "xfs_dinode.h"  #include "xfs_inode.h" +#include "xfs_inode_item.h"  #include "xfs_btree.h"  #include "xfs_btree_trace.h"  #include "xfs_ialloc.h" @@ -1065,6 +1066,45 @@ xfs_btree_read_buf_block(  }  /* + * Copy keys from one btree block to another. + */ +STATIC void +xfs_btree_copy_keys( +	struct xfs_btree_cur	*cur, +	union xfs_btree_key	*dst_key, +	union xfs_btree_key	*src_key, +	int			numkeys) +{ +	ASSERT(numkeys >= 0); +	memcpy(dst_key, src_key, numkeys * cur->bc_ops->key_len); +} + +/* + * Log key values from the btree block. + */ +STATIC void +xfs_btree_log_keys( +	struct xfs_btree_cur	*cur, +	struct xfs_buf		*bp, +	int			first, +	int			last) +{ +	XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); +	XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); + +	if (bp) { +		xfs_trans_log_buf(cur->bc_tp, bp, +				  xfs_btree_key_offset(cur, first), +				  xfs_btree_key_offset(cur, last + 1) - 1); +	} else { +		xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, +				xfs_ilog_fbroot(cur->bc_private.b.whichfork)); +	} + +	XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); +} + +/*   * Increment cursor by one record at the level.   * For nonzero levels the leaf-ward information is untouched.   */ @@ -1489,3 +1529,50 @@ error0:  	XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR);  	return error;  } + +/* + * Update keys at all levels from here to the root along the cursor's path. + */ +int +xfs_btree_updkey( +	struct xfs_btree_cur	*cur, +	union xfs_btree_key	*keyp, +	int			level) +{ +	struct xfs_btree_block	*block; +	struct xfs_buf		*bp; +	union xfs_btree_key	*kp; +	int			ptr; + +	XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); +	XFS_BTREE_TRACE_ARGIK(cur, level, keyp); + +	ASSERT(!(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) || level >= 1); + +	/* +	 * Go up the tree from this level toward the root. +	 * At each level, update the key value to the value input. +	 * Stop when we reach a level where the cursor isn't pointing +	 * at the first entry in the block. +	 */ +	for (ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { +#ifdef DEBUG +		int		error; +#endif +		block = xfs_btree_get_block(cur, level, &bp); +#ifdef DEBUG +		error = xfs_btree_check_block(cur, block, level, bp); +		if (error) { +			XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); +			return error; +		} +#endif +		ptr = cur->bc_ptrs[level]; +		kp = xfs_btree_key_addr(cur, ptr, block); +		xfs_btree_copy_keys(cur, kp, keyp, 1); +		xfs_btree_log_keys(cur, bp, ptr, ptr); +	} + +	XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); +	return 0; +}  |