Lines Matching full:block
54 struct xfs_btree_block *block, /* btree long form block pointer */ in xfs_btree_check_lblock() argument
55 int level, /* level of the btree block */ in xfs_btree_check_lblock()
56 struct xfs_buf *bp) /* buffer for block, if any */ in xfs_btree_check_lblock()
58 int lblock_ok; /* block passes checks */ in xfs_btree_check_lblock()
63 be32_to_cpu(block->bb_magic) == xfs_magics[cur->bc_btnum] && in xfs_btree_check_lblock()
64 be16_to_cpu(block->bb_level) == level && in xfs_btree_check_lblock()
65 be16_to_cpu(block->bb_numrecs) <= in xfs_btree_check_lblock()
67 block->bb_u.l.bb_leftsib && in xfs_btree_check_lblock()
68 (block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) || in xfs_btree_check_lblock()
70 be64_to_cpu(block->bb_u.l.bb_leftsib))) && in xfs_btree_check_lblock()
71 block->bb_u.l.bb_rightsib && in xfs_btree_check_lblock()
72 (block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) || in xfs_btree_check_lblock()
74 be64_to_cpu(block->bb_u.l.bb_rightsib))); in xfs_btree_check_lblock()
90 struct xfs_btree_block *block, /* btree short form block pointer */ in xfs_btree_check_sblock() argument
91 int level, /* level of the btree block */ in xfs_btree_check_sblock()
92 struct xfs_buf *bp) /* buffer containing block */ in xfs_btree_check_sblock()
97 int sblock_ok; /* block passes checks */ in xfs_btree_check_sblock()
103 be32_to_cpu(block->bb_magic) == xfs_magics[cur->bc_btnum] && in xfs_btree_check_sblock()
104 be16_to_cpu(block->bb_level) == level && in xfs_btree_check_sblock()
105 be16_to_cpu(block->bb_numrecs) <= in xfs_btree_check_sblock()
107 (block->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK) || in xfs_btree_check_sblock()
108 be32_to_cpu(block->bb_u.s.bb_leftsib) < agflen) && in xfs_btree_check_sblock()
109 block->bb_u.s.bb_leftsib && in xfs_btree_check_sblock()
110 (block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK) || in xfs_btree_check_sblock()
111 be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) && in xfs_btree_check_sblock()
112 block->bb_u.s.bb_rightsib; in xfs_btree_check_sblock()
119 XFS_ERRLEVEL_LOW, cur->bc_mp, block); in xfs_btree_check_sblock()
126 * Debug routine: check that block header is ok.
131 struct xfs_btree_block *block, /* generic btree block pointer */ in xfs_btree_check_block() argument
132 int level, /* level of the btree block */ in xfs_btree_check_block()
133 struct xfs_buf *bp) /* buffer containing block, if any */ in xfs_btree_check_block()
136 return xfs_btree_check_lblock(cur, block, level, bp); in xfs_btree_check_block()
138 return xfs_btree_check_sblock(cur, block, level, bp); in xfs_btree_check_block()
147 xfs_dfsbno_t bno, /* btree block disk address */ in xfs_btree_check_lptr()
148 int level) /* btree block level */ in xfs_btree_check_lptr()
164 xfs_agblock_t bno, /* btree block disk address */ in xfs_btree_check_sptr()
165 int level) /* btree block level */ in xfs_btree_check_sptr()
178 * Check that block ptr is ok.
183 union xfs_btree_ptr *ptr, /* btree block disk address */ in xfs_btree_check_ptr()
185 int level) /* btree block level */ in xfs_btree_check_ptr()
244 xfs_buf_t *bp; /* btree block's buffer pointer */ in xfs_btree_dup_cursor()
246 int i; /* level number of btree block */ in xfs_btree_dup_cursor()
287 * XFS btree block layout and addressing:
292 * the values. A non-leaf block also starts with the same header, and
305 * and comes in different versions for short (32bit) and long (64bit) block
307 * and opaque to the btree core. The block pointers are simple disk endian
311 * into a btree block (xfs_btree_*_offset) or return a pointer to the given
313 * inside the btree block is done using indices starting at one, not zero!
317 * Return size of the btree block header for this btree instance.
327 * Return size of btree block pointers for this btree instance.
336 * Calculate offset of the n-th record in a btree block.
348 * Calculate offset of the n-th key in a btree block.
360 * Calculate offset of the n-th block pointer in a btree block.
374 * Return a pointer to the n-th record in the btree block.
380 struct xfs_btree_block *block) in xfs_btree_rec_addr() argument
383 ((char *)block + xfs_btree_rec_offset(cur, n)); in xfs_btree_rec_addr()
387 * Return a pointer to the n-th key in the btree block.
393 struct xfs_btree_block *block) in xfs_btree_key_addr() argument
396 ((char *)block + xfs_btree_key_offset(cur, n)); in xfs_btree_key_addr()
400 * Return a pointer to the n-th block pointer in the btree block.
406 struct xfs_btree_block *block) in xfs_btree_ptr_addr() argument
408 int level = xfs_btree_get_level(block); in xfs_btree_ptr_addr()
410 ASSERT(block->bb_level != 0); in xfs_btree_ptr_addr()
413 ((char *)block + xfs_btree_ptr_offset(cur, n, level)); in xfs_btree_ptr_addr()
417 * Get a the root block which is stored in the inode.
433 * Retrieve the block pointer from the cursor at the given level.
436 STATIC struct xfs_btree_block * /* generic btree block pointer */
440 struct xfs_buf **bpp) /* buffer containing the block */ in xfs_btree_get_block()
453 * Get a buffer for the block, return it with no data read.
460 xfs_fsblock_t fsbno, /* file system block number */ in xfs_btree_get_bufl()
464 xfs_daddr_t d; /* real disk block address */ in xfs_btree_get_bufl()
474 * Get a buffer for the block, return it with no data read.
482 xfs_agblock_t agbno, /* allocation group block number */ in xfs_btree_get_bufs()
486 xfs_daddr_t d; /* real disk block address */ in xfs_btree_get_bufs()
497 * Check for the cursor referring to the last block at the given level.
499 int /* 1=is last block, 0=not last block */
504 struct xfs_btree_block *block; /* generic btree block pointer */ in xfs_btree_islastblock() local
505 xfs_buf_t *bp; /* buffer containing block */ in xfs_btree_islastblock()
507 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_islastblock()
508 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_islastblock()
510 return block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO); in xfs_btree_islastblock()
512 return block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK); in xfs_btree_islastblock()
524 struct xfs_btree_block *block; /* generic btree block pointer */ in xfs_btree_firstrec() local
525 xfs_buf_t *bp; /* buffer containing block */ in xfs_btree_firstrec()
528 * Get the block pointer for this level. in xfs_btree_firstrec()
530 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_firstrec()
531 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_firstrec()
535 if (!block->bb_numrecs) in xfs_btree_firstrec()
545 * Change the cursor to point to the last record in the current block
553 struct xfs_btree_block *block; /* generic btree block pointer */ in xfs_btree_lastrec() local
554 xfs_buf_t *bp; /* buffer containing block */ in xfs_btree_lastrec()
557 * Get the block pointer for this level. in xfs_btree_lastrec()
559 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_lastrec()
560 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_lastrec()
564 if (!block->bb_numrecs) in xfs_btree_lastrec()
569 cur->bc_ptrs[level] = be16_to_cpu(block->bb_numrecs); in xfs_btree_lastrec()
610 * Get a buffer for the block, return it read in.
617 xfs_fsblock_t fsbno, /* file system block number */ in xfs_btree_read_bufl()
623 xfs_daddr_t d; /* real disk block address */ in xfs_btree_read_bufl()
640 * Read-ahead the block, don't wait for it, don't return a buffer.
647 xfs_fsblock_t fsbno, /* file system block number */ in xfs_btree_reada_bufl()
658 * Read-ahead the block, don't wait for it, don't return a buffer.
666 xfs_agblock_t agbno, /* allocation group block number */ in xfs_btree_reada_bufs()
681 struct xfs_btree_block *block) in xfs_btree_readahead_lblock() argument
684 xfs_dfsbno_t left = be64_to_cpu(block->bb_u.l.bb_leftsib); in xfs_btree_readahead_lblock()
685 xfs_dfsbno_t right = be64_to_cpu(block->bb_u.l.bb_rightsib); in xfs_btree_readahead_lblock()
704 struct xfs_btree_block *block) in xfs_btree_readahead_sblock() argument
707 xfs_agblock_t left = be32_to_cpu(block->bb_u.s.bb_leftsib); in xfs_btree_readahead_sblock()
708 xfs_agblock_t right = be32_to_cpu(block->bb_u.s.bb_rightsib); in xfs_btree_readahead_sblock()
736 struct xfs_btree_block *block; in xfs_btree_readahead() local
750 block = XFS_BUF_TO_BLOCK(cur->bc_bufs[lev]); in xfs_btree_readahead()
753 return xfs_btree_readahead_lblock(cur, lr, block); in xfs_btree_readahead()
754 return xfs_btree_readahead_sblock(cur, lr, block); in xfs_btree_readahead()
767 struct xfs_btree_block *b; /* btree block */ in xfs_btree_setbuf()
816 struct xfs_btree_block *block, in xfs_btree_get_sibling() argument
824 ptr->l = block->bb_u.l.bb_rightsib; in xfs_btree_get_sibling()
826 ptr->l = block->bb_u.l.bb_leftsib; in xfs_btree_get_sibling()
829 ptr->s = block->bb_u.s.bb_rightsib; in xfs_btree_get_sibling()
831 ptr->s = block->bb_u.s.bb_leftsib; in xfs_btree_get_sibling()
838 struct xfs_btree_block *block, in xfs_btree_set_sibling() argument
846 block->bb_u.l.bb_rightsib = ptr->l; in xfs_btree_set_sibling()
848 block->bb_u.l.bb_leftsib = ptr->l; in xfs_btree_set_sibling()
851 block->bb_u.s.bb_rightsib = ptr->s; in xfs_btree_set_sibling()
853 block->bb_u.s.bb_leftsib = ptr->s; in xfs_btree_set_sibling()
862 struct xfs_btree_block *new) /* new block */ in xfs_btree_init_block()
885 struct xfs_btree_block *block, in xfs_btree_is_lastrec() argument
895 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_is_lastrec()
960 struct xfs_btree_block **block, in xfs_btree_get_buf_block() argument
976 *block = XFS_BUF_TO_BLOCK(*bpp); in xfs_btree_get_buf_block()
982 * the block pointer within the buffer.
990 struct xfs_btree_block **block, in xfs_btree_read_buf_block() argument
1009 *block = XFS_BUF_TO_BLOCK(*bpp); in xfs_btree_read_buf_block()
1011 error = xfs_btree_check_block(cur, *block, level, *bpp); in xfs_btree_read_buf_block()
1018 * Copy keys from one btree block to another.
1032 * Copy records from one btree block to another.
1046 * Copy block pointers from one btree block to another.
1060 * Shift keys one index left/right inside a single btree block.
1079 * Shift records one index left/right inside a single btree block.
1098 * Shift block pointers one index left/right inside a single btree block.
1117 * Log key values from the btree block.
1142 * Log record values from the btree block.
1162 * Log block pointer fields from a btree block (nonleaf).
1167 struct xfs_buf *bp, /* buffer containing btree block */ in xfs_btree_log_ptrs()
1175 struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); in xfs_btree_log_ptrs() local
1176 int level = xfs_btree_get_level(block); in xfs_btree_log_ptrs()
1190 * Log fields from a btree block header.
1195 struct xfs_buf *bp, /* buffer containing btree block */ in xfs_btree_log_block()
1244 struct xfs_btree_block *block; in xfs_btree_increment() local
1258 /* Get a pointer to the btree block. */ in xfs_btree_increment()
1259 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_increment()
1262 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_increment()
1267 /* We're done if we remain in the block after the increment. */ in xfs_btree_increment()
1268 if (++cur->bc_ptrs[level] <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1272 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_increment()
1280 * Stop when we don't go off the right edge of a block. in xfs_btree_increment()
1283 block = xfs_btree_get_block(cur, lev, &bp); in xfs_btree_increment()
1286 error = xfs_btree_check_block(cur, block, lev, bp); in xfs_btree_increment()
1291 if (++cur->bc_ptrs[lev] <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1294 /* Read-ahead the right block for the next loop. */ in xfs_btree_increment()
1315 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_increment()
1318 ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); in xfs_btree_increment()
1320 0, &block, &bp); in xfs_btree_increment()
1352 struct xfs_btree_block *block; in xfs_btree_decrement() local
1366 /* We're done if we remain in the block after the decrement. */ in xfs_btree_decrement()
1370 /* Get a pointer to the btree block. */ in xfs_btree_decrement()
1371 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_decrement()
1374 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_decrement()
1380 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_decrement()
1388 * Stop when we don't go off the left edge of a block. in xfs_btree_decrement()
1393 /* Read-ahead the left block for the next loop. */ in xfs_btree_decrement()
1414 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_decrement()
1417 ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); in xfs_btree_decrement()
1419 0, &block, &bp); in xfs_btree_decrement()
1423 cur->bc_ptrs[lev] = xfs_btree_get_numrecs(block); in xfs_btree_decrement()
1444 union xfs_btree_ptr *pp, /* ptr to btree block */ in xfs_btree_lookup_get_block()
1445 struct xfs_btree_block **blkp) /* return btree block */ in xfs_btree_lookup_get_block()
1447 struct xfs_buf *bp; /* buffer pointer for btree block */ in xfs_btree_lookup_get_block()
1450 /* special case the root block if in an inode */ in xfs_btree_lookup_get_block()
1487 struct xfs_btree_block *block, in xfs_lookup_get_search_key() argument
1492 xfs_btree_rec_addr(cur, keyno, block)); in xfs_lookup_get_search_key()
1496 return xfs_btree_key_addr(cur, keyno, block); in xfs_lookup_get_search_key()
1509 struct xfs_btree_block *block; /* current btree block */ in xfs_btree_lookup() local
1514 union xfs_btree_ptr *pp; /* ptr to btree block */ in xfs_btree_lookup()
1515 union xfs_btree_ptr ptr; /* ptr to btree block */ in xfs_btree_lookup()
1522 block = NULL; in xfs_btree_lookup()
1532 * on the lookup record, then follow the corresponding block in xfs_btree_lookup()
1536 /* Get the block we need to do the lookup on. */ in xfs_btree_lookup()
1537 error = xfs_btree_lookup_get_block(cur, level, pp, &block); in xfs_btree_lookup()
1544 * know we need to use the first entry in this block. in xfs_btree_lookup()
1548 /* Otherwise search this block. Do a binary search. */ in xfs_btree_lookup()
1555 high = xfs_btree_get_numrecs(block); in xfs_btree_lookup()
1557 /* Block is empty, must be an empty leaf. */ in xfs_btree_lookup()
1566 /* Binary search the block. */ in xfs_btree_lookup()
1578 keyno, block, &key); in xfs_btree_lookup()
1598 * by getting the block number and filling in the cursor. in xfs_btree_lookup()
1607 pp = xfs_btree_ptr_addr(cur, keyno, block); in xfs_btree_lookup()
1622 * If ge search and we went off the end of the block, but it's in xfs_btree_lookup()
1623 * not the last block, we're in the wrong block. in xfs_btree_lookup()
1625 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_lookup()
1627 keyno > xfs_btree_get_numrecs(block) && in xfs_btree_lookup()
1645 if (keyno == 0 || keyno > xfs_btree_get_numrecs(block)) in xfs_btree_lookup()
1668 struct xfs_btree_block *block; in xfs_btree_updkey() local
1682 * at the first entry in the block. in xfs_btree_updkey()
1688 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_updkey()
1690 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_updkey()
1697 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_updkey()
1716 struct xfs_btree_block *block; in xfs_btree_update() local
1725 /* Pick up the current block. */ in xfs_btree_update()
1726 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_update()
1729 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_update()
1735 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_update()
1745 if (xfs_btree_is_lastrec(cur, block, 0)) { in xfs_btree_update()
1746 cur->bc_ops->update_lastrec(cur, block, rec, in xfs_btree_update()
1780 struct xfs_btree_block *left; /* left btree block */ in xfs_btree_lshift()
1783 struct xfs_btree_block *right; /* right btree block */ in xfs_btree_lshift()
1798 /* Set up variables for this block as "right". */ in xfs_btree_lshift()
1843 * If non-leaf, copy a key and a ptr to the left block. in xfs_btree_lshift()
1844 * Log the changes to the left block. in xfs_btree_lshift()
1921 * If it's the first record in the block, we'll need a key in xfs_btree_lshift()
1963 struct xfs_btree_block *left; /* left btree block */ in xfs_btree_rshift()
1965 struct xfs_btree_block *right; /* right btree block */ in xfs_btree_rshift()
1967 union xfs_btree_ptr rptr; /* right block pointer */ in xfs_btree_rshift()
1981 /* Set up variables for this block as "left". */ in xfs_btree_rshift()
2017 * Make a hole at the start of the right neighbor block, then in xfs_btree_rshift()
2018 * copy the last left block entry to the hole. in xfs_btree_rshift()
2089 * block on the right. in xfs_btree_rshift()
2127 * Split cur/level block in half.
2128 * Return new block number and the key to its first
2140 union xfs_btree_ptr lptr; /* left sibling block ptr */ in xfs_btree_split()
2142 struct xfs_btree_block *left; /* left btree block */ in xfs_btree_split()
2143 union xfs_btree_ptr rptr; /* right sibling block ptr */ in xfs_btree_split()
2145 struct xfs_btree_block *right; /* right btree block */ in xfs_btree_split()
2148 struct xfs_btree_block *rrblock; /* right-right btree block */ in xfs_btree_split()
2162 /* Set up left block (current one). */ in xfs_btree_split()
2173 /* Allocate the new block. If we can't do it, we're toast. Give up. */ in xfs_btree_split()
2181 /* Set up the new block as "right". */ in xfs_btree_split()
2186 /* Fill in the btree header for the new right block. */ in xfs_btree_split()
2190 * Split the entries between the old and the new block evenly. in xfs_btree_split()
2192 * each new block will have the same number of entries. in xfs_btree_split()
2203 * Copy btree block entries from the left block over to the in xfs_btree_split()
2204 * new block, the right. Update the right block and log the in xfs_btree_split()
2233 /* Grab the keys to the entries moved to the right block */ in xfs_btree_split()
2252 * Find the left block number by looking in the buffer. in xfs_btree_split()
2268 * If there's a block to the new block's right, make that block in xfs_btree_split()
2280 * If the cursor is really in the right block, move it there. in xfs_btree_split()
2290 * the right block, no matter where this cursor was. in xfs_btree_split()
2313 * Copy the old inode root contents into a real block and make the
2323 struct xfs_btree_block *block; /* btree block */ in xfs_btree_new_iroot() local
2324 struct xfs_btree_block *cblock; /* child btree block */ in xfs_btree_new_iroot()
2328 union xfs_btree_ptr *pp; /* pointer to block addr */ in xfs_btree_new_iroot()
2329 union xfs_btree_ptr nptr; /* new block addr */ in xfs_btree_new_iroot()
2343 block = xfs_btree_get_iroot(cur); in xfs_btree_new_iroot()
2344 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_new_iroot()
2346 /* Allocate the new block. If we can't do it, we're toast. Give up. */ in xfs_btree_new_iroot()
2356 /* Copy the root into a real block. */ in xfs_btree_new_iroot()
2361 memcpy(cblock, block, xfs_btree_block_len(cur)); in xfs_btree_new_iroot()
2363 be16_add_cpu(&block->bb_level, 1); in xfs_btree_new_iroot()
2364 xfs_btree_set_numrecs(block, 1); in xfs_btree_new_iroot()
2368 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_new_iroot()
2414 * Allocate a new root block, fill it in.
2421 struct xfs_btree_block *block; /* one half of the old root block */ in xfs_btree_new_root() local
2422 struct xfs_buf *bp; /* buffer containing block */ in xfs_btree_new_root()
2425 struct xfs_btree_block *left; /* left btree block */ in xfs_btree_new_root()
2427 struct xfs_btree_block *new; /* new (root) btree block */ in xfs_btree_new_root()
2430 struct xfs_btree_block *right; /* right btree block */ in xfs_btree_new_root()
2440 /* Allocate the new block. If we can't do it, we're toast. Give up. */ in xfs_btree_new_root()
2448 /* Set up the new block. */ in xfs_btree_new_root()
2458 * and the new block generated when it was split. We don't know which in xfs_btree_new_root()
2462 block = xfs_btree_get_block(cur, cur->bc_nlevels - 1, &bp); in xfs_btree_new_root()
2465 error = xfs_btree_check_block(cur, block, cur->bc_nlevels - 1, bp); in xfs_btree_new_root()
2470 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_new_root()
2472 /* Our block is left, pick up the right block. */ in xfs_btree_new_root()
2475 left = block; in xfs_btree_new_root()
2483 /* Our block is right, pick up the left block. */ in xfs_btree_new_root()
2486 right = block; in xfs_btree_new_root()
2495 /* Fill in the new block's btree header and log it. */ in xfs_btree_new_root()
2546 int numrecs,/* # of recs in block */ in xfs_btree_make_block_unfull()
2562 /* A root block that can be made bigger. */ in xfs_btree_make_block_unfull()
2566 /* A root block that needs replacing */ in xfs_btree_make_block_unfull()
2595 * Next, try splitting the current block in half. in xfs_btree_make_block_unfull()
2598 * could be in a different block now. in xfs_btree_make_block_unfull()
2618 union xfs_btree_ptr *ptrp, /* i/o: block number inserted */ in xfs_btree_insrec()
2623 struct xfs_btree_block *block; /* btree block */ in xfs_btree_insrec() local
2624 struct xfs_buf *bp; /* buffer for block */ in xfs_btree_insrec()
2626 union xfs_btree_ptr nptr; /* new block ptr */ in xfs_btree_insrec()
2644 * root level, allocate a new root block and we're done. in xfs_btree_insrec()
2670 /* Get pointers to the btree buffer and block. */ in xfs_btree_insrec()
2671 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
2672 numrecs = xfs_btree_get_numrecs(block); in xfs_btree_insrec()
2675 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
2683 xfs_btree_rec_addr(cur, ptr, block))); in xfs_btree_insrec()
2686 xfs_btree_key_addr(cur, ptr, block))); in xfs_btree_insrec()
2692 * If the block is full, we can't insert the new entry until we in xfs_btree_insrec()
2693 * make the block un-full. in xfs_btree_insrec()
2704 * The current block may have changed if the block was in xfs_btree_insrec()
2707 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
2708 numrecs = xfs_btree_get_numrecs(block); in xfs_btree_insrec()
2711 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
2717 * At this point we know there's room for our new entry in the block in xfs_btree_insrec()
2727 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_insrec()
2728 pp = xfs_btree_ptr_addr(cur, ptr, block); in xfs_btree_insrec()
2751 xfs_btree_set_numrecs(block, numrecs); in xfs_btree_insrec()
2757 xfs_btree_key_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
2764 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_insrec()
2770 xfs_btree_set_numrecs(block, ++numrecs); in xfs_btree_insrec()
2775 xfs_btree_rec_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
2783 /* If we inserted at the start of a block, update the parents' keys. */ in xfs_btree_insrec()
2794 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_insrec()
2795 cur->bc_ops->update_lastrec(cur, block, recp, in xfs_btree_insrec()
2800 * Return the new block number, if any. in xfs_btree_insrec()
2833 union xfs_btree_ptr nptr; /* new block number (split result) */ in xfs_btree_insert()
2847 * Stop when we don't get a split block, that must mean that in xfs_btree_insert()
2894 * Try to merge a non-leaf block back into the inode root.
2897 * killing the old root block. But because we can't just delete the
2898 * inode we have to copy the single block it was pointing to into the
2908 struct xfs_btree_block *block; in xfs_btree_kill_iroot() local
2929 * Don't deal with the root block needs to be a leaf case. in xfs_btree_kill_iroot()
2939 block = xfs_btree_get_iroot(cur); in xfs_btree_kill_iroot()
2940 if (xfs_btree_get_numrecs(block) != 1) in xfs_btree_kill_iroot()
2957 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_kill_iroot()
2959 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_kill_iroot()
2967 block = ifp->if_broot; in xfs_btree_kill_iroot()
2970 be16_add_cpu(&block->bb_numrecs, index); in xfs_btree_kill_iroot()
2971 ASSERT(block->bb_numrecs == cblock->bb_numrecs); in xfs_btree_kill_iroot()
2973 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_kill_iroot()
2977 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_kill_iroot()
2996 be16_add_cpu(&block->bb_level, -1); in xfs_btree_kill_iroot()
3065 * Remove the record from its block then rebalance the tree.
3074 struct xfs_btree_block *block; /* btree block */ in xfs_btree_delrec() local
3075 union xfs_btree_ptr cptr; /* current block ptr */ in xfs_btree_delrec()
3076 struct xfs_buf *bp; /* buffer for block */ in xfs_btree_delrec()
3081 union xfs_btree_ptr lptr; /* left sibling block ptr */ in xfs_btree_delrec()
3083 struct xfs_btree_block *left; /* left btree block */ in xfs_btree_delrec()
3086 union xfs_btree_ptr rptr; /* right sibling block ptr */ in xfs_btree_delrec()
3088 struct xfs_btree_block *right; /* right btree block */ in xfs_btree_delrec()
3089 struct xfs_btree_block *rrblock; /* right-right btree block */ in xfs_btree_delrec()
3108 /* Get the buffer & block containing the record or key/ptr. */ in xfs_btree_delrec()
3109 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_delrec()
3110 numrecs = xfs_btree_get_numrecs(block); in xfs_btree_delrec()
3113 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_delrec()
3118 /* Fail if we're off the end of the block. */ in xfs_btree_delrec()
3134 lkp = xfs_btree_key_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3135 lpp = xfs_btree_ptr_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3153 * If it's the first record in the block, we'll need to pass a in xfs_btree_delrec()
3157 keyp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_delrec()
3162 xfs_btree_rec_addr(cur, ptr + 1, block), in xfs_btree_delrec()
3168 * If it's the first record in the block, we'll need a key in xfs_btree_delrec()
3173 xfs_btree_rec_addr(cur, 1, block)); in xfs_btree_delrec()
3179 * Decrement and log the number of entries in the block. in xfs_btree_delrec()
3181 xfs_btree_set_numrecs(block, --numrecs); in xfs_btree_delrec()
3188 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_delrec()
3189 cur->bc_ops->update_lastrec(cur, block, NULL, in xfs_btree_delrec()
3194 * We're at the root level. First, shrink the root block in-memory. in xfs_btree_delrec()
3222 * pp is still set to the first pointer in the block. in xfs_btree_delrec()
3225 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_delrec()
3239 * If we deleted the leftmost entry in the block, update the in xfs_btree_delrec()
3249 * If the number of records remaining in the block is at least in xfs_btree_delrec()
3264 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3265 xfs_btree_get_sibling(cur, block, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3302 * Move the temp cursor to the last entry in the next block. in xfs_btree_delrec()
3316 /* Grab a pointer to the block. */ in xfs_btree_delrec()
3323 /* Grab the current block number, for future use. */ in xfs_btree_delrec()
3327 * If right block is full enough so that removing one entry in xfs_btree_delrec()
3337 ASSERT(xfs_btree_get_numrecs(block) >= in xfs_btree_delrec()
3353 * to our block again (last record). in xfs_btree_delrec()
3374 * previous block. in xfs_btree_delrec()
3385 /* Grab a pointer to the block. */ in xfs_btree_delrec()
3392 /* Grab the current block number, for future use. */ in xfs_btree_delrec()
3396 * If left block is full enough so that removing one entry in xfs_btree_delrec()
3406 ASSERT(xfs_btree_get_numrecs(block) >= in xfs_btree_delrec()
3433 lrecs + xfs_btree_get_numrecs(block) <= in xfs_btree_delrec()
3436 * Set "right" to be the starting block, in xfs_btree_delrec()
3440 right = block; in xfs_btree_delrec()
3448 * If that won't work, see if we can join with the right neighbor block. in xfs_btree_delrec()
3451 rrecs + xfs_btree_get_numrecs(block) <= in xfs_btree_delrec()
3454 * Set "left" to be the starting block, in xfs_btree_delrec()
3458 left = block; in xfs_btree_delrec()
3522 * Fix up the number of records and right block pointer in the in xfs_btree_delrec()
3523 * surviving block, and log it. in xfs_btree_delrec()
3530 /* If there is a right sibling, point it to the remaining block. */ in xfs_btree_delrec()
3541 /* Free the deleted block. */ in xfs_btree_delrec()
3549 * cursor to the left block, and fix up the index. in xfs_btree_delrec()
3644 struct xfs_btree_block *block; /* btree block */ in xfs_btree_get_rec() local
3652 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_get_rec()
3655 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_get_rec()
3663 if (ptr > xfs_btree_get_numrecs(block) || ptr <= 0) { in xfs_btree_get_rec()
3671 *recp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_get_rec()