diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-14 02:17:49 +0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-14 02:17:49 +0400 | 
| commit | 9ea319b61613085f501a79cf8d405cb221d084f3 (patch) | |
| tree | 5bf7e1b9f104a0df029d355927fa9eb398db37bb /fs/xfs/xfs_btree.c | |
| parent | 3e11acd4306d558249c31cf6cac09f218f2de52e (diff) | |
| parent | c6a7b0f8a49aa71792dd108efc535435f462bf79 (diff) | |
| download | linux-9ea319b61613085f501a79cf8d405cb221d084f3.tar.xz | |
Merge git://oss.sgi.com:8090/xfs/linux-2.6
* git://oss.sgi.com:8090/xfs/linux-2.6: (45 commits)
  [XFS] Fix use after free in xfs_log_done().
  [XFS] Make xfs_bmap_*_count_leaves void.
  [XFS] Use KM_NOFS for debug trace buffers
  [XFS] use KM_MAYFAIL in xfs_mountfs
  [XFS] refactor xfs_mount_free
  [XFS] don't call xfs_freesb from xfs_unmountfs
  [XFS] xfs_unmountfs should return void
  [XFS] cleanup xfs_mountfs
  [XFS] move root inode IRELE into xfs_unmountfs
  [XFS] stop using file_update_time
  [XFS] optimize xfs_ichgtime
  [XFS] update timestamp in xfs_ialloc manually
  [XFS] remove the sema_t from XFS.
  [XFS] replace dquot flush semaphore with a completion
  [XFS] replace inode flush semaphore with a completion
  [XFS] extend completions to provide XFS object flush requirements
  [XFS] replace the XFS buf iodone semaphore with a completion
  [XFS] clean up stale references to semaphores
  [XFS] use get_unaligned_* helpers
  [XFS] Fix compile failure in xfs_buf_trace()
  ...
Diffstat (limited to 'fs/xfs/xfs_btree.c')
| -rw-r--r-- | fs/xfs/xfs_btree.c | 105 | 
1 files changed, 39 insertions, 66 deletions
| diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index aeb87ca69fcc..cc593a84c345 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -46,38 +46,11 @@ kmem_zone_t	*xfs_btree_cur_zone;  /*   * Btree magic numbers.   */ -const __uint32_t xfs_magics[XFS_BTNUM_MAX] = -{ +const __uint32_t xfs_magics[XFS_BTNUM_MAX] = {  	XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, XFS_BMAP_MAGIC, XFS_IBT_MAGIC  };  /* - * Prototypes for internal routines. - */ - -/* - * Checking routine: return maxrecs for the block. - */ -STATIC int				/* number of records fitting in block */ -xfs_btree_maxrecs( -	xfs_btree_cur_t		*cur,	/* btree cursor */ -	xfs_btree_block_t	*block);/* generic btree block pointer */ - -/* - * Internal routines. - */ - -/* - * Retrieve the block pointer from the cursor at the given level. - * This may be a bmap btree root or from a buffer. - */ -STATIC xfs_btree_block_t *			/* generic btree block pointer */ -xfs_btree_get_block( -	xfs_btree_cur_t		*cur,	/* btree cursor */ -	int			level,	/* level in btree */ -	struct xfs_buf		**bpp);	/* buffer containing the block */ - -/*   * Checking routine: return maxrecs for the block.   */  STATIC int				/* number of records fitting in block */ @@ -457,35 +430,6 @@ xfs_btree_dup_cursor(  }  /* - * Change the cursor to point to the first record at the given level. - * Other levels are unaffected. - */ -int					/* success=1, failure=0 */ -xfs_btree_firstrec( -	xfs_btree_cur_t		*cur,	/* btree cursor */ -	int			level)	/* level to change */ -{ -	xfs_btree_block_t	*block;	/* generic btree block pointer */ -	xfs_buf_t		*bp;	/* buffer containing block */ - -	/* -	 * Get the block pointer for this level. -	 */ -	block = xfs_btree_get_block(cur, level, &bp); -	xfs_btree_check_block(cur, block, level, bp); -	/* -	 * It's empty, there is no such record. -	 */ -	if (!block->bb_h.bb_numrecs) -		return 0; -	/* -	 * Set the ptr value to 1, that's the first record/key. -	 */ -	cur->bc_ptrs[level] = 1; -	return 1; -} - -/*   * Retrieve the block pointer from the cursor at the given level.   * This may be a bmap btree root or from a buffer.   */ @@ -626,6 +570,13 @@ xfs_btree_init_cursor(  		cur->bc_private.a.agbp = agbp;  		cur->bc_private.a.agno = agno;  		break; +	case XFS_BTNUM_INO: +		/* +		 * Inode allocation btree fields. +		 */ +		cur->bc_private.a.agbp = agbp; +		cur->bc_private.a.agno = agno; +		break;  	case XFS_BTNUM_BMAP:  		/*  		 * Bmap btree fields. @@ -638,13 +589,6 @@ xfs_btree_init_cursor(  		cur->bc_private.b.flags = 0;  		cur->bc_private.b.whichfork = whichfork;  		break; -	case XFS_BTNUM_INO: -		/* -		 * Inode allocation btree fields. -		 */ -		cur->bc_private.i.agbp = agbp; -		cur->bc_private.i.agno = agno; -		break;  	default:  		ASSERT(0);  	} @@ -671,6 +615,35 @@ xfs_btree_islastblock(  }  /* + * Change the cursor to point to the first record at the given level. + * Other levels are unaffected. + */ +int					/* success=1, failure=0 */ +xfs_btree_firstrec( +	xfs_btree_cur_t		*cur,	/* btree cursor */ +	int			level)	/* level to change */ +{ +	xfs_btree_block_t	*block;	/* generic btree block pointer */ +	xfs_buf_t		*bp;	/* buffer containing block */ + +	/* +	 * Get the block pointer for this level. +	 */ +	block = xfs_btree_get_block(cur, level, &bp); +	xfs_btree_check_block(cur, block, level, bp); +	/* +	 * It's empty, there is no such record. +	 */ +	if (!block->bb_h.bb_numrecs) +		return 0; +	/* +	 * Set the ptr value to 1, that's the first record/key. +	 */ +	cur->bc_ptrs[level] = 1; +	return 1; +} + +/*   * Change the cursor to point to the last record in the current block   * at the given level.  Other levels are unaffected.   */ @@ -890,12 +863,12 @@ xfs_btree_readahead_core(  	case XFS_BTNUM_INO:  		i = XFS_BUF_TO_INOBT_BLOCK(cur->bc_bufs[lev]);  		if ((lr & XFS_BTCUR_LEFTRA) && be32_to_cpu(i->bb_leftsib) != NULLAGBLOCK) { -			xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.i.agno, +			xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno,  				be32_to_cpu(i->bb_leftsib), 1);  			rval++;  		}  		if ((lr & XFS_BTCUR_RIGHTRA) && be32_to_cpu(i->bb_rightsib) != NULLAGBLOCK) { -			xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.i.agno, +			xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno,  				be32_to_cpu(i->bb_rightsib), 1);  			rval++;  		} | 
