implement generic xfs_btree_increment
PATCH 10/26 implement generic xfs_btree_increment
From: Dave Chinner <[email protected]>
Because this is the first major generic btree routine this patch includes some infrastrucure, fistly a few routines to deal with a btree block that can be either in short or long form, and secondly xfs_btree_read_buf_block, which is the new central routine to read a btree block given a cursor.
[hch: split out from bigger patch and minor adaptions]
Signed-off-by Christoph Hellwig <[email protected]>
Notes:
- xfs_btree_read_buf_block now includes a xfs_btree_check_block, removed duplicate call
fs/xfs/xfs_btree.h +21 -0
@@ -186,6 +186,10 @@ struct xfs_btree_ops {/* get inode rooted btree root */ struct xfs_btree_block *(*get_root_from_inode)(struct xfs_btree_cur *); +/* return address of btree structures */ +union xfs_btree_ptr *(*ptr_addr)(struct xfs_btree_cur *cur,int index, +struct xfs_btree_block *block); +/* btree tracing */ #ifdef XFS_BTREE_TRACE void (*trace_enter)(struct xfs_btree_cur *, const char *,
@@ -497,6 +501,23 @@ xfs_btree_setbuf(int lev,/* level in btree */ struct xfs_buf *bp); /* new buffer to set */ +/* +* Common btree core entry points. +*/ + +int xfs_btree_increment (struct xfs_btree_cur *,int ,int *); + + +/* +* Helpers. +*/ + +static inline int +xfs_btree_get_numrecs (struct xfs_btree_block *block) +{ +return be16_to_cpu (block->bb_numrecs); +} +#endif /* __KERNEL__ */
fs/xfs/xfs_btree.c +222 -0
231 lines not on this page · raw message
fs/xfs/xfs_alloc_btree.c +14 -95
151 lines not on this page · raw message
fs/xfs/xfs_alloc_btree.h +0 -6
@@ -114,12 +114,6 @@ extern int xfs_alloc_get_rec(struct xfs_ xfs_extlen_t *len, int *stat);/* -* Increment cursor by one record at the level. -* For nonzero levels the leaf-ward information is untouched. -*/ -extern int xfs_alloc_increment (struct xfs_btree_cur *cur,int level,int *stat); - -/* * Insert the current record at the point referenced by cur. * The cursor may be inconsistent on return if splits have been done. */
fs/xfs/xfs_alloc.c +6 -6
@@ -818,7 +818,7 @@ xfs_alloc_ag_vextent_near(XFS_WANT_CORRUPTED_GOTO (i ==1 , error0);if (ltlen >= args->minlen)break ; -if ((error =xfs_alloc_increment (cnt_cur,0 , &i))) +if ((error =xfs_btree_increment (cnt_cur,0 , &i))) goto error0; }while (i);ASSERT (ltlen >= args->minlen);
@@ -828,7 +828,7 @@ xfs_alloc_ag_vextent_near( i = cnt_cur->bc_ptrs[0 ];for (j =1 , blen =0 , bdiff =0 ; !error && j && (blen < args->maxlen || bdiff >0 ); - error =xfs_alloc_increment (cnt_cur,0 , &j)) { + error =xfs_btree_increment (cnt_cur,0 , &j)) {/* * For each entry, decide if it's better than * the previous best entry.
@@ -938,7 +938,7 @@ xfs_alloc_ag_vextent_near(* Increment the cursor, so we will point at the entry just right * of the leftward entry if any, or to the leftmost entry. */ -if ((error =xfs_alloc_increment (bno_cur_gt,0 , &i))) +if ((error =xfs_btree_increment (bno_cur_gt,0 , &i))) goto error0;if (!i) {/*
@@ -977,7 +977,7 @@ xfs_alloc_ag_vextent_near( args->minlen, >bnoa, >lena);if (gtlena >= args->minlen)break ; -if ((error =xfs_alloc_increment (bno_cur_gt,0 , &i))) +if ((error =xfs_btree_increment (bno_cur_gt,0 , &i))) goto error0;if (!i) { xfs_btree_del_cursor(bno_cur_gt,
@@ -1066,7 +1066,7 @@ xfs_alloc_ag_vextent_near(/* * Fell off the right end. */ -if ((error =xfs_alloc_increment ( +if ((error =xfs_btree_increment ( bno_cur_gt,0 , &i))) goto error0;if (!i) {
@@ -1548,7 +1548,7 @@ xfs_free_ag_extent(* Look for a neighboring block on the right (higher block numbers) * that is contiguous with this space. */ -if ((error =xfs_alloc_increment (bno_cur,0 , &haveright))) +if ((error =xfs_btree_increment (bno_cur,0 , &haveright))) goto error0;if (haveright) {/*
fs/xfs/xfs_ialloc_btree.c +14 -95
151 lines not on this page · raw message
fs/xfs/xfs_ialloc.c +7 -7
@@ -695,7 +695,7 @@ nextag: goto error0;XFS_WANT_CORRUPTED_GOTO (i ==1 , error0); freecount += rec.ir_freecount; -if ((error =xfs_inobt_increment (cur,0 , &i))) +if ((error =xfs_btree_increment (cur,0 , &i))) goto error0; }while (i ==1 );
@@ -753,7 +753,7 @@ nextag:/* * Search right with cur, go forward 1 record. */ -if ((error =xfs_inobt_increment (cur,0 , &i))) +if ((error =xfs_btree_increment (cur,0 , &i))) goto error1; doneright = !i;if (!doneright) {
@@ -835,7 +835,7 @@ nextag:* further right. */ else { -if ((error =xfs_inobt_increment (cur,0 , +if ((error =xfs_btree_increment (cur,0 , &i))) goto error1; doneright = !i;
@@ -890,7 +890,7 @@ nextag:XFS_WANT_CORRUPTED_GOTO (i ==1 , error0);if (rec.ir_freecount >0 )break ; -if ((error =xfs_inobt_increment (cur,0 , &i))) +if ((error =xfs_btree_increment (cur,0 , &i))) goto error0;XFS_WANT_CORRUPTED_GOTO (i ==1 , error0); }
@@ -924,7 +924,7 @@ nextag: goto error0;XFS_WANT_CORRUPTED_GOTO (i ==1 , error0); freecount += rec.ir_freecount; -if ((error =xfs_inobt_increment (cur,0 , &i))) +if ((error =xfs_btree_increment (cur,0 , &i))) goto error0; }while (i ==1 ); ASSERT(freecount == be32_to_cpu(agi->agi_freecount) ||
@@ -1033,7 +1033,7 @@ xfs_difree( goto error0;if (i) { freecount += rec.ir_freecount; -if ((error =xfs_inobt_increment (cur,0 , &i))) +if ((error =xfs_btree_increment (cur,0 , &i))) goto error0; } }while (i ==1 );
@@ -1138,7 +1138,7 @@ xfs_difree( goto error0;if (i) { freecount += rec.ir_freecount; -if ((error =xfs_inobt_increment (cur,0 , &i))) +if ((error =xfs_btree_increment (cur,0 , &i))) goto error0; } }while (i ==1 );
fs/xfs/xfs_ialloc_btree.h +0 -6
@@ -136,12 +136,6 @@ extern int xfs_inobt_get_rec(struct xfs_ __int32_t *fcnt, xfs_inofree_t *free, int *stat);/* -* Increment cursor by one record at the level. -* For nonzero levels the leaf-ward information is untouched. -*/ -extern int xfs_inobt_increment (struct xfs_btree_cur *cur,int level,int *stat); - -/* * Insert the current record at the point referenced by cur. * The cursor may be inconsistent on return if splits have been done. */
fs/xfs/xfs_itable.c +3 -3
@@ -471,7 +471,7 @@ xfs_bulkstat(* In any case, increment to the next record. */ if (!error) - error =xfs_inobt_increment (cur,0 , &tmp); + error =xfs_btree_increment (cur,0 , &tmp); }else {/* * Start of ag. Lookup the first inode chunk.
@@ -538,7 +538,7 @@ xfs_bulkstat(* Set agino to after this chunk and bump the cursor. */ agino = gino +XFS_INODES_PER_CHUNK ; - error =xfs_inobt_increment (cur,0 , &tmp); + error =xfs_btree_increment (cur,0 , &tmp);cond_resched (); }/*
@@ -885,7 +885,7 @@ xfs_inumbers( bufidx =0 ; }if (left) { - error =xfs_inobt_increment (cur,0 , &tmp); + error =xfs_btree_increment (cur,0 , &tmp);if (error) {xfs_btree_del_cursor (cur,XFS_BTREE_ERROR ); cur =NULL ;
fs/xfs/xfs_bmap.c +2 -2
@@ -1646,7 +1646,7 @@ xfs_bmap_add_extent_unwritten_real( PREV.br_blockcount - new->br_blockcount, oldext))) goto done; -if ((error =xfs_bmbt_increment (cur,0 , &i))) +if ((error =xfs_btree_increment (cur,0 , &i))) goto done; if ((error = xfs_bmbt_update(cur, new->br_startoff, new->br_startblock,
@@ -3253,7 +3253,7 @@ xfs_bmap_del_extent( got.br_startblock, temp, got.br_state))) goto done; -if ((error =xfs_bmbt_increment (cur,0 , &i))) +if ((error =xfs_btree_increment (cur,0 , &i))) goto done; cur->bc_rec.b = new; error =xfs_bmbt_insert (cur, &i);
fs/xfs/xfs_bmap_btree.c +14 -84
140 lines not on this page · raw message
fs/xfs/xfs_bmap_btree.h +0 -1
@@ -251,7 +251,6 @@ extern void xfs_bmbt_disk_get_all(xfs_bmextern xfs_filblks_t xfs_bmbt_disk_get_blockcount (xfs_bmbt_rec_t *r);extern xfs_fileoff_t xfs_bmbt_disk_get_startoff (xfs_bmbt_rec_t *r); -extern int xfs_bmbt_increment (struct xfs_btree_cur *,int ,int *);extern int xfs_bmbt_insert (struct xfs_btree_cur *,int *);extern void xfs_bmbt_log_block (struct xfs_btree_cur *,struct xfs_buf *,int ); extern void xfs_bmbt_log_recs(struct xfs_btree_cur *, struct xfs_buf *, int,