Lines Matching refs:cur
60 struct xfs_btree_cur *cur, in __xfs_btree_check_lblock() argument
65 struct xfs_mount *mp = cur->bc_mp; in __xfs_btree_check_lblock()
66 xfs_btnum_t btnum = cur->bc_btnum; in __xfs_btree_check_lblock()
84 cur->bc_ops->get_maxrecs(cur, level)) in __xfs_btree_check_lblock()
87 !xfs_btree_check_lptr(cur, be64_to_cpu(block->bb_u.l.bb_leftsib), in __xfs_btree_check_lblock()
91 !xfs_btree_check_lptr(cur, be64_to_cpu(block->bb_u.l.bb_rightsib), in __xfs_btree_check_lblock()
101 struct xfs_btree_cur *cur, in xfs_btree_check_lblock() argument
106 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_check_lblock()
109 fa = __xfs_btree_check_lblock(cur, block, level, bp); in xfs_btree_check_lblock()
125 struct xfs_btree_cur *cur, in __xfs_btree_check_sblock() argument
130 struct xfs_mount *mp = cur->bc_mp; in __xfs_btree_check_sblock()
131 xfs_btnum_t btnum = cur->bc_btnum; in __xfs_btree_check_sblock()
147 cur->bc_ops->get_maxrecs(cur, level)) in __xfs_btree_check_sblock()
150 !xfs_btree_check_sptr(cur, be32_to_cpu(block->bb_u.s.bb_leftsib), in __xfs_btree_check_sblock()
154 !xfs_btree_check_sptr(cur, be32_to_cpu(block->bb_u.s.bb_rightsib), in __xfs_btree_check_sblock()
164 struct xfs_btree_cur *cur, in xfs_btree_check_sblock() argument
169 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_check_sblock()
172 fa = __xfs_btree_check_sblock(cur, block, level, bp); in xfs_btree_check_sblock()
187 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_block() argument
192 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_check_block()
193 return xfs_btree_check_lblock(cur, block, level, bp); in xfs_btree_check_block()
195 return xfs_btree_check_sblock(cur, block, level, bp); in xfs_btree_check_block()
201 struct xfs_btree_cur *cur, in xfs_btree_check_lptr() argument
207 return xfs_verify_fsbno(cur->bc_mp, fsbno); in xfs_btree_check_lptr()
213 struct xfs_btree_cur *cur, in xfs_btree_check_sptr() argument
219 return xfs_verify_agbno(cur->bc_mp, cur->bc_ag.pag->pag_agno, agbno); in xfs_btree_check_sptr()
228 struct xfs_btree_cur *cur, in xfs_btree_check_ptr() argument
233 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_check_ptr()
234 if (xfs_btree_check_lptr(cur, be64_to_cpu((&ptr->l)[index]), in xfs_btree_check_ptr()
237 xfs_err(cur->bc_mp, in xfs_btree_check_ptr()
239 cur->bc_ino.ip->i_ino, in xfs_btree_check_ptr()
240 cur->bc_ino.whichfork, cur->bc_btnum, in xfs_btree_check_ptr()
243 if (xfs_btree_check_sptr(cur, be32_to_cpu((&ptr->s)[index]), in xfs_btree_check_ptr()
246 xfs_err(cur->bc_mp, in xfs_btree_check_ptr()
248 cur->bc_ag.pag->pag_agno, cur->bc_btnum, in xfs_btree_check_ptr()
339 struct xfs_btree_cur *cur, in xfs_btree_free_block() argument
344 error = cur->bc_ops->free_block(cur, bp); in xfs_btree_free_block()
346 xfs_trans_binval(cur->bc_tp, bp); in xfs_btree_free_block()
347 XFS_BTREE_STATS_INC(cur, free); in xfs_btree_free_block()
357 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_del_cursor() argument
369 for (i = 0; i < cur->bc_nlevels; i++) { in xfs_btree_del_cursor()
370 if (cur->bc_levels[i].bp) in xfs_btree_del_cursor()
371 xfs_trans_brelse(cur->bc_tp, cur->bc_levels[i].bp); in xfs_btree_del_cursor()
376 ASSERT(cur->bc_btnum != XFS_BTNUM_BMAP || cur->bc_ino.allocated == 0 || in xfs_btree_del_cursor()
377 xfs_is_shutdown(cur->bc_mp)); in xfs_btree_del_cursor()
378 if (unlikely(cur->bc_flags & XFS_BTREE_STAGING)) in xfs_btree_del_cursor()
379 kmem_free(cur->bc_ops); in xfs_btree_del_cursor()
380 if (!(cur->bc_flags & XFS_BTREE_LONG_PTRS) && cur->bc_ag.pag) in xfs_btree_del_cursor()
381 xfs_perag_put(cur->bc_ag.pag); in xfs_btree_del_cursor()
382 kmem_cache_free(cur->bc_cache, cur); in xfs_btree_del_cursor()
391 struct xfs_btree_cur *cur, /* input cursor */ in xfs_btree_dup_cursor() argument
401 tp = cur->bc_tp; in xfs_btree_dup_cursor()
402 mp = cur->bc_mp; in xfs_btree_dup_cursor()
407 new = cur->bc_ops->dup_cursor(cur); in xfs_btree_dup_cursor()
412 new->bc_rec = cur->bc_rec; in xfs_btree_dup_cursor()
418 new->bc_levels[i].ptr = cur->bc_levels[i].ptr; in xfs_btree_dup_cursor()
419 new->bc_levels[i].ra = cur->bc_levels[i].ra; in xfs_btree_dup_cursor()
420 bp = cur->bc_levels[i].bp; in xfs_btree_dup_cursor()
425 cur->bc_ops->buf_ops); in xfs_btree_dup_cursor()
515 static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) in xfs_btree_block_len() argument
517 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_block_len()
518 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) in xfs_btree_block_len()
522 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) in xfs_btree_block_len()
530 static inline size_t xfs_btree_ptr_len(struct xfs_btree_cur *cur) in xfs_btree_ptr_len() argument
532 return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? in xfs_btree_ptr_len()
541 struct xfs_btree_cur *cur, in xfs_btree_rec_offset() argument
544 return xfs_btree_block_len(cur) + in xfs_btree_rec_offset()
545 (n - 1) * cur->bc_ops->rec_len; in xfs_btree_rec_offset()
553 struct xfs_btree_cur *cur, in xfs_btree_key_offset() argument
556 return xfs_btree_block_len(cur) + in xfs_btree_key_offset()
557 (n - 1) * cur->bc_ops->key_len; in xfs_btree_key_offset()
565 struct xfs_btree_cur *cur, in xfs_btree_high_key_offset() argument
568 return xfs_btree_block_len(cur) + in xfs_btree_high_key_offset()
569 (n - 1) * cur->bc_ops->key_len + (cur->bc_ops->key_len / 2); in xfs_btree_high_key_offset()
577 struct xfs_btree_cur *cur, in xfs_btree_ptr_offset() argument
581 return xfs_btree_block_len(cur) + in xfs_btree_ptr_offset()
582 cur->bc_ops->get_maxrecs(cur, level) * cur->bc_ops->key_len + in xfs_btree_ptr_offset()
583 (n - 1) * xfs_btree_ptr_len(cur); in xfs_btree_ptr_offset()
591 struct xfs_btree_cur *cur, in xfs_btree_rec_addr() argument
596 ((char *)block + xfs_btree_rec_offset(cur, n)); in xfs_btree_rec_addr()
604 struct xfs_btree_cur *cur, in xfs_btree_key_addr() argument
609 ((char *)block + xfs_btree_key_offset(cur, n)); in xfs_btree_key_addr()
617 struct xfs_btree_cur *cur, in xfs_btree_high_key_addr() argument
622 ((char *)block + xfs_btree_high_key_offset(cur, n)); in xfs_btree_high_key_addr()
630 struct xfs_btree_cur *cur, in xfs_btree_ptr_addr() argument
639 ((char *)block + xfs_btree_ptr_offset(cur, n, level)); in xfs_btree_ptr_addr()
644 struct xfs_btree_cur *cur) in xfs_btree_ifork_ptr() argument
646 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_ifork_ptr()
648 if (cur->bc_flags & XFS_BTREE_STAGING) in xfs_btree_ifork_ptr()
649 return cur->bc_ino.ifake->if_fork; in xfs_btree_ifork_ptr()
650 return XFS_IFORK_PTR(cur->bc_ino.ip, cur->bc_ino.whichfork); in xfs_btree_ifork_ptr()
661 struct xfs_btree_cur *cur) in xfs_btree_get_iroot() argument
663 struct xfs_ifork *ifp = xfs_btree_ifork_ptr(cur); in xfs_btree_get_iroot()
674 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_get_block() argument
678 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_get_block()
679 (level == cur->bc_nlevels - 1)) { in xfs_btree_get_block()
681 return xfs_btree_get_iroot(cur); in xfs_btree_get_block()
684 *bpp = cur->bc_levels[level].bp; in xfs_btree_get_block()
694 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_firstrec() argument
703 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_firstrec()
704 if (xfs_btree_check_block(cur, block, level, bp)) in xfs_btree_firstrec()
714 cur->bc_levels[level].ptr = 1; in xfs_btree_firstrec()
724 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lastrec() argument
733 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_lastrec()
734 if (xfs_btree_check_block(cur, block, level, bp)) in xfs_btree_lastrec()
744 cur->bc_levels[level].ptr = be16_to_cpu(block->bb_numrecs); in xfs_btree_lastrec()
856 struct xfs_btree_cur *cur, in xfs_btree_readahead_lblock() argument
865 xfs_btree_reada_bufl(cur->bc_mp, left, 1, in xfs_btree_readahead_lblock()
866 cur->bc_ops->buf_ops); in xfs_btree_readahead_lblock()
871 xfs_btree_reada_bufl(cur->bc_mp, right, 1, in xfs_btree_readahead_lblock()
872 cur->bc_ops->buf_ops); in xfs_btree_readahead_lblock()
881 struct xfs_btree_cur *cur, in xfs_btree_readahead_sblock() argument
891 xfs_btree_reada_bufs(cur->bc_mp, cur->bc_ag.pag->pag_agno, in xfs_btree_readahead_sblock()
892 left, 1, cur->bc_ops->buf_ops); in xfs_btree_readahead_sblock()
897 xfs_btree_reada_bufs(cur->bc_mp, cur->bc_ag.pag->pag_agno, in xfs_btree_readahead_sblock()
898 right, 1, cur->bc_ops->buf_ops); in xfs_btree_readahead_sblock()
911 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_readahead() argument
921 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_readahead()
922 (lev == cur->bc_nlevels - 1)) in xfs_btree_readahead()
925 if ((cur->bc_levels[lev].ra | lr) == cur->bc_levels[lev].ra) in xfs_btree_readahead()
928 cur->bc_levels[lev].ra |= lr; in xfs_btree_readahead()
929 block = XFS_BUF_TO_BLOCK(cur->bc_levels[lev].bp); in xfs_btree_readahead()
931 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_readahead()
932 return xfs_btree_readahead_lblock(cur, lr, block); in xfs_btree_readahead()
933 return xfs_btree_readahead_sblock(cur, lr, block); in xfs_btree_readahead()
938 struct xfs_btree_cur *cur, in xfs_btree_ptr_to_daddr() argument
946 error = xfs_btree_check_ptr(cur, ptr, 0, 1); in xfs_btree_ptr_to_daddr()
950 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_ptr_to_daddr()
952 *daddr = XFS_FSB_TO_DADDR(cur->bc_mp, fsbno); in xfs_btree_ptr_to_daddr()
955 *daddr = XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_ag.pag->pag_agno, in xfs_btree_ptr_to_daddr()
970 struct xfs_btree_cur *cur, in xfs_btree_readahead_ptr() argument
976 if (xfs_btree_ptr_to_daddr(cur, ptr, &daddr)) in xfs_btree_readahead_ptr()
978 xfs_buf_readahead(cur->bc_mp->m_ddev_targp, daddr, in xfs_btree_readahead_ptr()
979 cur->bc_mp->m_bsize * count, cur->bc_ops->buf_ops); in xfs_btree_readahead_ptr()
988 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_setbuf() argument
994 if (cur->bc_levels[lev].bp) in xfs_btree_setbuf()
995 xfs_trans_brelse(cur->bc_tp, cur->bc_levels[lev].bp); in xfs_btree_setbuf()
996 cur->bc_levels[lev].bp = bp; in xfs_btree_setbuf()
997 cur->bc_levels[lev].ra = 0; in xfs_btree_setbuf()
1000 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_setbuf()
1002 cur->bc_levels[lev].ra |= XFS_BTCUR_LEFTRA; in xfs_btree_setbuf()
1004 cur->bc_levels[lev].ra |= XFS_BTCUR_RIGHTRA; in xfs_btree_setbuf()
1007 cur->bc_levels[lev].ra |= XFS_BTCUR_LEFTRA; in xfs_btree_setbuf()
1009 cur->bc_levels[lev].ra |= XFS_BTCUR_RIGHTRA; in xfs_btree_setbuf()
1015 struct xfs_btree_cur *cur, in xfs_btree_ptr_is_null() argument
1018 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_ptr_is_null()
1026 struct xfs_btree_cur *cur, in xfs_btree_set_ptr_null() argument
1029 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_set_ptr_null()
1040 struct xfs_btree_cur *cur, in xfs_btree_get_sibling() argument
1047 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_get_sibling()
1062 struct xfs_btree_cur *cur, in xfs_btree_set_sibling() argument
1069 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_set_sibling()
1140 struct xfs_btree_cur *cur, in xfs_btree_init_block_cur() argument
1153 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_init_block_cur()
1154 owner = cur->bc_ino.ip->i_ino; in xfs_btree_init_block_cur()
1156 owner = cur->bc_ag.pag->pag_agno; in xfs_btree_init_block_cur()
1158 xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), in xfs_btree_init_block_cur()
1159 xfs_buf_daddr(bp), cur->bc_btnum, level, in xfs_btree_init_block_cur()
1160 numrecs, owner, cur->bc_flags); in xfs_btree_init_block_cur()
1170 struct xfs_btree_cur *cur, in xfs_btree_is_lastrec() argument
1178 if (!(cur->bc_flags & XFS_BTREE_LASTREC_UPDATE)) in xfs_btree_is_lastrec()
1181 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_is_lastrec()
1182 if (!xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_is_lastrec()
1189 struct xfs_btree_cur *cur, in xfs_btree_buf_to_ptr() argument
1193 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_buf_to_ptr()
1194 ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp, in xfs_btree_buf_to_ptr()
1197 ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp, in xfs_btree_buf_to_ptr()
1204 struct xfs_btree_cur *cur, in xfs_btree_set_refs() argument
1207 switch (cur->bc_btnum) { in xfs_btree_set_refs()
1232 struct xfs_btree_cur *cur, in xfs_btree_get_buf_block() argument
1237 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_get_buf_block()
1241 error = xfs_btree_ptr_to_daddr(cur, ptr, &d); in xfs_btree_get_buf_block()
1244 error = xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, mp->m_bsize, in xfs_btree_get_buf_block()
1249 (*bpp)->b_ops = cur->bc_ops->buf_ops; in xfs_btree_get_buf_block()
1260 struct xfs_btree_cur *cur, in xfs_btree_read_buf_block() argument
1266 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_read_buf_block()
1273 error = xfs_btree_ptr_to_daddr(cur, ptr, &d); in xfs_btree_read_buf_block()
1276 error = xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d, in xfs_btree_read_buf_block()
1278 cur->bc_ops->buf_ops); in xfs_btree_read_buf_block()
1282 xfs_btree_set_refs(cur, *bpp); in xfs_btree_read_buf_block()
1292 struct xfs_btree_cur *cur, in xfs_btree_copy_keys() argument
1298 memcpy(dst_key, src_key, numkeys * cur->bc_ops->key_len); in xfs_btree_copy_keys()
1306 struct xfs_btree_cur *cur, in xfs_btree_copy_recs() argument
1312 memcpy(dst_rec, src_rec, numrecs * cur->bc_ops->rec_len); in xfs_btree_copy_recs()
1320 struct xfs_btree_cur *cur, in xfs_btree_copy_ptrs() argument
1326 memcpy(dst_ptr, src_ptr, numptrs * xfs_btree_ptr_len(cur)); in xfs_btree_copy_ptrs()
1334 struct xfs_btree_cur *cur, in xfs_btree_shift_keys() argument
1344 dst_key = (char *)key + (dir * cur->bc_ops->key_len); in xfs_btree_shift_keys()
1345 memmove(dst_key, key, numkeys * cur->bc_ops->key_len); in xfs_btree_shift_keys()
1353 struct xfs_btree_cur *cur, in xfs_btree_shift_recs() argument
1363 dst_rec = (char *)rec + (dir * cur->bc_ops->rec_len); in xfs_btree_shift_recs()
1364 memmove(dst_rec, rec, numrecs * cur->bc_ops->rec_len); in xfs_btree_shift_recs()
1372 struct xfs_btree_cur *cur, in xfs_btree_shift_ptrs() argument
1382 dst_ptr = (char *)ptr + (dir * xfs_btree_ptr_len(cur)); in xfs_btree_shift_ptrs()
1383 memmove(dst_ptr, ptr, numptrs * xfs_btree_ptr_len(cur)); in xfs_btree_shift_ptrs()
1391 struct xfs_btree_cur *cur, in xfs_btree_log_keys() argument
1398 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_keys()
1399 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_keys()
1400 xfs_btree_key_offset(cur, first), in xfs_btree_log_keys()
1401 xfs_btree_key_offset(cur, last + 1) - 1); in xfs_btree_log_keys()
1403 xfs_trans_log_inode(cur->bc_tp, cur->bc_ino.ip, in xfs_btree_log_keys()
1404 xfs_ilog_fbroot(cur->bc_ino.whichfork)); in xfs_btree_log_keys()
1413 struct xfs_btree_cur *cur, in xfs_btree_log_recs() argument
1419 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_recs()
1420 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_recs()
1421 xfs_btree_rec_offset(cur, first), in xfs_btree_log_recs()
1422 xfs_btree_rec_offset(cur, last + 1) - 1); in xfs_btree_log_recs()
1431 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_log_ptrs() argument
1441 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_ptrs()
1442 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_ptrs()
1443 xfs_btree_ptr_offset(cur, first, level), in xfs_btree_log_ptrs()
1444 xfs_btree_ptr_offset(cur, last + 1, level) - 1); in xfs_btree_log_ptrs()
1446 xfs_trans_log_inode(cur->bc_tp, cur->bc_ino.ip, in xfs_btree_log_ptrs()
1447 xfs_ilog_fbroot(cur->bc_ino.whichfork)); in xfs_btree_log_ptrs()
1457 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_log_block() argument
1494 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { in xfs_btree_log_block()
1509 (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? in xfs_btree_log_block()
1512 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_block()
1513 xfs_trans_log_buf(cur->bc_tp, bp, first, last); in xfs_btree_log_block()
1515 xfs_trans_log_inode(cur->bc_tp, cur->bc_ino.ip, in xfs_btree_log_block()
1516 xfs_ilog_fbroot(cur->bc_ino.whichfork)); in xfs_btree_log_block()
1526 struct xfs_btree_cur *cur, in xfs_btree_increment() argument
1536 ASSERT(level < cur->bc_nlevels); in xfs_btree_increment()
1539 xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); in xfs_btree_increment()
1542 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_increment()
1545 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_increment()
1551 if (++cur->bc_levels[level].ptr <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1555 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_increment()
1556 if (xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_increment()
1559 XFS_BTREE_STATS_INC(cur, increment); in xfs_btree_increment()
1565 for (lev = level + 1; lev < cur->bc_nlevels; lev++) { in xfs_btree_increment()
1566 block = xfs_btree_get_block(cur, lev, &bp); in xfs_btree_increment()
1569 error = xfs_btree_check_block(cur, block, lev, bp); in xfs_btree_increment()
1574 if (++cur->bc_levels[lev].ptr <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1578 xfs_btree_readahead(cur, lev, XFS_BTCUR_RIGHTRA); in xfs_btree_increment()
1585 if (lev == cur->bc_nlevels) { in xfs_btree_increment()
1586 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) in xfs_btree_increment()
1592 ASSERT(lev < cur->bc_nlevels); in xfs_btree_increment()
1598 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_increment()
1601 ptrp = xfs_btree_ptr_addr(cur, cur->bc_levels[lev].ptr, block); in xfs_btree_increment()
1603 error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); in xfs_btree_increment()
1607 xfs_btree_setbuf(cur, lev, bp); in xfs_btree_increment()
1608 cur->bc_levels[lev].ptr = 1; in xfs_btree_increment()
1628 struct xfs_btree_cur *cur, in xfs_btree_decrement() argument
1638 ASSERT(level < cur->bc_nlevels); in xfs_btree_decrement()
1641 xfs_btree_readahead(cur, level, XFS_BTCUR_LEFTRA); in xfs_btree_decrement()
1644 if (--cur->bc_levels[level].ptr > 0) in xfs_btree_decrement()
1648 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_decrement()
1651 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_decrement()
1657 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_decrement()
1658 if (xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_decrement()
1661 XFS_BTREE_STATS_INC(cur, decrement); in xfs_btree_decrement()
1667 for (lev = level + 1; lev < cur->bc_nlevels; lev++) { in xfs_btree_decrement()
1668 if (--cur->bc_levels[lev].ptr > 0) in xfs_btree_decrement()
1671 xfs_btree_readahead(cur, lev, XFS_BTCUR_LEFTRA); in xfs_btree_decrement()
1678 if (lev == cur->bc_nlevels) { in xfs_btree_decrement()
1679 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) in xfs_btree_decrement()
1685 ASSERT(lev < cur->bc_nlevels); in xfs_btree_decrement()
1691 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_decrement()
1694 ptrp = xfs_btree_ptr_addr(cur, cur->bc_levels[lev].ptr, block); in xfs_btree_decrement()
1696 error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); in xfs_btree_decrement()
1699 xfs_btree_setbuf(cur, lev, bp); in xfs_btree_decrement()
1700 cur->bc_levels[lev].ptr = xfs_btree_get_numrecs(block); in xfs_btree_decrement()
1716 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lookup_get_block() argument
1726 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_lookup_get_block()
1727 (level == cur->bc_nlevels - 1)) { in xfs_btree_lookup_get_block()
1728 *blkp = xfs_btree_get_iroot(cur); in xfs_btree_lookup_get_block()
1738 bp = cur->bc_levels[level].bp; in xfs_btree_lookup_get_block()
1739 error = xfs_btree_ptr_to_daddr(cur, pp, &daddr); in xfs_btree_lookup_get_block()
1747 error = xfs_btree_read_buf_block(cur, pp, 0, blkp, &bp); in xfs_btree_lookup_get_block()
1752 if (xfs_has_crc(cur->bc_mp) && in xfs_btree_lookup_get_block()
1753 !(cur->bc_ino.flags & XFS_BTCUR_BMBT_INVALID_OWNER) && in xfs_btree_lookup_get_block()
1754 (cur->bc_flags & XFS_BTREE_LONG_PTRS) && in xfs_btree_lookup_get_block()
1756 cur->bc_ino.ip->i_ino) in xfs_btree_lookup_get_block()
1767 xfs_btree_setbuf(cur, level, bp); in xfs_btree_lookup_get_block()
1773 xfs_trans_brelse(cur->bc_tp, bp); in xfs_btree_lookup_get_block()
1784 struct xfs_btree_cur *cur, in xfs_lookup_get_search_key() argument
1791 cur->bc_ops->init_key_from_rec(kp, in xfs_lookup_get_search_key()
1792 xfs_btree_rec_addr(cur, keyno, block)); in xfs_lookup_get_search_key()
1796 return xfs_btree_key_addr(cur, keyno, block); in xfs_lookup_get_search_key()
1805 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lookup() argument
1817 XFS_BTREE_STATS_INC(cur, lookup); in xfs_btree_lookup()
1820 if (XFS_IS_CORRUPT(cur->bc_mp, cur->bc_nlevels == 0)) in xfs_btree_lookup()
1827 cur->bc_ops->init_ptr_from_cur(cur, &ptr); in xfs_btree_lookup()
1836 for (level = cur->bc_nlevels - 1, diff = 1; level >= 0; level--) { in xfs_btree_lookup()
1838 error = xfs_btree_lookup_get_block(cur, level, pp, &block); in xfs_btree_lookup()
1859 if (level != 0 || cur->bc_nlevels != 1) { in xfs_btree_lookup()
1862 cur->bc_mp, block, in xfs_btree_lookup()
1867 cur->bc_levels[0].ptr = dir != XFS_LOOKUP_LE; in xfs_btree_lookup()
1877 XFS_BTREE_STATS_INC(cur, compare); in xfs_btree_lookup()
1883 kp = xfs_lookup_get_search_key(cur, level, in xfs_btree_lookup()
1892 diff = cur->bc_ops->key_diff(cur, kp); in xfs_btree_lookup()
1913 pp = xfs_btree_ptr_addr(cur, keyno, block); in xfs_btree_lookup()
1915 error = xfs_btree_debug_check_ptr(cur, pp, 0, level); in xfs_btree_lookup()
1919 cur->bc_levels[level].ptr = keyno; in xfs_btree_lookup()
1930 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_lookup()
1933 !xfs_btree_ptr_is_null(cur, &ptr)) { in xfs_btree_lookup()
1936 cur->bc_levels[0].ptr = keyno; in xfs_btree_lookup()
1937 error = xfs_btree_increment(cur, 0, &i); in xfs_btree_lookup()
1940 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) in xfs_btree_lookup()
1947 cur->bc_levels[0].ptr = keyno; in xfs_btree_lookup()
1965 struct xfs_btree_cur *cur, in xfs_btree_high_key_from_key() argument
1968 ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); in xfs_btree_high_key_from_key()
1970 (cur->bc_ops->key_len / 2)); in xfs_btree_high_key_from_key()
1976 struct xfs_btree_cur *cur, in xfs_btree_get_leaf_keys() argument
1986 rec = xfs_btree_rec_addr(cur, 1, block); in xfs_btree_get_leaf_keys()
1987 cur->bc_ops->init_key_from_rec(key, rec); in xfs_btree_get_leaf_keys()
1989 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in xfs_btree_get_leaf_keys()
1991 cur->bc_ops->init_high_key_from_rec(&max_hkey, rec); in xfs_btree_get_leaf_keys()
1993 rec = xfs_btree_rec_addr(cur, n, block); in xfs_btree_get_leaf_keys()
1994 cur->bc_ops->init_high_key_from_rec(&hkey, rec); in xfs_btree_get_leaf_keys()
1995 if (cur->bc_ops->diff_two_keys(cur, &hkey, &max_hkey) in xfs_btree_get_leaf_keys()
2000 high = xfs_btree_high_key_from_key(cur, key); in xfs_btree_get_leaf_keys()
2001 memcpy(high, &max_hkey, cur->bc_ops->key_len / 2); in xfs_btree_get_leaf_keys()
2008 struct xfs_btree_cur *cur, in xfs_btree_get_node_keys() argument
2017 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in xfs_btree_get_node_keys()
2018 memcpy(key, xfs_btree_key_addr(cur, 1, block), in xfs_btree_get_node_keys()
2019 cur->bc_ops->key_len / 2); in xfs_btree_get_node_keys()
2021 max_hkey = xfs_btree_high_key_addr(cur, 1, block); in xfs_btree_get_node_keys()
2023 hkey = xfs_btree_high_key_addr(cur, n, block); in xfs_btree_get_node_keys()
2024 if (cur->bc_ops->diff_two_keys(cur, hkey, max_hkey) > 0) in xfs_btree_get_node_keys()
2028 high = xfs_btree_high_key_from_key(cur, key); in xfs_btree_get_node_keys()
2029 memcpy(high, max_hkey, cur->bc_ops->key_len / 2); in xfs_btree_get_node_keys()
2031 memcpy(key, xfs_btree_key_addr(cur, 1, block), in xfs_btree_get_node_keys()
2032 cur->bc_ops->key_len); in xfs_btree_get_node_keys()
2039 struct xfs_btree_cur *cur, in xfs_btree_get_keys() argument
2044 xfs_btree_get_leaf_keys(cur, block, key); in xfs_btree_get_keys()
2046 xfs_btree_get_node_keys(cur, block, key); in xfs_btree_get_keys()
2058 struct xfs_btree_cur *cur, in xfs_btree_needs_key_update() argument
2061 return (cur->bc_flags & XFS_BTREE_OVERLAPPING) || ptr == 1; in xfs_btree_needs_key_update()
2071 struct xfs_btree_cur *cur, in __xfs_btree_updkeys() argument
2085 ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); in __xfs_btree_updkeys()
2088 if (level + 1 >= cur->bc_nlevels) in __xfs_btree_updkeys()
2091 trace_xfs_btree_updkeys(cur, level, bp0); in __xfs_btree_updkeys()
2094 hkey = xfs_btree_high_key_from_key(cur, lkey); in __xfs_btree_updkeys()
2095 xfs_btree_get_keys(cur, block, lkey); in __xfs_btree_updkeys()
2096 for (level++; level < cur->bc_nlevels; level++) { in __xfs_btree_updkeys()
2100 block = xfs_btree_get_block(cur, level, &bp); in __xfs_btree_updkeys()
2101 trace_xfs_btree_updkeys(cur, level, bp); in __xfs_btree_updkeys()
2103 error = xfs_btree_check_block(cur, block, level, bp); in __xfs_btree_updkeys()
2107 ptr = cur->bc_levels[level].ptr; in __xfs_btree_updkeys()
2108 nlkey = xfs_btree_key_addr(cur, ptr, block); in __xfs_btree_updkeys()
2109 nhkey = xfs_btree_high_key_addr(cur, ptr, block); in __xfs_btree_updkeys()
2111 !(cur->bc_ops->diff_two_keys(cur, nlkey, lkey) != 0 || in __xfs_btree_updkeys()
2112 cur->bc_ops->diff_two_keys(cur, nhkey, hkey) != 0)) in __xfs_btree_updkeys()
2114 xfs_btree_copy_keys(cur, nlkey, lkey, 1); in __xfs_btree_updkeys()
2115 xfs_btree_log_keys(cur, bp, ptr, ptr); in __xfs_btree_updkeys()
2116 if (level + 1 >= cur->bc_nlevels) in __xfs_btree_updkeys()
2118 xfs_btree_get_node_keys(cur, block, lkey); in __xfs_btree_updkeys()
2127 struct xfs_btree_cur *cur, in xfs_btree_updkeys_force() argument
2133 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_updkeys_force()
2134 return __xfs_btree_updkeys(cur, level, block, bp, true); in xfs_btree_updkeys_force()
2142 struct xfs_btree_cur *cur, in xfs_btree_update_keys() argument
2153 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_update_keys()
2154 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) in xfs_btree_update_keys()
2155 return __xfs_btree_updkeys(cur, level, block, bp, false); in xfs_btree_update_keys()
2163 xfs_btree_get_keys(cur, block, &key); in xfs_btree_update_keys()
2164 for (level++, ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { in xfs_btree_update_keys()
2168 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_update_keys()
2170 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_update_keys()
2174 ptr = cur->bc_levels[level].ptr; in xfs_btree_update_keys()
2175 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_update_keys()
2176 xfs_btree_copy_keys(cur, kp, &key, 1); in xfs_btree_update_keys()
2177 xfs_btree_log_keys(cur, bp, ptr, ptr); in xfs_btree_update_keys()
2190 struct xfs_btree_cur *cur, in xfs_btree_update() argument
2200 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_update()
2203 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_update()
2208 ptr = cur->bc_levels[0].ptr; in xfs_btree_update()
2209 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_update()
2212 xfs_btree_copy_recs(cur, rp, rec, 1); in xfs_btree_update()
2213 xfs_btree_log_recs(cur, bp, ptr, ptr); in xfs_btree_update()
2219 if (xfs_btree_is_lastrec(cur, block, 0)) { in xfs_btree_update()
2220 cur->bc_ops->update_lastrec(cur, block, rec, in xfs_btree_update()
2225 if (xfs_btree_needs_key_update(cur, ptr)) { in xfs_btree_update()
2226 error = xfs_btree_update_keys(cur, 0); in xfs_btree_update()
2243 struct xfs_btree_cur *cur, in xfs_btree_lshift() argument
2261 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_lshift()
2262 level == cur->bc_nlevels - 1) in xfs_btree_lshift()
2266 right = xfs_btree_get_block(cur, level, &rbp); in xfs_btree_lshift()
2269 error = xfs_btree_check_block(cur, right, level, rbp); in xfs_btree_lshift()
2275 xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in xfs_btree_lshift()
2276 if (xfs_btree_ptr_is_null(cur, &lptr)) in xfs_btree_lshift()
2283 if (cur->bc_levels[level].ptr <= 1) in xfs_btree_lshift()
2287 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_lshift()
2293 if (lrecs == cur->bc_ops->get_maxrecs(cur, level)) in xfs_btree_lshift()
2306 XFS_BTREE_STATS_INC(cur, lshift); in xfs_btree_lshift()
2307 XFS_BTREE_STATS_ADD(cur, moves, 1); in xfs_btree_lshift()
2318 lkp = xfs_btree_key_addr(cur, lrecs, left); in xfs_btree_lshift()
2319 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_lshift()
2321 lpp = xfs_btree_ptr_addr(cur, lrecs, left); in xfs_btree_lshift()
2322 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_lshift()
2324 error = xfs_btree_debug_check_ptr(cur, rpp, 0, level); in xfs_btree_lshift()
2328 xfs_btree_copy_keys(cur, lkp, rkp, 1); in xfs_btree_lshift()
2329 xfs_btree_copy_ptrs(cur, lpp, rpp, 1); in xfs_btree_lshift()
2331 xfs_btree_log_keys(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2332 xfs_btree_log_ptrs(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2334 ASSERT(cur->bc_ops->keys_inorder(cur, in xfs_btree_lshift()
2335 xfs_btree_key_addr(cur, lrecs - 1, left), lkp)); in xfs_btree_lshift()
2340 lrp = xfs_btree_rec_addr(cur, lrecs, left); in xfs_btree_lshift()
2341 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_lshift()
2343 xfs_btree_copy_recs(cur, lrp, rrp, 1); in xfs_btree_lshift()
2344 xfs_btree_log_recs(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2346 ASSERT(cur->bc_ops->recs_inorder(cur, in xfs_btree_lshift()
2347 xfs_btree_rec_addr(cur, lrecs - 1, left), lrp)); in xfs_btree_lshift()
2351 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS); in xfs_btree_lshift()
2354 xfs_btree_log_block(cur, rbp, XFS_BB_NUMRECS); in xfs_btree_lshift()
2359 XFS_BTREE_STATS_ADD(cur, moves, rrecs - 1); in xfs_btree_lshift()
2363 error = xfs_btree_debug_check_ptr(cur, rpp, i + 1, level); in xfs_btree_lshift()
2368 xfs_btree_shift_keys(cur, in xfs_btree_lshift()
2369 xfs_btree_key_addr(cur, 2, right), in xfs_btree_lshift()
2371 xfs_btree_shift_ptrs(cur, in xfs_btree_lshift()
2372 xfs_btree_ptr_addr(cur, 2, right), in xfs_btree_lshift()
2375 xfs_btree_log_keys(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2376 xfs_btree_log_ptrs(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2379 xfs_btree_shift_recs(cur, in xfs_btree_lshift()
2380 xfs_btree_rec_addr(cur, 2, right), in xfs_btree_lshift()
2382 xfs_btree_log_recs(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2389 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in xfs_btree_lshift()
2390 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_lshift()
2412 error = xfs_btree_update_keys(cur, level); in xfs_btree_lshift()
2417 cur->bc_levels[level].ptr--; in xfs_btree_lshift()
2440 struct xfs_btree_cur *cur, in xfs_btree_rshift() argument
2456 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_rshift()
2457 (level == cur->bc_nlevels - 1)) in xfs_btree_rshift()
2461 left = xfs_btree_get_block(cur, level, &lbp); in xfs_btree_rshift()
2464 error = xfs_btree_check_block(cur, left, level, lbp); in xfs_btree_rshift()
2470 xfs_btree_get_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_rshift()
2471 if (xfs_btree_ptr_is_null(cur, &rptr)) in xfs_btree_rshift()
2479 if (cur->bc_levels[level].ptr >= lrecs) in xfs_btree_rshift()
2483 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_rshift()
2489 if (rrecs == cur->bc_ops->get_maxrecs(cur, level)) in xfs_btree_rshift()
2492 XFS_BTREE_STATS_INC(cur, rshift); in xfs_btree_rshift()
2493 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in xfs_btree_rshift()
2505 lkp = xfs_btree_key_addr(cur, lrecs, left); in xfs_btree_rshift()
2506 lpp = xfs_btree_ptr_addr(cur, lrecs, left); in xfs_btree_rshift()
2507 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_rshift()
2508 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_rshift()
2511 error = xfs_btree_debug_check_ptr(cur, rpp, i, level); in xfs_btree_rshift()
2516 xfs_btree_shift_keys(cur, rkp, 1, rrecs); in xfs_btree_rshift()
2517 xfs_btree_shift_ptrs(cur, rpp, 1, rrecs); in xfs_btree_rshift()
2519 error = xfs_btree_debug_check_ptr(cur, lpp, 0, level); in xfs_btree_rshift()
2524 xfs_btree_copy_keys(cur, rkp, lkp, 1); in xfs_btree_rshift()
2525 xfs_btree_copy_ptrs(cur, rpp, lpp, 1); in xfs_btree_rshift()
2527 xfs_btree_log_keys(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2528 xfs_btree_log_ptrs(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2530 ASSERT(cur->bc_ops->keys_inorder(cur, rkp, in xfs_btree_rshift()
2531 xfs_btree_key_addr(cur, 2, right))); in xfs_btree_rshift()
2537 lrp = xfs_btree_rec_addr(cur, lrecs, left); in xfs_btree_rshift()
2538 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_rshift()
2540 xfs_btree_shift_recs(cur, rrp, 1, rrecs); in xfs_btree_rshift()
2543 xfs_btree_copy_recs(cur, rrp, lrp, 1); in xfs_btree_rshift()
2544 xfs_btree_log_recs(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2551 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS); in xfs_btree_rshift()
2554 xfs_btree_log_block(cur, rbp, XFS_BB_NUMRECS); in xfs_btree_rshift()
2560 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_rshift()
2574 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in xfs_btree_rshift()
2575 error = xfs_btree_update_keys(cur, level); in xfs_btree_rshift()
2609 struct xfs_btree_cur *cur, in __xfs_btree_split() argument
2631 XFS_BTREE_STATS_INC(cur, split); in __xfs_btree_split()
2634 left = xfs_btree_get_block(cur, level, &lbp); in __xfs_btree_split()
2637 error = xfs_btree_check_block(cur, left, level, lbp); in __xfs_btree_split()
2642 xfs_btree_buf_to_ptr(cur, lbp, &lptr); in __xfs_btree_split()
2645 error = cur->bc_ops->alloc_block(cur, &lptr, &rptr, stat); in __xfs_btree_split()
2650 XFS_BTREE_STATS_INC(cur, alloc); in __xfs_btree_split()
2653 error = xfs_btree_get_buf_block(cur, &rptr, &right, &rbp); in __xfs_btree_split()
2658 xfs_btree_init_block_cur(cur, rbp, xfs_btree_get_level(left), 0); in __xfs_btree_split()
2667 if ((lrecs & 1) && cur->bc_levels[level].ptr <= rrecs + 1) in __xfs_btree_split()
2671 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in __xfs_btree_split()
2690 lkp = xfs_btree_key_addr(cur, src_index, left); in __xfs_btree_split()
2691 lpp = xfs_btree_ptr_addr(cur, src_index, left); in __xfs_btree_split()
2692 rkp = xfs_btree_key_addr(cur, 1, right); in __xfs_btree_split()
2693 rpp = xfs_btree_ptr_addr(cur, 1, right); in __xfs_btree_split()
2696 error = xfs_btree_debug_check_ptr(cur, lpp, i, level); in __xfs_btree_split()
2702 xfs_btree_copy_keys(cur, rkp, lkp, rrecs); in __xfs_btree_split()
2703 xfs_btree_copy_ptrs(cur, rpp, lpp, rrecs); in __xfs_btree_split()
2705 xfs_btree_log_keys(cur, rbp, 1, rrecs); in __xfs_btree_split()
2706 xfs_btree_log_ptrs(cur, rbp, 1, rrecs); in __xfs_btree_split()
2709 xfs_btree_get_node_keys(cur, right, key); in __xfs_btree_split()
2715 lrp = xfs_btree_rec_addr(cur, src_index, left); in __xfs_btree_split()
2716 rrp = xfs_btree_rec_addr(cur, 1, right); in __xfs_btree_split()
2719 xfs_btree_copy_recs(cur, rrp, lrp, rrecs); in __xfs_btree_split()
2720 xfs_btree_log_recs(cur, rbp, 1, rrecs); in __xfs_btree_split()
2723 xfs_btree_get_leaf_keys(cur, right, key); in __xfs_btree_split()
2730 xfs_btree_get_sibling(cur, left, &rrptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2731 xfs_btree_set_sibling(cur, right, &rrptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2732 xfs_btree_set_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in __xfs_btree_split()
2733 xfs_btree_set_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2735 xfs_btree_log_block(cur, rbp, XFS_BB_ALL_BITS); in __xfs_btree_split()
2736 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); in __xfs_btree_split()
2742 if (!xfs_btree_ptr_is_null(cur, &rrptr)) { in __xfs_btree_split()
2743 error = xfs_btree_read_buf_block(cur, &rrptr, in __xfs_btree_split()
2747 xfs_btree_set_sibling(cur, rrblock, &rptr, XFS_BB_LEFTSIB); in __xfs_btree_split()
2748 xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); in __xfs_btree_split()
2752 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in __xfs_btree_split()
2753 error = xfs_btree_update_keys(cur, level); in __xfs_btree_split()
2763 if (cur->bc_levels[level].ptr > lrecs + 1) { in __xfs_btree_split()
2764 xfs_btree_setbuf(cur, level, rbp); in __xfs_btree_split()
2765 cur->bc_levels[level].ptr -= lrecs; in __xfs_btree_split()
2771 if (level + 1 < cur->bc_nlevels) { in __xfs_btree_split()
2772 error = xfs_btree_dup_cursor(cur, curp); in __xfs_btree_split()
2790 struct xfs_btree_cur *cur; member
2824 xfs_trans_set_context(args->cur->bc_tp); in xfs_btree_split_worker()
2826 args->result = __xfs_btree_split(args->cur, args->level, args->ptrp, in xfs_btree_split_worker()
2829 xfs_trans_clear_context(args->cur->bc_tp); in xfs_btree_split_worker()
2847 struct xfs_btree_cur *cur, in xfs_btree_split() argument
2857 if (cur->bc_btnum != XFS_BTNUM_BMAP) in xfs_btree_split()
2858 return __xfs_btree_split(cur, level, ptrp, key, curp, stat); in xfs_btree_split()
2860 args.cur = cur; in xfs_btree_split()
2885 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_new_iroot() argument
2901 XFS_BTREE_STATS_INC(cur, newroot); in xfs_btree_new_iroot()
2903 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_new_iroot()
2905 level = cur->bc_nlevels - 1; in xfs_btree_new_iroot()
2907 block = xfs_btree_get_iroot(cur); in xfs_btree_new_iroot()
2908 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_new_iroot()
2911 error = cur->bc_ops->alloc_block(cur, pp, &nptr, stat); in xfs_btree_new_iroot()
2917 XFS_BTREE_STATS_INC(cur, alloc); in xfs_btree_new_iroot()
2920 error = xfs_btree_get_buf_block(cur, &nptr, &cblock, &cbp); in xfs_btree_new_iroot()
2928 memcpy(cblock, block, xfs_btree_block_len(cur)); in xfs_btree_new_iroot()
2929 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { in xfs_btree_new_iroot()
2931 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_new_iroot()
2939 cur->bc_nlevels++; in xfs_btree_new_iroot()
2940 ASSERT(cur->bc_nlevels <= cur->bc_maxlevels); in xfs_btree_new_iroot()
2941 cur->bc_levels[level + 1].ptr = 1; in xfs_btree_new_iroot()
2943 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_new_iroot()
2944 ckp = xfs_btree_key_addr(cur, 1, cblock); in xfs_btree_new_iroot()
2945 xfs_btree_copy_keys(cur, ckp, kp, xfs_btree_get_numrecs(cblock)); in xfs_btree_new_iroot()
2947 cpp = xfs_btree_ptr_addr(cur, 1, cblock); in xfs_btree_new_iroot()
2949 error = xfs_btree_debug_check_ptr(cur, pp, i, level); in xfs_btree_new_iroot()
2954 xfs_btree_copy_ptrs(cur, cpp, pp, xfs_btree_get_numrecs(cblock)); in xfs_btree_new_iroot()
2956 error = xfs_btree_debug_check_ptr(cur, &nptr, 0, level); in xfs_btree_new_iroot()
2960 xfs_btree_copy_ptrs(cur, pp, &nptr, 1); in xfs_btree_new_iroot()
2962 xfs_iroot_realloc(cur->bc_ino.ip, in xfs_btree_new_iroot()
2964 cur->bc_ino.whichfork); in xfs_btree_new_iroot()
2966 xfs_btree_setbuf(cur, level, cbp); in xfs_btree_new_iroot()
2972 xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); in xfs_btree_new_iroot()
2973 xfs_btree_log_keys(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); in xfs_btree_new_iroot()
2974 xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); in xfs_btree_new_iroot()
2977 XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_ino.whichfork); in xfs_btree_new_iroot()
2989 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_new_root() argument
3005 XFS_BTREE_STATS_INC(cur, newroot); in xfs_btree_new_root()
3008 cur->bc_ops->init_ptr_from_cur(cur, &rptr); in xfs_btree_new_root()
3011 error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, stat); in xfs_btree_new_root()
3016 XFS_BTREE_STATS_INC(cur, alloc); in xfs_btree_new_root()
3019 error = xfs_btree_get_buf_block(cur, &lptr, &new, &nbp); in xfs_btree_new_root()
3024 cur->bc_ops->set_root(cur, &lptr, 1); in xfs_btree_new_root()
3032 block = xfs_btree_get_block(cur, cur->bc_nlevels - 1, &bp); in xfs_btree_new_root()
3035 error = xfs_btree_check_block(cur, block, cur->bc_nlevels - 1, bp); in xfs_btree_new_root()
3040 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_new_root()
3041 if (!xfs_btree_ptr_is_null(cur, &rptr)) { in xfs_btree_new_root()
3044 xfs_btree_buf_to_ptr(cur, lbp, &lptr); in xfs_btree_new_root()
3046 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_new_root()
3054 xfs_btree_buf_to_ptr(cur, rbp, &rptr); in xfs_btree_new_root()
3056 xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in xfs_btree_new_root()
3057 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_new_root()
3065 xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); in xfs_btree_new_root()
3066 xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); in xfs_btree_new_root()
3067 ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_new_root()
3068 !xfs_btree_ptr_is_null(cur, &rptr)); in xfs_btree_new_root()
3076 xfs_btree_get_node_keys(cur, left, in xfs_btree_new_root()
3077 xfs_btree_key_addr(cur, 1, new)); in xfs_btree_new_root()
3078 xfs_btree_get_node_keys(cur, right, in xfs_btree_new_root()
3079 xfs_btree_key_addr(cur, 2, new)); in xfs_btree_new_root()
3086 xfs_btree_get_leaf_keys(cur, left, in xfs_btree_new_root()
3087 xfs_btree_key_addr(cur, 1, new)); in xfs_btree_new_root()
3088 xfs_btree_get_leaf_keys(cur, right, in xfs_btree_new_root()
3089 xfs_btree_key_addr(cur, 2, new)); in xfs_btree_new_root()
3091 xfs_btree_log_keys(cur, nbp, 1, 2); in xfs_btree_new_root()
3094 xfs_btree_copy_ptrs(cur, in xfs_btree_new_root()
3095 xfs_btree_ptr_addr(cur, 1, new), &lptr, 1); in xfs_btree_new_root()
3096 xfs_btree_copy_ptrs(cur, in xfs_btree_new_root()
3097 xfs_btree_ptr_addr(cur, 2, new), &rptr, 1); in xfs_btree_new_root()
3098 xfs_btree_log_ptrs(cur, nbp, 1, 2); in xfs_btree_new_root()
3101 xfs_btree_setbuf(cur, cur->bc_nlevels, nbp); in xfs_btree_new_root()
3102 cur->bc_levels[cur->bc_nlevels].ptr = nptr; in xfs_btree_new_root()
3103 cur->bc_nlevels++; in xfs_btree_new_root()
3104 ASSERT(cur->bc_nlevels <= cur->bc_maxlevels); in xfs_btree_new_root()
3116 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_make_block_unfull() argument
3128 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_make_block_unfull()
3129 level == cur->bc_nlevels - 1) { in xfs_btree_make_block_unfull()
3130 struct xfs_inode *ip = cur->bc_ino.ip; in xfs_btree_make_block_unfull()
3132 if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) { in xfs_btree_make_block_unfull()
3134 xfs_iroot_realloc(ip, 1, cur->bc_ino.whichfork); in xfs_btree_make_block_unfull()
3140 error = xfs_btree_new_iroot(cur, &logflags, stat); in xfs_btree_make_block_unfull()
3144 xfs_trans_log_inode(cur->bc_tp, ip, logflags); in xfs_btree_make_block_unfull()
3151 error = xfs_btree_rshift(cur, level, stat); in xfs_btree_make_block_unfull()
3156 error = xfs_btree_lshift(cur, level, stat); in xfs_btree_make_block_unfull()
3161 *oindex = *index = cur->bc_levels[level].ptr; in xfs_btree_make_block_unfull()
3171 error = xfs_btree_split(cur, level, nptr, key, ncur, stat); in xfs_btree_make_block_unfull()
3176 *index = cur->bc_levels[level].ptr; in xfs_btree_make_block_unfull()
3186 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_insrec() argument
3214 if (!(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_insrec()
3215 (level >= cur->bc_nlevels)) { in xfs_btree_insrec()
3216 error = xfs_btree_new_root(cur, stat); in xfs_btree_insrec()
3217 xfs_btree_set_ptr_null(cur, ptrp); in xfs_btree_insrec()
3223 ptr = cur->bc_levels[level].ptr; in xfs_btree_insrec()
3231 XFS_BTREE_STATS_INC(cur, insrec); in xfs_btree_insrec()
3234 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
3239 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
3246 ASSERT(cur->bc_ops->recs_inorder(cur, rec, in xfs_btree_insrec()
3247 xfs_btree_rec_addr(cur, ptr, block))); in xfs_btree_insrec()
3249 ASSERT(cur->bc_ops->keys_inorder(cur, key, in xfs_btree_insrec()
3250 xfs_btree_key_addr(cur, ptr, block))); in xfs_btree_insrec()
3259 xfs_btree_set_ptr_null(cur, &nptr); in xfs_btree_insrec()
3260 if (numrecs == cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_insrec()
3261 error = xfs_btree_make_block_unfull(cur, level, numrecs, in xfs_btree_insrec()
3271 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
3275 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
3284 XFS_BTREE_STATS_ADD(cur, moves, numrecs - ptr + 1); in xfs_btree_insrec()
3291 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_insrec()
3292 pp = xfs_btree_ptr_addr(cur, ptr, block); in xfs_btree_insrec()
3295 error = xfs_btree_debug_check_ptr(cur, pp, i, level); in xfs_btree_insrec()
3300 xfs_btree_shift_keys(cur, kp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3301 xfs_btree_shift_ptrs(cur, pp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3303 error = xfs_btree_debug_check_ptr(cur, ptrp, 0, level); in xfs_btree_insrec()
3308 xfs_btree_copy_keys(cur, kp, key, 1); in xfs_btree_insrec()
3309 xfs_btree_copy_ptrs(cur, pp, ptrp, 1); in xfs_btree_insrec()
3312 xfs_btree_log_ptrs(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3313 xfs_btree_log_keys(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3316 ASSERT(cur->bc_ops->keys_inorder(cur, kp, in xfs_btree_insrec()
3317 xfs_btree_key_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
3324 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_insrec()
3326 xfs_btree_shift_recs(cur, rp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3329 xfs_btree_copy_recs(cur, rp, rec, 1); in xfs_btree_insrec()
3331 xfs_btree_log_recs(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3334 ASSERT(cur->bc_ops->recs_inorder(cur, rp, in xfs_btree_insrec()
3335 xfs_btree_rec_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
3341 xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); in xfs_btree_insrec()
3352 xfs_btree_get_keys(cur, block, lkey); in xfs_btree_insrec()
3353 } else if (xfs_btree_needs_key_update(cur, optr)) { in xfs_btree_insrec()
3354 error = xfs_btree_update_keys(cur, level); in xfs_btree_insrec()
3363 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_insrec()
3364 cur->bc_ops->update_lastrec(cur, block, rec, in xfs_btree_insrec()
3373 if (!xfs_btree_ptr_is_null(cur, &nptr)) { in xfs_btree_insrec()
3374 xfs_btree_copy_keys(cur, key, lkey, 1); in xfs_btree_insrec()
3394 struct xfs_btree_cur *cur, in xfs_btree_insert() argument
3409 pcur = cur; in xfs_btree_insert()
3412 xfs_btree_set_ptr_null(cur, &nptr); in xfs_btree_insert()
3415 cur->bc_ops->init_rec_from_cur(cur, &rec); in xfs_btree_insert()
3416 cur->bc_ops->init_key_from_rec(key, &rec); in xfs_btree_insert()
3431 if (pcur != cur) in xfs_btree_insert()
3436 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_insert()
3447 if (pcur != cur && in xfs_btree_insert()
3448 (ncur || xfs_btree_ptr_is_null(cur, &nptr))) { in xfs_btree_insert()
3450 if (cur->bc_ops->update_cursor) in xfs_btree_insert()
3451 cur->bc_ops->update_cursor(pcur, cur); in xfs_btree_insert()
3452 cur->bc_nlevels = pcur->bc_nlevels; in xfs_btree_insert()
3460 } while (!xfs_btree_ptr_is_null(cur, &nptr)); in xfs_btree_insert()
3478 struct xfs_btree_cur *cur) in xfs_btree_kill_iroot() argument
3480 int whichfork = cur->bc_ino.whichfork; in xfs_btree_kill_iroot()
3481 struct xfs_inode *ip = cur->bc_ino.ip; in xfs_btree_kill_iroot()
3499 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_kill_iroot()
3500 ASSERT(cur->bc_nlevels > 1); in xfs_btree_kill_iroot()
3506 level = cur->bc_nlevels - 1; in xfs_btree_kill_iroot()
3513 block = xfs_btree_get_iroot(cur); in xfs_btree_kill_iroot()
3517 cblock = xfs_btree_get_block(cur, level - 1, &cbp); in xfs_btree_kill_iroot()
3525 if (numrecs > cur->bc_ops->get_dmaxrecs(cur, level)) in xfs_btree_kill_iroot()
3528 XFS_BTREE_STATS_INC(cur, killroot); in xfs_btree_kill_iroot()
3531 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_kill_iroot()
3532 ASSERT(xfs_btree_ptr_is_null(cur, &ptr)); in xfs_btree_kill_iroot()
3533 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_kill_iroot()
3534 ASSERT(xfs_btree_ptr_is_null(cur, &ptr)); in xfs_btree_kill_iroot()
3537 index = numrecs - cur->bc_ops->get_maxrecs(cur, level); in xfs_btree_kill_iroot()
3539 xfs_iroot_realloc(cur->bc_ino.ip, index, in xfs_btree_kill_iroot()
3540 cur->bc_ino.whichfork); in xfs_btree_kill_iroot()
3547 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_kill_iroot()
3548 ckp = xfs_btree_key_addr(cur, 1, cblock); in xfs_btree_kill_iroot()
3549 xfs_btree_copy_keys(cur, kp, ckp, numrecs); in xfs_btree_kill_iroot()
3551 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_kill_iroot()
3552 cpp = xfs_btree_ptr_addr(cur, 1, cblock); in xfs_btree_kill_iroot()
3555 error = xfs_btree_debug_check_ptr(cur, cpp, i, level - 1); in xfs_btree_kill_iroot()
3560 xfs_btree_copy_ptrs(cur, pp, cpp, numrecs); in xfs_btree_kill_iroot()
3562 error = xfs_btree_free_block(cur, cbp); in xfs_btree_kill_iroot()
3566 cur->bc_levels[level - 1].bp = NULL; in xfs_btree_kill_iroot()
3568 xfs_trans_log_inode(cur->bc_tp, ip, in xfs_btree_kill_iroot()
3569 XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_ino.whichfork)); in xfs_btree_kill_iroot()
3570 cur->bc_nlevels--; in xfs_btree_kill_iroot()
3580 struct xfs_btree_cur *cur, in xfs_btree_kill_root() argument
3587 XFS_BTREE_STATS_INC(cur, killroot); in xfs_btree_kill_root()
3593 cur->bc_ops->set_root(cur, newroot, -1); in xfs_btree_kill_root()
3595 error = xfs_btree_free_block(cur, bp); in xfs_btree_kill_root()
3599 cur->bc_levels[level].bp = NULL; in xfs_btree_kill_root()
3600 cur->bc_levels[level].ra = 0; in xfs_btree_kill_root()
3601 cur->bc_nlevels--; in xfs_btree_kill_root()
3608 struct xfs_btree_cur *cur, in xfs_btree_dec_cursor() argument
3616 error = xfs_btree_decrement(cur, level, &i); in xfs_btree_dec_cursor()
3633 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_delrec() argument
3659 ptr = cur->bc_levels[level].ptr; in xfs_btree_delrec()
3666 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_delrec()
3670 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_delrec()
3681 XFS_BTREE_STATS_INC(cur, delrec); in xfs_btree_delrec()
3682 XFS_BTREE_STATS_ADD(cur, moves, numrecs - ptr); in xfs_btree_delrec()
3690 lkp = xfs_btree_key_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3691 lpp = xfs_btree_ptr_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3694 error = xfs_btree_debug_check_ptr(cur, lpp, i, level); in xfs_btree_delrec()
3700 xfs_btree_shift_keys(cur, lkp, -1, numrecs - ptr); in xfs_btree_delrec()
3701 xfs_btree_shift_ptrs(cur, lpp, -1, numrecs - ptr); in xfs_btree_delrec()
3702 xfs_btree_log_keys(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3703 xfs_btree_log_ptrs(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3708 xfs_btree_shift_recs(cur, in xfs_btree_delrec()
3709 xfs_btree_rec_addr(cur, ptr + 1, block), in xfs_btree_delrec()
3711 xfs_btree_log_recs(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3719 xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); in xfs_btree_delrec()
3725 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_delrec()
3726 cur->bc_ops->update_lastrec(cur, block, NULL, in xfs_btree_delrec()
3735 if (level == cur->bc_nlevels - 1) { in xfs_btree_delrec()
3736 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { in xfs_btree_delrec()
3737 xfs_iroot_realloc(cur->bc_ino.ip, -1, in xfs_btree_delrec()
3738 cur->bc_ino.whichfork); in xfs_btree_delrec()
3740 error = xfs_btree_kill_iroot(cur); in xfs_btree_delrec()
3744 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3762 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_delrec()
3763 error = xfs_btree_kill_root(cur, bp, level, pp); in xfs_btree_delrec()
3767 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3779 if (xfs_btree_needs_key_update(cur, ptr)) { in xfs_btree_delrec()
3780 error = xfs_btree_update_keys(cur, level); in xfs_btree_delrec()
3789 if (numrecs >= cur->bc_ops->get_minrecs(cur, level)) { in xfs_btree_delrec()
3790 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3801 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3802 xfs_btree_get_sibling(cur, block, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3804 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { in xfs_btree_delrec()
3810 if (xfs_btree_ptr_is_null(cur, &rptr) && in xfs_btree_delrec()
3811 xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_delrec()
3812 level == cur->bc_nlevels - 2) { in xfs_btree_delrec()
3813 error = xfs_btree_kill_iroot(cur); in xfs_btree_delrec()
3815 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3822 ASSERT(!xfs_btree_ptr_is_null(cur, &rptr) || in xfs_btree_delrec()
3823 !xfs_btree_ptr_is_null(cur, &lptr)); in xfs_btree_delrec()
3829 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_delrec()
3837 if (!xfs_btree_ptr_is_null(cur, &rptr)) { in xfs_btree_delrec()
3843 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3851 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3857 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3878 cur->bc_ops->get_minrecs(tcur, level)) { in xfs_btree_delrec()
3884 cur->bc_ops->get_minrecs(tcur, level)); in xfs_btree_delrec()
3889 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3902 if (!xfs_btree_ptr_is_null(cur, &lptr)) { in xfs_btree_delrec()
3904 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3912 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3923 if (!xfs_btree_ptr_is_null(cur, &lptr)) { in xfs_btree_delrec()
3929 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3938 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3946 error = xfs_btree_check_block(cur, left, level, lbp); in xfs_btree_delrec()
3959 cur->bc_ops->get_minrecs(tcur, level)) { in xfs_btree_delrec()
3965 cur->bc_ops->get_minrecs(tcur, level)); in xfs_btree_delrec()
3969 cur->bc_levels[0].ptr++; in xfs_btree_delrec()
3988 ASSERT(!xfs_btree_ptr_is_null(cur, &cptr)); in xfs_btree_delrec()
3990 if (!xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_delrec()
3992 cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_delrec()
4000 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_delrec()
4007 } else if (!xfs_btree_ptr_is_null(cur, &rptr) && in xfs_btree_delrec()
4009 cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_delrec()
4017 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_delrec()
4026 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
4039 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in xfs_btree_delrec()
4047 lkp = xfs_btree_key_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
4048 lpp = xfs_btree_ptr_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
4049 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_delrec()
4050 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_delrec()
4053 error = xfs_btree_debug_check_ptr(cur, rpp, i, level); in xfs_btree_delrec()
4058 xfs_btree_copy_keys(cur, lkp, rkp, rrecs); in xfs_btree_delrec()
4059 xfs_btree_copy_ptrs(cur, lpp, rpp, rrecs); in xfs_btree_delrec()
4061 xfs_btree_log_keys(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
4062 xfs_btree_log_ptrs(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
4068 lrp = xfs_btree_rec_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
4069 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_delrec()
4071 xfs_btree_copy_recs(cur, lrp, rrp, rrecs); in xfs_btree_delrec()
4072 xfs_btree_log_recs(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
4075 XFS_BTREE_STATS_INC(cur, join); in xfs_btree_delrec()
4082 xfs_btree_get_sibling(cur, right, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
4083 xfs_btree_set_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
4084 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); in xfs_btree_delrec()
4087 xfs_btree_get_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
4088 if (!xfs_btree_ptr_is_null(cur, &cptr)) { in xfs_btree_delrec()
4089 error = xfs_btree_read_buf_block(cur, &cptr, 0, &rrblock, &rrbp); in xfs_btree_delrec()
4092 xfs_btree_set_sibling(cur, rrblock, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
4093 xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); in xfs_btree_delrec()
4097 error = xfs_btree_free_block(cur, rbp); in xfs_btree_delrec()
4106 cur->bc_levels[level].bp = lbp; in xfs_btree_delrec()
4107 cur->bc_levels[level].ptr += lrecs; in xfs_btree_delrec()
4108 cur->bc_levels[level].ra = 0; in xfs_btree_delrec()
4114 else if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) || in xfs_btree_delrec()
4115 (level + 1 < cur->bc_nlevels)) { in xfs_btree_delrec()
4116 error = xfs_btree_increment(cur, level + 1, &i); in xfs_btree_delrec()
4128 cur->bc_levels[level].ptr--; in xfs_btree_delrec()
4157 struct xfs_btree_cur *cur, in xfs_btree_delete() argument
4172 error = xfs_btree_delrec(cur, level, &i); in xfs_btree_delete()
4183 if (joined && (cur->bc_flags & XFS_BTREE_OVERLAPPING)) { in xfs_btree_delete()
4184 error = xfs_btree_updkeys_force(cur, 0); in xfs_btree_delete()
4190 for (level = 1; level < cur->bc_nlevels; level++) { in xfs_btree_delete()
4191 if (cur->bc_levels[level].ptr == 0) { in xfs_btree_delete()
4192 error = xfs_btree_decrement(cur, level, &i); in xfs_btree_delete()
4211 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_get_rec() argument
4222 ptr = cur->bc_levels[0].ptr; in xfs_btree_get_rec()
4223 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_get_rec()
4226 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_get_rec()
4242 *recp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_get_rec()
4250 struct xfs_btree_cur *cur, in xfs_btree_visit_block() argument
4261 xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); in xfs_btree_visit_block()
4262 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_visit_block()
4265 error = fn(cur, level, data); in xfs_btree_visit_block()
4270 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_visit_block()
4271 if (xfs_btree_ptr_is_null(cur, &rptr)) in xfs_btree_visit_block()
4274 return xfs_btree_lookup_get_block(cur, level, &rptr, &block); in xfs_btree_visit_block()
4281 struct xfs_btree_cur *cur, in xfs_btree_visit_blocks() argument
4291 cur->bc_ops->init_ptr_from_cur(cur, &lptr); in xfs_btree_visit_blocks()
4294 for (level = cur->bc_nlevels - 1; level >= 0; level--) { in xfs_btree_visit_blocks()
4296 error = xfs_btree_lookup_get_block(cur, level, &lptr, &block); in xfs_btree_visit_blocks()
4304 ptr = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_visit_blocks()
4305 xfs_btree_readahead_ptr(cur, ptr, 1); in xfs_btree_visit_blocks()
4308 xfs_btree_copy_ptrs(cur, &lptr, ptr, 1); in xfs_btree_visit_blocks()
4318 error = xfs_btree_visit_block(cur, level, fn, data); in xfs_btree_visit_blocks()
4359 struct xfs_btree_cur *cur, in xfs_btree_block_change_owner() argument
4368 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_block_change_owner()
4369 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_block_change_owner()
4387 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_block_change_owner()
4388 ASSERT(level == cur->bc_nlevels - 1); in xfs_btree_block_change_owner()
4392 if (cur->bc_tp) { in xfs_btree_block_change_owner()
4393 if (!xfs_trans_ordered_buf(cur->bc_tp, bp)) { in xfs_btree_block_change_owner()
4394 xfs_btree_log_block(cur, bp, XFS_BB_OWNER); in xfs_btree_block_change_owner()
4406 struct xfs_btree_cur *cur, in xfs_btree_change_owner() argument
4415 return xfs_btree_visit_blocks(cur, xfs_btree_block_change_owner, in xfs_btree_change_owner()
4600 struct xfs_btree_cur *cur, in xfs_btree_simple_query_range() argument
4613 ASSERT(cur->bc_ops->init_high_key_from_rec); in xfs_btree_simple_query_range()
4614 ASSERT(cur->bc_ops->diff_two_keys); in xfs_btree_simple_query_range()
4621 error = xfs_btree_lookup(cur, XFS_LOOKUP_LE, &stat); in xfs_btree_simple_query_range()
4627 error = xfs_btree_increment(cur, 0, &stat); in xfs_btree_simple_query_range()
4634 error = xfs_btree_get_rec(cur, &recp, &stat); in xfs_btree_simple_query_range()
4640 cur->bc_ops->init_high_key_from_rec(&rec_key, recp); in xfs_btree_simple_query_range()
4642 diff = cur->bc_ops->diff_two_keys(cur, low_key, in xfs_btree_simple_query_range()
4649 cur->bc_ops->init_key_from_rec(&rec_key, recp); in xfs_btree_simple_query_range()
4650 diff = cur->bc_ops->diff_two_keys(cur, &rec_key, high_key); in xfs_btree_simple_query_range()
4655 error = fn(cur, recp, priv); in xfs_btree_simple_query_range()
4661 error = xfs_btree_increment(cur, 0, &stat); in xfs_btree_simple_query_range()
4691 struct xfs_btree_cur *cur, in xfs_btree_overlapped_query_range() argument
4713 level = cur->bc_nlevels - 1; in xfs_btree_overlapped_query_range()
4714 cur->bc_ops->init_ptr_from_cur(cur, &ptr); in xfs_btree_overlapped_query_range()
4715 error = xfs_btree_lookup_get_block(cur, level, &ptr, &block); in xfs_btree_overlapped_query_range()
4718 xfs_btree_get_block(cur, level, &bp); in xfs_btree_overlapped_query_range()
4719 trace_xfs_btree_overlapped_query_range(cur, level, bp); in xfs_btree_overlapped_query_range()
4721 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_overlapped_query_range()
4725 cur->bc_levels[level].ptr = 1; in xfs_btree_overlapped_query_range()
4727 while (level < cur->bc_nlevels) { in xfs_btree_overlapped_query_range()
4728 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_overlapped_query_range()
4731 if (cur->bc_levels[level].ptr > in xfs_btree_overlapped_query_range()
4734 if (level < cur->bc_nlevels - 1) in xfs_btree_overlapped_query_range()
4735 cur->bc_levels[level + 1].ptr++; in xfs_btree_overlapped_query_range()
4742 recp = xfs_btree_rec_addr(cur, cur->bc_levels[0].ptr, in xfs_btree_overlapped_query_range()
4745 cur->bc_ops->init_high_key_from_rec(&rec_hkey, recp); in xfs_btree_overlapped_query_range()
4746 ldiff = cur->bc_ops->diff_two_keys(cur, &rec_hkey, in xfs_btree_overlapped_query_range()
4749 cur->bc_ops->init_key_from_rec(&rec_key, recp); in xfs_btree_overlapped_query_range()
4750 hdiff = cur->bc_ops->diff_two_keys(cur, high_key, in xfs_btree_overlapped_query_range()
4759 error = fn(cur, recp, priv); in xfs_btree_overlapped_query_range()
4766 cur->bc_levels[level].ptr++; in xfs_btree_overlapped_query_range()
4771 lkp = xfs_btree_key_addr(cur, cur->bc_levels[level].ptr, block); in xfs_btree_overlapped_query_range()
4772 hkp = xfs_btree_high_key_addr(cur, cur->bc_levels[level].ptr, in xfs_btree_overlapped_query_range()
4774 pp = xfs_btree_ptr_addr(cur, cur->bc_levels[level].ptr, block); in xfs_btree_overlapped_query_range()
4776 ldiff = cur->bc_ops->diff_two_keys(cur, hkp, low_key); in xfs_btree_overlapped_query_range()
4777 hdiff = cur->bc_ops->diff_two_keys(cur, high_key, lkp); in xfs_btree_overlapped_query_range()
4786 error = xfs_btree_lookup_get_block(cur, level, pp, in xfs_btree_overlapped_query_range()
4790 xfs_btree_get_block(cur, level, &bp); in xfs_btree_overlapped_query_range()
4791 trace_xfs_btree_overlapped_query_range(cur, level, bp); in xfs_btree_overlapped_query_range()
4793 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_overlapped_query_range()
4797 cur->bc_levels[level].ptr = 1; in xfs_btree_overlapped_query_range()
4803 cur->bc_levels[level].ptr++; in xfs_btree_overlapped_query_range()
4814 if (cur->bc_levels[0].bp == NULL) { in xfs_btree_overlapped_query_range()
4815 for (i = 0; i < cur->bc_nlevels; i++) { in xfs_btree_overlapped_query_range()
4816 if (cur->bc_levels[i].bp) { in xfs_btree_overlapped_query_range()
4817 xfs_trans_brelse(cur->bc_tp, in xfs_btree_overlapped_query_range()
4818 cur->bc_levels[i].bp); in xfs_btree_overlapped_query_range()
4819 cur->bc_levels[i].bp = NULL; in xfs_btree_overlapped_query_range()
4820 cur->bc_levels[i].ptr = 0; in xfs_btree_overlapped_query_range()
4821 cur->bc_levels[i].ra = 0; in xfs_btree_overlapped_query_range()
4837 struct xfs_btree_cur *cur, in xfs_btree_query_range() argument
4848 cur->bc_rec = *high_rec; in xfs_btree_query_range()
4849 cur->bc_ops->init_rec_from_cur(cur, &rec); in xfs_btree_query_range()
4850 cur->bc_ops->init_key_from_rec(&high_key, &rec); in xfs_btree_query_range()
4852 cur->bc_rec = *low_rec; in xfs_btree_query_range()
4853 cur->bc_ops->init_rec_from_cur(cur, &rec); in xfs_btree_query_range()
4854 cur->bc_ops->init_key_from_rec(&low_key, &rec); in xfs_btree_query_range()
4857 if (cur->bc_ops->diff_two_keys(cur, &low_key, &high_key) > 0) in xfs_btree_query_range()
4860 if (!(cur->bc_flags & XFS_BTREE_OVERLAPPING)) in xfs_btree_query_range()
4861 return xfs_btree_simple_query_range(cur, &low_key, in xfs_btree_query_range()
4863 return xfs_btree_overlapped_query_range(cur, &low_key, &high_key, in xfs_btree_query_range()
4870 struct xfs_btree_cur *cur, in xfs_btree_query_all() argument
4877 memset(&cur->bc_rec, 0, sizeof(cur->bc_rec)); in xfs_btree_query_all()
4881 return xfs_btree_simple_query_range(cur, &low_key, &high_key, fn, priv); in xfs_btree_query_all()
4886 struct xfs_btree_cur *cur, in xfs_btree_count_blocks_helper() argument
4899 struct xfs_btree_cur *cur, in xfs_btree_count_blocks() argument
4903 return xfs_btree_visit_blocks(cur, xfs_btree_count_blocks_helper, in xfs_btree_count_blocks()
4910 struct xfs_btree_cur *cur, in xfs_btree_diff_two_ptrs() argument
4914 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_diff_two_ptrs()
4922 struct xfs_btree_cur *cur, in xfs_btree_has_record_helper() argument
4932 struct xfs_btree_cur *cur, in xfs_btree_has_record() argument
4939 error = xfs_btree_query_range(cur, low, high, in xfs_btree_has_record()
4952 struct xfs_btree_cur *cur) in xfs_btree_has_more_records() argument
4957 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_has_more_records()
4960 if (cur->bc_levels[0].ptr < xfs_btree_get_numrecs(block)) in xfs_btree_has_more_records()
4964 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_has_more_records()