implement generic xfs_btree_inѕert/insrec
PATCH 21/26 implement generic xfs_btree_inѕert/insrec
Make the btree insert code generic. Based on a patch from David Chinner with lots of changes to follow the original btree implementations more closely. While this loses some of the generic helper routines for inserting/moving/removing records it also solves some of the one off bugs in the original code and makes it easier to verify.
fs/xfs/xfs_btree.c +362 -0
@@ -818,6 +818,17 @@ xfs_btree_ptr_is_null(return be32_to_cpu (ptr->s) ==NULLAGBLOCK ; } +STATIC void +xfs_btree_set_ptr_null ( +struct xfs_btree_cur *cur, +union xfs_btree_ptr *ptr) +{ +if (cur->bc_flags &XFS_BTREE_LONG_PTRS ) + ptr->l =cpu_to_be64 (NULLFSBLOCK ); +else + ptr->s =cpu_to_be32 (NULLAGBLOCK ); +} +/* * Get/set/init sibling pointers */
@@ -2476,3 +2487,354 @@ out0: *stat =0 ;return 0 ; } + +STATIC int +xfs_btree_make_block_unfull ( +struct xfs_btree_cur *cur,/* btree cursor */ +int level,/* btree level */ +int numrecs,/* # of recs in block */ +int *oindex,/* old tree index */ +int *index,/* new tree index */ +union xfs_btree_ptr *nptr,/* new btree ptr */ +struct xfs_btree_cur **ncur,/* new btree cursor */ +union xfs_btree_rec *nrec,/* new record */ +int *stat) +{ +union xfs_btree_key key;/* new btree key value */ +int error =0 ; + +if (cur->bc_flags &XFS_BTREE_ROOT_IN_INODE ) { +if (numrecs < cur->bc_ops->get_dmaxrecs (cur, level)) { +/* A resizeable root block that can be made bigger. */ + cur->bc_ops->realloc_root (cur,1 ); +return 0 ; + } +if (level == cur->bc_nlevels -1 ) { +/* A root block that needs replacing */ +int logflags =0 ; + + error =xfs_btree_iroot_to_root (cur, &logflags, stat); +if (error || *stat ==0 ) +return error; + +xfs_trans_log_inode (cur->bc_tp, cur->bc_private.b.ip, + logflags); +return 0 ; + } + } + +/* First, try shifting an entry to the right neighbor. */ + error =xfs_btree_rshift (cur, level, stat); +if (error || *stat) +return error; + +/* Next, try shifting an entry to the left neighbor. */ + error =xfs_btree_lshift (cur, level, stat); +if (error) +return error; + +if (*stat) { + *oindex = *index = cur->bc_ptrs[level]; +return 0 ; + } + +/* +* Next, try splitting the current block in half. +* +* If this works we have to re-set our variables because we +* could be in a different block now. +*/ + error =xfs_btree_split (cur, level, nptr, &key, ncur, stat); +if (error || *stat ==0 ) +return error; + + + *index = cur->bc_ptrs[level]; + cur->bc_ops->init_rec_from_key (&key, nrec); +return 0 ; +} + +/* +* Insert one record/level. Return information to the caller +* allowing the next level up to proceed if necessary. +*/ +STATIC int +xfs_btree_insrec ( +struct xfs_btree_cur *cur,/* btree cursor */ +int level,/* level to insert record at */ +union xfs_btree_ptr *ptrp,/* i/o: block number inserted */ +union xfs_btree_rec *recp,/* i/o: record data inserted */ +struct xfs_btree_cur **curp,/* output: new cursor replacing cur */ +int *stat)/* success/failure */ +{ +struct xfs_btree_block *block;/* bmap btree block */ +struct xfs_buf *bp;/* buffer for block */ +union xfs_btree_key key;/* bmap btree key */ +union xfs_btree_ptr nptr;/* new block ptr */ +struct xfs_btree_cur *ncur;/* new btree cursor */ +union xfs_btree_rec nrec;/* new record count */ +int optr;/* old key/record index */ +int ptr;/* key/record index */ +int numrecs;/* number of records */ +int error;/* error return value */ +#ifdef DEBUG +int i; +#endif + +XFS_BTREE_TRACE_CURSOR (cur,XBT_ENTRY ); +XFS_BTREE_TRACE_ARGIPR (cur, level, *ptrp, recp); + + ncur =NULL ; + +/* +* If we have an external root pointer, and we've made it to the +* root level, allocate a new root block and we're done. +*/ +if (!(cur->bc_flags &XFS_BTREE_ROOT_IN_INODE ) && + (level >= cur->bc_nlevels)) { + error =xfs_btree_new_root (cur, stat); +xfs_btree_set_ptr_null (cur, ptrp); + +XFS_BTREE_TRACE_CURSOR (cur,XBT_EXIT ); +return error; + } + +/* Make a key out of the record data to be inserted, and save it. */ + cur->bc_ops->init_key_from_rec (cur, &key, recp); + +/* If we're off the left edge, return failure. */ + ptr = cur->bc_ptrs[level]; +if (ptr ==0 ) { +XFS_BTREE_TRACE_CURSOR (cur,XBT_EXIT ); + *stat =0 ; +return 0 ; + } + + optr = ptr; + +XFS_BTREE_STATS_INC (cur, insrec); + +/* Get pointers to the btree buffer and block. */ + block =xfs_btree_get_block (cur, level, &bp); + numrecs =xfs_btree_get_numrecs (block); + +#ifdef DEBUG + error =xfs_btree_check_block (cur, block, level, bp); +if (error) + goto error0; + +/* Check that the new entry is being inserted in the right place. */ +if (ptr <= numrecs) { +if (level ==0 ) { +xfs_btree_check_rec (cur->bc_btnum, recp, + cur->bc_ops->rec_addr (cur, ptr, block)); + }else { +xfs_btree_check_key (cur->bc_btnum, &key, + cur->bc_ops->key_addr (cur, ptr, block)); + } + } +#endif + +/* +* If the block is full, we can't insert the new entry until we +* make the block un-full. +*/ +xfs_btree_set_ptr_null (cur, &nptr); +if (numrecs == cur->bc_ops->get_maxrecs (cur, level)) { + error =xfs_btree_make_block_unfull (cur, level, numrecs, + &optr, &ptr, &nptr, &ncur, &nrec, stat); +if (error || *stat ==0 ) + goto error0; + } + +/* The current block may have changed during the split. */ + block =xfs_btree_get_block (cur, level, &bp); + numrecs =xfs_btree_get_numrecs (block); + +#ifdef DEBUG + error =xfs_btree_check_block (cur, block, level, bp); +if (error) +return error; +#endif + +/* +* At this point we know there's room for our new entry in the block +* we're pointing at. +*/ +XFS_BTREE_STATS_ADD (cur, moves, numrecs - ptr +1 ); + +if (level >0 ) { +/* It's a nonleaf. make a hole in the keys and ptrs */ +union xfs_btree_key *kp; +union xfs_btree_ptr *pp; + + kp = cur->bc_ops->key_addr (cur,1 , block); + pp = cur->bc_ops->ptr_addr (cur,1 , block); + +#ifdef DEBUG +for (i = ptr; i < numrecs; i++) { + error =xfs_btree_check_ptr (cur, pp, i -1 , level); +if (error) + goto error0; + } +#endif + + cur->bc_ops->move_keys (cur, kp, ptr -1 , ptr, + numrecs - ptr +1 ); +xfs_btree_move_ptrs (cur, pp, ptr -1 , ptr, + numrecs - ptr +1 ); + +#ifdef DEBUG + error =xfs_btree_check_ptr (cur, ptrp,0 , level); +if (error) + goto error0; +#endif + +/* Now put the new data in, bump numrecs and log it. */ + cur->bc_ops->set_key (cur, kp, ptr -1 , &key); +xfs_btree_set_ptr (cur, pp, ptr -1 , ptrp); + numrecs++; +xfs_btree_set_numrecs (block, numrecs); +xfs_btree_log_ptrs (cur, bp, ptr, numrecs); + cur->bc_ops->log_keys (cur, bp, ptr, numrecs); +#ifdef DEBUG +if (ptr < numrecs) { +xfs_btree_check_key (cur->bc_btnum, + cur->bc_ops->key_addr (cur, ptr, block), + cur->bc_ops->key_addr (cur, ptr +1 , block)); + } +#endif + }else { +/* It's a leaf. make a hole in the records */ +union xfs_btree_rec *rp; + + rp = cur->bc_ops->rec_addr (cur,1 , block); + cur->bc_ops->move_recs (cur, rp, ptr -1 , ptr, + numrecs - ptr +1 ); + +/* Now put the new data in, bump numrecs and log it. */ + cur->bc_ops->set_rec (cur, rp, ptr -1 , recp); + numrecs++; +xfs_btree_set_numrecs (block, numrecs); + cur->bc_ops->log_recs (cur, bp, ptr, numrecs); +#ifdef DEBUG +if (ptr < numrecs) { +xfs_btree_check_rec (cur->bc_btnum, + cur->bc_ops->rec_addr (cur, ptr, block), + cur->bc_ops->rec_addr (cur, ptr +1 , block)); + } +#endif + } + +/* Log the new number of records in the btree header. */ +xfs_btree_log_block (cur, bp,XFS_BB_NUMRECS ); + +/* If we inserted at the start of a block, update the parents' keys. */ +if (optr ==1 ) { + error =xfs_btree_updkey (cur, &key, level +1 ); +if (error) + goto error0; + } + +/* +* If we are tracking the last record in the tree and +* we are at the far right edge of the tree, update it. +*/ +if (xfs_btree_is_lastrec (cur, block, level)) { + cur->bc_ops->update_lastrec (cur, block, recp, + ptr,LASTREC_INSREC ); + } + +/* +* Return the new block number, if any. +* If there is one, give back a record value and a cursor too. +*/ + *ptrp = nptr; +if (!xfs_btree_ptr_is_null (cur, &nptr)) { + *recp = nrec; + *curp = ncur; + } + +XFS_BTREE_TRACE_CURSOR (cur,XBT_EXIT ); + *stat =1 ; +return 0 ; + +error0: +XFS_BTREE_TRACE_CURSOR (cur,XBT_ERROR ); +return error; +} + +/* +* Insert the record at the point referenced by cur. +* +* A multi-level split of the tree on insert will invalidate the original +* cursor. All callers of this function should assume that the cursor is +* no longer valid and revalidate it. +*/ +int +xfs_btree_insert ( +struct xfs_btree_cur *cur, +int *stat) +{ +int error;/* error return value */ +int i;/* result value, 0 for failure */ +int level;/* current level number in btree */ +union xfs_btree_ptr nptr;/* new block number (split result) */ +struct xfs_btree_cur *ncur;/* new cursor (split result) */ +struct xfs_btree_cur *pcur;/* previous level's cursor */ +union xfs_btree_rec rec;/* record to insert */ + + level =0 ; + ncur =NULL ; + pcur = cur; + +xfs_btree_set_ptr_null (cur, &nptr); + cur->bc_ops->init_rec_from_cur (cur, &rec); + +/* +* Loop going up the tree, starting at the leaf level. +* Stop when we don't get a split block, that must mean that +* the insert is finished with this level. +*/ +do { +/* +* Insert nrec/nptr into this level of the tree. +* Note if we fail, nptr will be null. +*/ + error =xfs_btree_insrec (pcur, level, &nptr, &rec, &ncur, &i); +if (error) { +if (pcur != cur) +xfs_btree_del_cursor (pcur,XFS_BTREE_ERROR ); + goto error0; + } + +XFS_WANT_CORRUPTED_GOTO (i ==1 , error0); + level++; + +/* +* See if the cursor we just used is trash. +* Can't trash the caller's cursor, but otherwise we should +* if ncur is a new cursor or we're about to be done. +*/ +if (pcur != cur && + (ncur ||xfs_btree_ptr_is_null (cur, &nptr))) { +/* Save the state from the cursor before we trash it */ +if (cur->bc_ops->update_cursor) + cur->bc_ops->update_cursor (pcur, cur); + cur->bc_nlevels = pcur->bc_nlevels; +xfs_btree_del_cursor (pcur,XFS_BTREE_NOERROR ); + } +/* If we got a new cursor, switch to it. */ +if (ncur) { + pcur = ncur; + ncur =NULL ; + } + }while (!xfs_btree_ptr_is_null (cur, &nptr)); + +XFS_BTREE_TRACE_CURSOR (cur,XBT_EXIT ); + *stat = i; +return 0 ; +error0: +XFS_BTREE_TRACE_CURSOR (cur,XBT_ERROR ); +return error; +}
fs/xfs/xfs_alloc_btree.c +30 -309
369 lines not on this page · raw message
fs/xfs/xfs_bmap_btree.c +46 -253
341 lines not on this page · raw message
fs/xfs/xfs_btree.h +9 -0
@@ -182,6 +182,8 @@ do { \struct xfs_btree_ops {/* cursor operations */ struct xfs_btree_cur *(*dup_cursor)(struct xfs_btree_cur *); +void (*update_cursor)(struct xfs_btree_cur *src, +struct xfs_btree_cur *dst);/* btree root in inode support */ struct xfs_btree_block *(*get_root_from_inode)(struct xfs_btree_cur *);
@@ -213,6 +215,7 @@ struct xfs_btree_ops {/* records in block/level */ int (*get_maxrecs)(struct xfs_btree_cur *cur,int level); +int (*get_dmaxrecs)(struct xfs_btree_cur *cur,int level);/* init values of btree structures */ void (*init_key_from_rec)(struct xfs_btree_cur *cur,
@@ -220,6 +223,10 @@ struct xfs_btree_ops { union xfs_btree_rec *rec);void (*init_ptr_from_cur)(struct xfs_btree_cur *cur,union xfs_btree_ptr *ptr); +void (*init_rec_from_key)(union xfs_btree_key *key, +union xfs_btree_rec *rec); +void (*init_rec_from_cur)(struct xfs_btree_cur *cur, +union xfs_btree_rec *rec);/* difference between key value and cursor value */ __int64_t (*key_diff)(struct xfs_btree_cur *cur,
@@ -279,6 +286,7 @@ struct xfs_btree_ops {* Reasons for the update_lastrec method to be called. */ #define LASTREC_UPDATE 0 +#define LASTREC_INSREC 1/*
@@ -588,6 +596,7 @@ int xfs_btree_split(struct xfs_btree_cur union xfs_btree_key *, struct xfs_btree_cur **, int *);int xfs_btree_new_root (struct xfs_btree_cur *,int *);int xfs_btree_iroot_to_root (struct xfs_btree_cur *,int *,int *); +int xfs_btree_insert (struct xfs_btree_cur *,int *);/*
fs/xfs/xfs_ialloc_btree.c +20 -282
326 lines not on this page · raw message
fs/xfs/xfs_alloc.c +5 -5
@@ -408,7 +408,7 @@ xfs_alloc_fixup_trees(if ((error =xfs_alloc_lookup_eq (cnt_cur, nfbno1, nflen1, &i)))return error;XFS_WANT_CORRUPTED_RETURN (i ==0 ); -if ((error =xfs_alloc_insert (cnt_cur, &i))) +if ((error =xfs_btree_insert (cnt_cur, &i)))return error;XFS_WANT_CORRUPTED_RETURN (i ==1 ); }
@@ -416,7 +416,7 @@ xfs_alloc_fixup_trees(if ((error =xfs_alloc_lookup_eq (cnt_cur, nfbno2, nflen2, &i)))return error;XFS_WANT_CORRUPTED_RETURN (i ==0 ); -if ((error =xfs_alloc_insert (cnt_cur, &i))) +if ((error =xfs_btree_insert (cnt_cur, &i)))return error;XFS_WANT_CORRUPTED_RETURN (i ==1 ); }
@@ -444,7 +444,7 @@ xfs_alloc_fixup_trees(if ((error =xfs_alloc_lookup_eq (bno_cur, nfbno2, nflen2, &i)))return error;XFS_WANT_CORRUPTED_RETURN (i ==0 ); -if ((error =xfs_alloc_insert (bno_cur, &i))) +if ((error =xfs_btree_insert (bno_cur, &i)))return error;XFS_WANT_CORRUPTED_RETURN (i ==1 ); }
@@ -1756,7 +1756,7 @@ xfs_free_ag_extent(else { nbno = bno; nlen = len; -if ((error =xfs_alloc_insert (bno_cur, &i))) +if ((error =xfs_btree_insert (bno_cur, &i))) goto error0;XFS_WANT_CORRUPTED_GOTO (i ==1 , error0); }
@@ -1768,7 +1768,7 @@ xfs_free_ag_extent(if ((error =xfs_alloc_lookup_eq (cnt_cur, nbno, nlen, &i))) goto error0;XFS_WANT_CORRUPTED_GOTO (i ==0 , error0); -if ((error =xfs_alloc_insert (cnt_cur, &i))) +if ((error =xfs_btree_insert (cnt_cur, &i))) goto error0;XFS_WANT_CORRUPTED_GOTO (i ==1 , error0);xfs_btree_del_cursor (cnt_cur,XFS_BTREE_NOERROR );
fs/xfs/xfs_alloc_btree.h +0 -6
@@ -107,12 +107,6 @@ extern int xfs_alloc_delete(struct xfs_bextern int xfs_alloc_get_rec (struct xfs_btree_cur *cur,xfs_agblock_t *bno,xfs_extlen_t *len,int *stat); -/* -* Insert the current record at the point referenced by cur. -* The cursor may be inconsistent on return if splits have been done. -*/ -extern int xfs_alloc_insert (struct xfs_btree_cur *cur,int *stat); - extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_buf *,
fs/xfs/xfs_bmap.c +10 -10
@@ -977,7 +977,7 @@ xfs_bmap_add_extent_delay_real( goto done;XFS_WANT_CORRUPTED_GOTO (i ==0 , done); cur->bc_rec.b.br_state =XFS_EXT_NORM ; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done); }
@@ -1053,7 +1053,7 @@ xfs_bmap_add_extent_delay_real( goto done;XFS_WANT_CORRUPTED_GOTO (i ==0 , done); cur->bc_rec.b.br_state =XFS_EXT_NORM ; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done); }
@@ -1143,7 +1143,7 @@ xfs_bmap_add_extent_delay_real( goto done;XFS_WANT_CORRUPTED_GOTO (i ==0 , done); cur->bc_rec.b.br_state =XFS_EXT_NORM ; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done); }
@@ -1198,7 +1198,7 @@ xfs_bmap_add_extent_delay_real( goto done;XFS_WANT_CORRUPTED_GOTO (i ==0 , done); cur->bc_rec.b.br_state =XFS_EXT_NORM ; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done); }
@@ -1651,7 +1651,7 @@ xfs_bmap_add_extent_unwritten_real( oldext))) goto done; cur->bc_rec.b = *new; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done); }
@@ -1741,7 +1741,7 @@ xfs_bmap_add_extent_unwritten_real( goto done;XFS_WANT_CORRUPTED_GOTO (i ==0 , done); cur->bc_rec.b.br_state =XFS_EXT_NORM ; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done); }
@@ -1789,7 +1789,7 @@ xfs_bmap_add_extent_unwritten_real( cur->bc_rec.b =PREV ; cur->bc_rec.b.br_blockcount = new->br_startoff -PREV .br_startoff; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done);/*
@@ -1804,7 +1804,7 @@ xfs_bmap_add_extent_unwritten_real(XFS_WANT_CORRUPTED_GOTO (i ==0 , done);/* new middle extent - newext */ cur->bc_rec.b.br_state = new->br_state; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done); }
@@ -2264,7 +2264,7 @@ xfs_bmap_add_extent_hole_real( goto done;XFS_WANT_CORRUPTED_GOTO (i ==0 , done); cur->bc_rec.b.br_state = new->br_state; -if ((error =xfs_bmbt_insert (cur, &i))) +if ((error =xfs_btree_insert (cur, &i))) goto done;XFS_WANT_CORRUPTED_GOTO (i ==1 , done); }
@@ -3303,7 +3303,7 @@ xfs_bmap_del_extent(if ((error =xfs_btree_increment (cur,0 , &i))) goto done; cur->bc_rec.b = new; - error =xfs_bmbt_insert (cur, &i); + error =xfs_btree_insert (cur, &i);if (error && error !=ENOSPC ) goto done;/*
fs/xfs/xfs_bmap_btree.h +0 -1
@@ -250,7 +250,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_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 ,int );
fs/xfs/xfs_ialloc.c +1 -1
@@ -418,7 +418,7 @@ xfs_ialloc_ag_alloc(return error; }ASSERT (i ==0 ); -if ((error =xfs_inobt_insert (cur, &i))) { +if ((error =xfs_btree_insert (cur, &i))) {xfs_btree_del_cursor (cur,XFS_BTREE_ERROR );return error; }
fs/xfs/xfs_ialloc_btree.h +0 -6
@@ -129,12 +129,6 @@ extern int xfs_inobt_delete(struct xfs_bextern int xfs_inobt_get_rec (struct xfs_btree_cur *cur,xfs_agino_t *ino,__int32_t *fcnt,xfs_inofree_t *free,int *stat); -/* -* Insert the current record at the point referenced by cur. -* The cursor may be inconsistent on return if splits have been done. -*/ -extern int xfs_inobt_insert (struct xfs_btree_cur *cur,int *stat); -extern struct xfs_btree_cur *xfs_inobt_init_cursor (struct xfs_mount *,struct xfs_trans *,struct xfs_buf *,xfs_agnumber_t );
Quoted 5 lines · Christoph Hellwig
Make the btree insert code generic. Based on a patch from David Chinner with lots of changes to follow the original btree implementations more closely. While this loses some of the generic helper routines for inserting/moving/removing records it also solves some of the one off bugs in the original code and makes it easier to verify.
....
fs/xfs/xfs_btree.c out0: · line 2511
Quoted 6 lines
fs/xfs/xfs_btree.c +6
-0+if (cur->bc_flags &XFS_BTREE_ROOT_IN_INODE ) { +if (numrecs < cur->bc_ops->get_dmaxrecs (cur, level)) { +/* A resizeable root block that can be made bigger. */ + cur->bc_ops->realloc_root (cur,1 ); +return 0 ; + }
I think that ->get_dmaxrecs is probably badly named. I called it that originally because it matched the macro name it was wrapping. Realisitically it should be ->get_root_maxrecs....
fs/xfs/xfs_btree.c out0: · line 2611
Quoted 10 lines
fs/xfs/xfs_btree.c +10
-0+/* Make a key out of the record data to be inserted, and save it. */ + cur->bc_ops->init_key_from_rec (cur, &key, recp); + +/* If we're off the left edge, return failure. */ + ptr = cur->bc_ptrs[level]; +if (ptr ==0 ) { +XFS_BTREE_TRACE_CURSOR (cur,XBT_EXIT ); + *stat =0 ; +return 0 ; + }
You can probably move the key initialisation till after then initial 'in this block' checks.
Quoted 5 lines
fs/xfs/xfs_btree.c +5
-0+/* +* If the block is full, we can't insert the new entry until we +* make the block un-full. +*/ +xfs_btree_set_ptr_null (cur, &nptr);
fs/xfs/xfs_btree.c out0: · line 2652
Quoted 10 lines
fs/xfs/xfs_btree.c +10
-0+if (numrecs == cur->bc_ops->get_maxrecs (cur, level)) { + error =xfs_btree_make_block_unfull (cur, level, numrecs, + &optr, &ptr, &nptr, &ncur, &nrec, stat); +if (error || *stat ==0 ) + goto error0; + } + +/* The current block may have changed during the split. */ + block =xfs_btree_get_block (cur, level, &bp); + numrecs =xfs_btree_get_numrecs (block);
The comment here should probably refer to the unfull call, not a 'split'. i.e.:
/* * the current block may have changed if the block was * previously full and we have just made space in it. */
Otherwise looks good.
Cheers,
Dave.
Signature · 2 lines
Dave Chinner [email protected]
Re: [PATCH 21/26] implement generic xfs_btree_in??ert/insrec
Quoted 3 lines · Dave Chinner
I think that ->get_dmaxrecs is probably badly named. I called it that originally because it matched the macro name it was wrapping. Realisitically it should be ->get_root_maxrecs....
Yeah. The name giving macro is already gone in my current tree.
Quoted 14 lines
fs/xfs/xfs_btree.c out0: · line 2611
Quoted 11 lines
fs/xfs/xfs_btree.c +10
-0+/* Make a key out of the record data to be inserted, and save it. */ + cur->bc_ops->init_key_from_rec (cur, &key, recp); + +/* If we're off the left edge, return failure. */ + ptr = cur->bc_ptrs[level]; +if (ptr ==0 ) { +XFS_BTREE_TRACE_CURSOR (cur,XBT_EXIT ); + *stat =0 ; +return 0 ; + }You can probably move the key initialisation till after then initial 'in this block' checks.
Done.
Quoted 19 lines
Quoted 5 lines
fs/xfs/xfs_btree.c +5
-0+/* +* If the block is full, we can't insert the new entry until we +* make the block un-full. +*/ +xfs_btree_set_ptr_null (cur, &nptr);fs/xfs/xfs_btree.c out0: · line 2652
Quoted 10 lines
fs/xfs/xfs_btree.c +10
-0+if (numrecs == cur->bc_ops->get_maxrecs (cur, level)) { + error =xfs_btree_make_block_unfull (cur, level, numrecs, + &optr, &ptr, &nptr, &ncur, &nrec, stat); +if (error || *stat ==0 ) + goto error0; + } + +/* The current block may have changed during the split. */ + block =xfs_btree_get_block (cur, level, &bp); + numrecs =xfs_btree_get_numrecs (block);The comment here should probably refer to the unfull call, not a 'split'. i.e.:
Quoted 4 lines
/* * the current block may have changed if the block was * previously full and we have just made space in it. */
Updated.