Lines Matching refs:cur
51 #define xfs_btree_magic(cur) \ argument
52 xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum]
57 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_lblock() argument
65 mp = cur->bc_mp; in xfs_btree_check_lblock()
76 be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && in xfs_btree_check_lblock()
79 cur->bc_ops->get_maxrecs(cur, level) && in xfs_btree_check_lblock()
102 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_sblock() argument
113 mp = cur->bc_mp; in xfs_btree_check_sblock()
114 agbp = cur->bc_private.a.agbp; in xfs_btree_check_sblock()
127 be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && in xfs_btree_check_sblock()
130 cur->bc_ops->get_maxrecs(cur, level) && in xfs_btree_check_sblock()
154 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_block() argument
159 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_check_block()
160 return xfs_btree_check_lblock(cur, block, level, bp); in xfs_btree_check_block()
162 return xfs_btree_check_sblock(cur, block, level, bp); in xfs_btree_check_block()
170 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_lptr() argument
174 XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, in xfs_btree_check_lptr()
177 XFS_FSB_SANITY_CHECK(cur->bc_mp, bno)); in xfs_btree_check_lptr()
187 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_sptr() argument
191 xfs_agblock_t agblocks = cur->bc_mp->m_sb.sb_agblocks; in xfs_btree_check_sptr()
193 XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, in xfs_btree_check_sptr()
206 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_ptr() argument
211 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_check_ptr()
212 return xfs_btree_check_lptr(cur, in xfs_btree_check_ptr()
215 return xfs_btree_check_sptr(cur, in xfs_btree_check_ptr()
302 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_del_cursor() argument
317 for (i = 0; i < cur->bc_nlevels; i++) { in xfs_btree_del_cursor()
318 if (cur->bc_bufs[i]) in xfs_btree_del_cursor()
319 xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[i]); in xfs_btree_del_cursor()
327 ASSERT(cur->bc_btnum != XFS_BTNUM_BMAP || in xfs_btree_del_cursor()
328 cur->bc_private.b.allocated == 0); in xfs_btree_del_cursor()
332 kmem_zone_free(xfs_btree_cur_zone, cur); in xfs_btree_del_cursor()
341 xfs_btree_cur_t *cur, /* input cursor */ in xfs_btree_dup_cursor() argument
351 tp = cur->bc_tp; in xfs_btree_dup_cursor()
352 mp = cur->bc_mp; in xfs_btree_dup_cursor()
357 new = cur->bc_ops->dup_cursor(cur); in xfs_btree_dup_cursor()
362 new->bc_rec = cur->bc_rec; in xfs_btree_dup_cursor()
368 new->bc_ptrs[i] = cur->bc_ptrs[i]; in xfs_btree_dup_cursor()
369 new->bc_ra[i] = cur->bc_ra[i]; in xfs_btree_dup_cursor()
370 bp = cur->bc_bufs[i]; in xfs_btree_dup_cursor()
375 cur->bc_ops->buf_ops); in xfs_btree_dup_cursor()
421 static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) in xfs_btree_block_len() argument
423 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_block_len()
424 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) in xfs_btree_block_len()
428 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) in xfs_btree_block_len()
436 static inline size_t xfs_btree_ptr_len(struct xfs_btree_cur *cur) in xfs_btree_ptr_len() argument
438 return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? in xfs_btree_ptr_len()
447 struct xfs_btree_cur *cur, in xfs_btree_rec_offset() argument
450 return xfs_btree_block_len(cur) + in xfs_btree_rec_offset()
451 (n - 1) * cur->bc_ops->rec_len; in xfs_btree_rec_offset()
459 struct xfs_btree_cur *cur, in xfs_btree_key_offset() argument
462 return xfs_btree_block_len(cur) + in xfs_btree_key_offset()
463 (n - 1) * cur->bc_ops->key_len; in xfs_btree_key_offset()
471 struct xfs_btree_cur *cur, in xfs_btree_ptr_offset() argument
475 return xfs_btree_block_len(cur) + in xfs_btree_ptr_offset()
476 cur->bc_ops->get_maxrecs(cur, level) * cur->bc_ops->key_len + in xfs_btree_ptr_offset()
477 (n - 1) * xfs_btree_ptr_len(cur); in xfs_btree_ptr_offset()
485 struct xfs_btree_cur *cur, in xfs_btree_rec_addr() argument
490 ((char *)block + xfs_btree_rec_offset(cur, n)); in xfs_btree_rec_addr()
498 struct xfs_btree_cur *cur, in xfs_btree_key_addr() argument
503 ((char *)block + xfs_btree_key_offset(cur, n)); in xfs_btree_key_addr()
511 struct xfs_btree_cur *cur, in xfs_btree_ptr_addr() argument
520 ((char *)block + xfs_btree_ptr_offset(cur, n, level)); in xfs_btree_ptr_addr()
531 struct xfs_btree_cur *cur) in xfs_btree_get_iroot() argument
535 ifp = XFS_IFORK_PTR(cur->bc_private.b.ip, cur->bc_private.b.whichfork); in xfs_btree_get_iroot()
545 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_get_block() argument
549 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_get_block()
550 (level == cur->bc_nlevels - 1)) { in xfs_btree_get_block()
552 return xfs_btree_get_iroot(cur); in xfs_btree_get_block()
555 *bpp = cur->bc_bufs[level]; in xfs_btree_get_block()
602 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_islastblock() argument
608 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_islastblock()
609 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_islastblock()
610 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_islastblock()
622 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_firstrec() argument
631 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_firstrec()
632 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_firstrec()
641 cur->bc_ptrs[level] = 1; in xfs_btree_firstrec()
651 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_lastrec() argument
660 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_lastrec()
661 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_lastrec()
670 cur->bc_ptrs[level] = be16_to_cpu(block->bb_numrecs); in xfs_btree_lastrec()
782 struct xfs_btree_cur *cur, in xfs_btree_readahead_lblock() argument
791 xfs_btree_reada_bufl(cur->bc_mp, left, 1, in xfs_btree_readahead_lblock()
792 cur->bc_ops->buf_ops); in xfs_btree_readahead_lblock()
797 xfs_btree_reada_bufl(cur->bc_mp, right, 1, in xfs_btree_readahead_lblock()
798 cur->bc_ops->buf_ops); in xfs_btree_readahead_lblock()
807 struct xfs_btree_cur *cur, in xfs_btree_readahead_sblock() argument
817 xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno, in xfs_btree_readahead_sblock()
818 left, 1, cur->bc_ops->buf_ops); in xfs_btree_readahead_sblock()
823 xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno, in xfs_btree_readahead_sblock()
824 right, 1, cur->bc_ops->buf_ops); in xfs_btree_readahead_sblock()
837 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_readahead() argument
847 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_readahead()
848 (lev == cur->bc_nlevels - 1)) in xfs_btree_readahead()
851 if ((cur->bc_ra[lev] | lr) == cur->bc_ra[lev]) in xfs_btree_readahead()
854 cur->bc_ra[lev] |= lr; in xfs_btree_readahead()
855 block = XFS_BUF_TO_BLOCK(cur->bc_bufs[lev]); in xfs_btree_readahead()
857 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_readahead()
858 return xfs_btree_readahead_lblock(cur, lr, block); in xfs_btree_readahead()
859 return xfs_btree_readahead_sblock(cur, lr, block); in xfs_btree_readahead()
864 struct xfs_btree_cur *cur, in xfs_btree_ptr_to_daddr() argument
867 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_ptr_to_daddr()
870 return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); in xfs_btree_ptr_to_daddr()
872 ASSERT(cur->bc_private.a.agno != NULLAGNUMBER); in xfs_btree_ptr_to_daddr()
875 return XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_private.a.agno, in xfs_btree_ptr_to_daddr()
888 struct xfs_btree_cur *cur, in xfs_btree_readahead_ptr() argument
892 xfs_buf_readahead(cur->bc_mp->m_ddev_targp, in xfs_btree_readahead_ptr()
893 xfs_btree_ptr_to_daddr(cur, ptr), in xfs_btree_readahead_ptr()
894 cur->bc_mp->m_bsize * count, cur->bc_ops->buf_ops); in xfs_btree_readahead_ptr()
903 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_setbuf() argument
909 if (cur->bc_bufs[lev]) in xfs_btree_setbuf()
910 xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[lev]); in xfs_btree_setbuf()
911 cur->bc_bufs[lev] = bp; in xfs_btree_setbuf()
912 cur->bc_ra[lev] = 0; in xfs_btree_setbuf()
915 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_setbuf()
917 cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA; in xfs_btree_setbuf()
919 cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA; in xfs_btree_setbuf()
922 cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA; in xfs_btree_setbuf()
924 cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA; in xfs_btree_setbuf()
930 struct xfs_btree_cur *cur, in xfs_btree_ptr_is_null() argument
933 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_ptr_is_null()
941 struct xfs_btree_cur *cur, in xfs_btree_set_ptr_null() argument
944 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_set_ptr_null()
955 struct xfs_btree_cur *cur, in xfs_btree_get_sibling() argument
962 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_get_sibling()
977 struct xfs_btree_cur *cur, in xfs_btree_set_sibling() argument
984 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_set_sibling()
1053 struct xfs_btree_cur *cur, in xfs_btree_init_block_cur() argument
1066 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_init_block_cur()
1067 owner = cur->bc_private.b.ip->i_ino; in xfs_btree_init_block_cur()
1069 owner = cur->bc_private.a.agno; in xfs_btree_init_block_cur()
1071 xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, in xfs_btree_init_block_cur()
1072 xfs_btree_magic(cur), level, numrecs, in xfs_btree_init_block_cur()
1073 owner, cur->bc_flags); in xfs_btree_init_block_cur()
1083 struct xfs_btree_cur *cur, in xfs_btree_is_lastrec() argument
1091 if (!(cur->bc_flags & XFS_BTREE_LASTREC_UPDATE)) in xfs_btree_is_lastrec()
1094 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_is_lastrec()
1095 if (!xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_is_lastrec()
1102 struct xfs_btree_cur *cur, in xfs_btree_buf_to_ptr() argument
1106 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_buf_to_ptr()
1107 ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp, in xfs_btree_buf_to_ptr()
1110 ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp, in xfs_btree_buf_to_ptr()
1117 struct xfs_btree_cur *cur, in xfs_btree_set_refs() argument
1120 switch (cur->bc_btnum) { in xfs_btree_set_refs()
1139 struct xfs_btree_cur *cur, in xfs_btree_get_buf_block() argument
1145 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_get_buf_block()
1151 d = xfs_btree_ptr_to_daddr(cur, ptr); in xfs_btree_get_buf_block()
1152 *bpp = xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, in xfs_btree_get_buf_block()
1158 (*bpp)->b_ops = cur->bc_ops->buf_ops; in xfs_btree_get_buf_block()
1169 struct xfs_btree_cur *cur, in xfs_btree_read_buf_block() argument
1175 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_read_buf_block()
1182 d = xfs_btree_ptr_to_daddr(cur, ptr); in xfs_btree_read_buf_block()
1183 error = xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d, in xfs_btree_read_buf_block()
1185 cur->bc_ops->buf_ops); in xfs_btree_read_buf_block()
1189 xfs_btree_set_refs(cur, *bpp); in xfs_btree_read_buf_block()
1199 struct xfs_btree_cur *cur, in xfs_btree_copy_keys() argument
1205 memcpy(dst_key, src_key, numkeys * cur->bc_ops->key_len); in xfs_btree_copy_keys()
1213 struct xfs_btree_cur *cur, in xfs_btree_copy_recs() argument
1219 memcpy(dst_rec, src_rec, numrecs * cur->bc_ops->rec_len); in xfs_btree_copy_recs()
1227 struct xfs_btree_cur *cur, in xfs_btree_copy_ptrs() argument
1233 memcpy(dst_ptr, src_ptr, numptrs * xfs_btree_ptr_len(cur)); in xfs_btree_copy_ptrs()
1241 struct xfs_btree_cur *cur, in xfs_btree_shift_keys() argument
1251 dst_key = (char *)key + (dir * cur->bc_ops->key_len); in xfs_btree_shift_keys()
1252 memmove(dst_key, key, numkeys * cur->bc_ops->key_len); in xfs_btree_shift_keys()
1260 struct xfs_btree_cur *cur, in xfs_btree_shift_recs() argument
1270 dst_rec = (char *)rec + (dir * cur->bc_ops->rec_len); in xfs_btree_shift_recs()
1271 memmove(dst_rec, rec, numrecs * cur->bc_ops->rec_len); in xfs_btree_shift_recs()
1279 struct xfs_btree_cur *cur, in xfs_btree_shift_ptrs() argument
1289 dst_ptr = (char *)ptr + (dir * xfs_btree_ptr_len(cur)); in xfs_btree_shift_ptrs()
1290 memmove(dst_ptr, ptr, numptrs * xfs_btree_ptr_len(cur)); in xfs_btree_shift_ptrs()
1298 struct xfs_btree_cur *cur, in xfs_btree_log_keys() argument
1303 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_log_keys()
1304 XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); in xfs_btree_log_keys()
1307 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_keys()
1308 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_keys()
1309 xfs_btree_key_offset(cur, first), in xfs_btree_log_keys()
1310 xfs_btree_key_offset(cur, last + 1) - 1); in xfs_btree_log_keys()
1312 xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, in xfs_btree_log_keys()
1313 xfs_ilog_fbroot(cur->bc_private.b.whichfork)); in xfs_btree_log_keys()
1316 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_log_keys()
1324 struct xfs_btree_cur *cur, in xfs_btree_log_recs() argument
1329 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_log_recs()
1330 XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); in xfs_btree_log_recs()
1332 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_recs()
1333 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_recs()
1334 xfs_btree_rec_offset(cur, first), in xfs_btree_log_recs()
1335 xfs_btree_rec_offset(cur, last + 1) - 1); in xfs_btree_log_recs()
1337 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_log_recs()
1345 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_log_ptrs() argument
1350 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_log_ptrs()
1351 XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); in xfs_btree_log_ptrs()
1357 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_ptrs()
1358 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_ptrs()
1359 xfs_btree_ptr_offset(cur, first, level), in xfs_btree_log_ptrs()
1360 xfs_btree_ptr_offset(cur, last + 1, level) - 1); in xfs_btree_log_ptrs()
1362 xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, in xfs_btree_log_ptrs()
1363 xfs_ilog_fbroot(cur->bc_private.b.whichfork)); in xfs_btree_log_ptrs()
1366 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_log_ptrs()
1374 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_log_block() argument
1408 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_log_block()
1409 XFS_BTREE_TRACE_ARGBI(cur, bp, fields); in xfs_btree_log_block()
1414 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { in xfs_btree_log_block()
1429 (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? in xfs_btree_log_block()
1432 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_block()
1433 xfs_trans_log_buf(cur->bc_tp, bp, first, last); in xfs_btree_log_block()
1435 xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, in xfs_btree_log_block()
1436 xfs_ilog_fbroot(cur->bc_private.b.whichfork)); in xfs_btree_log_block()
1439 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_log_block()
1448 struct xfs_btree_cur *cur, in xfs_btree_increment() argument
1458 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_increment()
1459 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_increment()
1461 ASSERT(level < cur->bc_nlevels); in xfs_btree_increment()
1464 xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); in xfs_btree_increment()
1467 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_increment()
1470 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_increment()
1476 if (++cur->bc_ptrs[level] <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1480 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_increment()
1481 if (xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_increment()
1484 XFS_BTREE_STATS_INC(cur, increment); in xfs_btree_increment()
1490 for (lev = level + 1; lev < cur->bc_nlevels; lev++) { in xfs_btree_increment()
1491 block = xfs_btree_get_block(cur, lev, &bp); in xfs_btree_increment()
1494 error = xfs_btree_check_block(cur, block, lev, bp); in xfs_btree_increment()
1499 if (++cur->bc_ptrs[lev] <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1503 xfs_btree_readahead(cur, lev, XFS_BTCUR_RIGHTRA); in xfs_btree_increment()
1510 if (lev == cur->bc_nlevels) { in xfs_btree_increment()
1511 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) in xfs_btree_increment()
1517 ASSERT(lev < cur->bc_nlevels); in xfs_btree_increment()
1523 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_increment()
1526 ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); in xfs_btree_increment()
1528 error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); in xfs_btree_increment()
1532 xfs_btree_setbuf(cur, lev, bp); in xfs_btree_increment()
1533 cur->bc_ptrs[lev] = 1; in xfs_btree_increment()
1536 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_increment()
1541 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_increment()
1546 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_increment()
1556 struct xfs_btree_cur *cur, in xfs_btree_decrement() argument
1566 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_decrement()
1567 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_decrement()
1569 ASSERT(level < cur->bc_nlevels); in xfs_btree_decrement()
1572 xfs_btree_readahead(cur, level, XFS_BTCUR_LEFTRA); in xfs_btree_decrement()
1575 if (--cur->bc_ptrs[level] > 0) in xfs_btree_decrement()
1579 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_decrement()
1582 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_decrement()
1588 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_decrement()
1589 if (xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_decrement()
1592 XFS_BTREE_STATS_INC(cur, decrement); in xfs_btree_decrement()
1598 for (lev = level + 1; lev < cur->bc_nlevels; lev++) { in xfs_btree_decrement()
1599 if (--cur->bc_ptrs[lev] > 0) in xfs_btree_decrement()
1602 xfs_btree_readahead(cur, lev, XFS_BTCUR_LEFTRA); in xfs_btree_decrement()
1609 if (lev == cur->bc_nlevels) { in xfs_btree_decrement()
1610 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) in xfs_btree_decrement()
1616 ASSERT(lev < cur->bc_nlevels); in xfs_btree_decrement()
1622 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_decrement()
1625 ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); in xfs_btree_decrement()
1627 error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); in xfs_btree_decrement()
1630 xfs_btree_setbuf(cur, lev, bp); in xfs_btree_decrement()
1631 cur->bc_ptrs[lev] = xfs_btree_get_numrecs(block); in xfs_btree_decrement()
1634 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_decrement()
1639 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_decrement()
1644 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_decrement()
1650 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lookup_get_block() argument
1659 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_lookup_get_block()
1660 (level == cur->bc_nlevels - 1)) { in xfs_btree_lookup_get_block()
1661 *blkp = xfs_btree_get_iroot(cur); in xfs_btree_lookup_get_block()
1671 bp = cur->bc_bufs[level]; in xfs_btree_lookup_get_block()
1672 if (bp && XFS_BUF_ADDR(bp) == xfs_btree_ptr_to_daddr(cur, pp)) { in xfs_btree_lookup_get_block()
1677 error = xfs_btree_read_buf_block(cur, pp, 0, blkp, &bp); in xfs_btree_lookup_get_block()
1681 xfs_btree_setbuf(cur, level, bp); in xfs_btree_lookup_get_block()
1692 struct xfs_btree_cur *cur, in xfs_lookup_get_search_key() argument
1699 cur->bc_ops->init_key_from_rec(kp, in xfs_lookup_get_search_key()
1700 xfs_btree_rec_addr(cur, keyno, block)); in xfs_lookup_get_search_key()
1704 return xfs_btree_key_addr(cur, keyno, block); in xfs_lookup_get_search_key()
1713 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lookup() argument
1725 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_lookup()
1726 XFS_BTREE_TRACE_ARGI(cur, dir); in xfs_btree_lookup()
1728 XFS_BTREE_STATS_INC(cur, lookup); in xfs_btree_lookup()
1734 cur->bc_ops->init_ptr_from_cur(cur, &ptr); in xfs_btree_lookup()
1743 for (level = cur->bc_nlevels - 1, diff = 1; level >= 0; level--) { in xfs_btree_lookup()
1745 error = xfs_btree_lookup_get_block(cur, level, pp, &block); in xfs_btree_lookup()
1766 ASSERT(level == 0 && cur->bc_nlevels == 1); in xfs_btree_lookup()
1768 cur->bc_ptrs[0] = dir != XFS_LOOKUP_LE; in xfs_btree_lookup()
1769 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lookup()
1779 XFS_BTREE_STATS_INC(cur, compare); in xfs_btree_lookup()
1785 kp = xfs_lookup_get_search_key(cur, level, in xfs_btree_lookup()
1794 diff = cur->bc_ops->key_diff(cur, kp); in xfs_btree_lookup()
1815 pp = xfs_btree_ptr_addr(cur, keyno, block); in xfs_btree_lookup()
1818 error = xfs_btree_check_ptr(cur, pp, 0, level); in xfs_btree_lookup()
1822 cur->bc_ptrs[level] = keyno; in xfs_btree_lookup()
1833 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_lookup()
1836 !xfs_btree_ptr_is_null(cur, &ptr)) { in xfs_btree_lookup()
1839 cur->bc_ptrs[0] = keyno; in xfs_btree_lookup()
1840 error = xfs_btree_increment(cur, 0, &i); in xfs_btree_lookup()
1843 XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); in xfs_btree_lookup()
1844 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lookup()
1850 cur->bc_ptrs[0] = keyno; in xfs_btree_lookup()
1859 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lookup()
1863 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_lookup()
1872 struct xfs_btree_cur *cur, in xfs_btree_updkey() argument
1881 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_updkey()
1882 XFS_BTREE_TRACE_ARGIK(cur, level, keyp); in xfs_btree_updkey()
1884 ASSERT(!(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) || level >= 1); in xfs_btree_updkey()
1892 for (ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { in xfs_btree_updkey()
1896 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_updkey()
1898 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_updkey()
1900 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_updkey()
1904 ptr = cur->bc_ptrs[level]; in xfs_btree_updkey()
1905 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_updkey()
1906 xfs_btree_copy_keys(cur, kp, keyp, 1); in xfs_btree_updkey()
1907 xfs_btree_log_keys(cur, bp, ptr, ptr); in xfs_btree_updkey()
1910 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_updkey()
1921 struct xfs_btree_cur *cur, in xfs_btree_update() argument
1930 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_update()
1931 XFS_BTREE_TRACE_ARGR(cur, rec); in xfs_btree_update()
1934 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_update()
1937 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_update()
1942 ptr = cur->bc_ptrs[0]; in xfs_btree_update()
1943 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_update()
1946 xfs_btree_copy_recs(cur, rp, rec, 1); in xfs_btree_update()
1947 xfs_btree_log_recs(cur, bp, ptr, ptr); in xfs_btree_update()
1953 if (xfs_btree_is_lastrec(cur, block, 0)) { in xfs_btree_update()
1954 cur->bc_ops->update_lastrec(cur, block, rec, in xfs_btree_update()
1962 cur->bc_ops->init_key_from_rec(&key, rec); in xfs_btree_update()
1963 error = xfs_btree_updkey(cur, &key, 1); in xfs_btree_update()
1968 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_update()
1972 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_update()
1982 struct xfs_btree_cur *cur, in xfs_btree_lshift() argument
1999 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_lshift()
2000 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_lshift()
2002 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_lshift()
2003 level == cur->bc_nlevels - 1) in xfs_btree_lshift()
2007 right = xfs_btree_get_block(cur, level, &rbp); in xfs_btree_lshift()
2010 error = xfs_btree_check_block(cur, right, level, rbp); in xfs_btree_lshift()
2016 xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in xfs_btree_lshift()
2017 if (xfs_btree_ptr_is_null(cur, &lptr)) in xfs_btree_lshift()
2024 if (cur->bc_ptrs[level] <= 1) in xfs_btree_lshift()
2028 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_lshift()
2034 if (lrecs == cur->bc_ops->get_maxrecs(cur, level)) in xfs_btree_lshift()
2047 XFS_BTREE_STATS_INC(cur, lshift); in xfs_btree_lshift()
2048 XFS_BTREE_STATS_ADD(cur, moves, 1); in xfs_btree_lshift()
2059 lkp = xfs_btree_key_addr(cur, lrecs, left); in xfs_btree_lshift()
2060 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_lshift()
2062 lpp = xfs_btree_ptr_addr(cur, lrecs, left); in xfs_btree_lshift()
2063 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_lshift()
2065 error = xfs_btree_check_ptr(cur, rpp, 0, level); in xfs_btree_lshift()
2069 xfs_btree_copy_keys(cur, lkp, rkp, 1); in xfs_btree_lshift()
2070 xfs_btree_copy_ptrs(cur, lpp, rpp, 1); in xfs_btree_lshift()
2072 xfs_btree_log_keys(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2073 xfs_btree_log_ptrs(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2075 ASSERT(cur->bc_ops->keys_inorder(cur, in xfs_btree_lshift()
2076 xfs_btree_key_addr(cur, lrecs - 1, left), lkp)); in xfs_btree_lshift()
2081 lrp = xfs_btree_rec_addr(cur, lrecs, left); in xfs_btree_lshift()
2082 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_lshift()
2084 xfs_btree_copy_recs(cur, lrp, rrp, 1); in xfs_btree_lshift()
2085 xfs_btree_log_recs(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2087 ASSERT(cur->bc_ops->recs_inorder(cur, in xfs_btree_lshift()
2088 xfs_btree_rec_addr(cur, lrecs - 1, left), lrp)); in xfs_btree_lshift()
2092 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS); in xfs_btree_lshift()
2095 xfs_btree_log_block(cur, rbp, XFS_BB_NUMRECS); in xfs_btree_lshift()
2100 XFS_BTREE_STATS_ADD(cur, moves, rrecs - 1); in xfs_btree_lshift()
2107 error = xfs_btree_check_ptr(cur, rpp, i + 1, level); in xfs_btree_lshift()
2112 xfs_btree_shift_keys(cur, in xfs_btree_lshift()
2113 xfs_btree_key_addr(cur, 2, right), in xfs_btree_lshift()
2115 xfs_btree_shift_ptrs(cur, in xfs_btree_lshift()
2116 xfs_btree_ptr_addr(cur, 2, right), in xfs_btree_lshift()
2119 xfs_btree_log_keys(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2120 xfs_btree_log_ptrs(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2123 xfs_btree_shift_recs(cur, in xfs_btree_lshift()
2124 xfs_btree_rec_addr(cur, 2, right), in xfs_btree_lshift()
2126 xfs_btree_log_recs(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2132 cur->bc_ops->init_key_from_rec(&key, in xfs_btree_lshift()
2133 xfs_btree_rec_addr(cur, 1, right)); in xfs_btree_lshift()
2138 error = xfs_btree_updkey(cur, rkp, level + 1); in xfs_btree_lshift()
2143 cur->bc_ptrs[level]--; in xfs_btree_lshift()
2145 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lshift()
2150 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lshift()
2155 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_lshift()
2165 struct xfs_btree_cur *cur, in xfs_btree_rshift() argument
2182 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_rshift()
2183 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_rshift()
2185 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_rshift()
2186 (level == cur->bc_nlevels - 1)) in xfs_btree_rshift()
2190 left = xfs_btree_get_block(cur, level, &lbp); in xfs_btree_rshift()
2193 error = xfs_btree_check_block(cur, left, level, lbp); in xfs_btree_rshift()
2199 xfs_btree_get_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_rshift()
2200 if (xfs_btree_ptr_is_null(cur, &rptr)) in xfs_btree_rshift()
2208 if (cur->bc_ptrs[level] >= lrecs) in xfs_btree_rshift()
2212 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_rshift()
2218 if (rrecs == cur->bc_ops->get_maxrecs(cur, level)) in xfs_btree_rshift()
2221 XFS_BTREE_STATS_INC(cur, rshift); in xfs_btree_rshift()
2222 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in xfs_btree_rshift()
2234 lkp = xfs_btree_key_addr(cur, lrecs, left); in xfs_btree_rshift()
2235 lpp = xfs_btree_ptr_addr(cur, lrecs, left); in xfs_btree_rshift()
2236 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_rshift()
2237 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_rshift()
2241 error = xfs_btree_check_ptr(cur, rpp, i, level); in xfs_btree_rshift()
2247 xfs_btree_shift_keys(cur, rkp, 1, rrecs); in xfs_btree_rshift()
2248 xfs_btree_shift_ptrs(cur, rpp, 1, rrecs); in xfs_btree_rshift()
2251 error = xfs_btree_check_ptr(cur, lpp, 0, level); in xfs_btree_rshift()
2257 xfs_btree_copy_keys(cur, rkp, lkp, 1); in xfs_btree_rshift()
2258 xfs_btree_copy_ptrs(cur, rpp, lpp, 1); in xfs_btree_rshift()
2260 xfs_btree_log_keys(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2261 xfs_btree_log_ptrs(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2263 ASSERT(cur->bc_ops->keys_inorder(cur, rkp, in xfs_btree_rshift()
2264 xfs_btree_key_addr(cur, 2, right))); in xfs_btree_rshift()
2270 lrp = xfs_btree_rec_addr(cur, lrecs, left); in xfs_btree_rshift()
2271 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_rshift()
2273 xfs_btree_shift_recs(cur, rrp, 1, rrecs); in xfs_btree_rshift()
2276 xfs_btree_copy_recs(cur, rrp, lrp, 1); in xfs_btree_rshift()
2277 xfs_btree_log_recs(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2279 cur->bc_ops->init_key_from_rec(&key, rrp); in xfs_btree_rshift()
2282 ASSERT(cur->bc_ops->recs_inorder(cur, rrp, in xfs_btree_rshift()
2283 xfs_btree_rec_addr(cur, 2, right))); in xfs_btree_rshift()
2290 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS); in xfs_btree_rshift()
2293 xfs_btree_log_block(cur, rbp, XFS_BB_NUMRECS); in xfs_btree_rshift()
2299 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_rshift()
2303 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_rshift()
2315 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_rshift()
2320 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_rshift()
2325 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_rshift()
2341 struct xfs_btree_cur *cur, in __xfs_btree_split() argument
2365 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in __xfs_btree_split()
2366 XFS_BTREE_TRACE_ARGIPK(cur, level, *ptrp, key); in __xfs_btree_split()
2368 XFS_BTREE_STATS_INC(cur, split); in __xfs_btree_split()
2371 left = xfs_btree_get_block(cur, level, &lbp); in __xfs_btree_split()
2374 error = xfs_btree_check_block(cur, left, level, lbp); in __xfs_btree_split()
2379 xfs_btree_buf_to_ptr(cur, lbp, &lptr); in __xfs_btree_split()
2382 error = cur->bc_ops->alloc_block(cur, &lptr, &rptr, stat); in __xfs_btree_split()
2387 XFS_BTREE_STATS_INC(cur, alloc); in __xfs_btree_split()
2390 error = xfs_btree_get_buf_block(cur, &rptr, 0, &right, &rbp); in __xfs_btree_split()
2395 xfs_btree_init_block_cur(cur, rbp, xfs_btree_get_level(left), 0); in __xfs_btree_split()
2404 if ((lrecs & 1) && cur->bc_ptrs[level] <= rrecs + 1) in __xfs_btree_split()
2408 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in __xfs_btree_split()
2422 lkp = xfs_btree_key_addr(cur, src_index, left); in __xfs_btree_split()
2423 lpp = xfs_btree_ptr_addr(cur, src_index, left); in __xfs_btree_split()
2424 rkp = xfs_btree_key_addr(cur, 1, right); in __xfs_btree_split()
2425 rpp = xfs_btree_ptr_addr(cur, 1, right); in __xfs_btree_split()
2429 error = xfs_btree_check_ptr(cur, lpp, i, level); in __xfs_btree_split()
2435 xfs_btree_copy_keys(cur, rkp, lkp, rrecs); in __xfs_btree_split()
2436 xfs_btree_copy_ptrs(cur, rpp, lpp, rrecs); in __xfs_btree_split()
2438 xfs_btree_log_keys(cur, rbp, 1, rrecs); in __xfs_btree_split()
2439 xfs_btree_log_ptrs(cur, rbp, 1, rrecs); in __xfs_btree_split()
2442 xfs_btree_copy_keys(cur, key, rkp, 1); in __xfs_btree_split()
2448 lrp = xfs_btree_rec_addr(cur, src_index, left); in __xfs_btree_split()
2449 rrp = xfs_btree_rec_addr(cur, 1, right); in __xfs_btree_split()
2451 xfs_btree_copy_recs(cur, rrp, lrp, rrecs); in __xfs_btree_split()
2452 xfs_btree_log_recs(cur, rbp, 1, rrecs); in __xfs_btree_split()
2454 cur->bc_ops->init_key_from_rec(key, in __xfs_btree_split()
2455 xfs_btree_rec_addr(cur, 1, right)); in __xfs_btree_split()
2463 xfs_btree_get_sibling(cur, left, &rrptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2464 xfs_btree_set_sibling(cur, right, &rrptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2465 xfs_btree_set_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in __xfs_btree_split()
2466 xfs_btree_set_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2472 xfs_btree_log_block(cur, rbp, XFS_BB_ALL_BITS); in __xfs_btree_split()
2473 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); in __xfs_btree_split()
2479 if (!xfs_btree_ptr_is_null(cur, &rrptr)) { in __xfs_btree_split()
2480 error = xfs_btree_read_buf_block(cur, &rrptr, in __xfs_btree_split()
2484 xfs_btree_set_sibling(cur, rrblock, &rptr, XFS_BB_LEFTSIB); in __xfs_btree_split()
2485 xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); in __xfs_btree_split()
2492 if (cur->bc_ptrs[level] > lrecs + 1) { in __xfs_btree_split()
2493 xfs_btree_setbuf(cur, level, rbp); in __xfs_btree_split()
2494 cur->bc_ptrs[level] -= lrecs; in __xfs_btree_split()
2500 if (level + 1 < cur->bc_nlevels) { in __xfs_btree_split()
2501 error = xfs_btree_dup_cursor(cur, curp); in __xfs_btree_split()
2507 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in __xfs_btree_split()
2511 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in __xfs_btree_split()
2516 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in __xfs_btree_split()
2521 struct xfs_btree_cur *cur; member
2556 args->result = __xfs_btree_split(args->cur, args->level, args->ptrp, in xfs_btree_split_worker()
2570 struct xfs_btree_cur *cur, in xfs_btree_split() argument
2580 if (cur->bc_btnum != XFS_BTNUM_BMAP) in xfs_btree_split()
2581 return __xfs_btree_split(cur, level, ptrp, key, curp, stat); in xfs_btree_split()
2583 args.cur = cur; in xfs_btree_split()
2605 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_new_iroot() argument
2623 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_new_iroot()
2624 XFS_BTREE_STATS_INC(cur, newroot); in xfs_btree_new_iroot()
2626 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_new_iroot()
2628 level = cur->bc_nlevels - 1; in xfs_btree_new_iroot()
2630 block = xfs_btree_get_iroot(cur); in xfs_btree_new_iroot()
2631 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_new_iroot()
2634 error = cur->bc_ops->alloc_block(cur, pp, &nptr, stat); in xfs_btree_new_iroot()
2638 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_new_iroot()
2641 XFS_BTREE_STATS_INC(cur, alloc); in xfs_btree_new_iroot()
2644 error = xfs_btree_get_buf_block(cur, &nptr, 0, &cblock, &cbp); in xfs_btree_new_iroot()
2652 memcpy(cblock, block, xfs_btree_block_len(cur)); in xfs_btree_new_iroot()
2653 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { in xfs_btree_new_iroot()
2654 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_new_iroot()
2662 cur->bc_nlevels++; in xfs_btree_new_iroot()
2663 cur->bc_ptrs[level + 1] = 1; in xfs_btree_new_iroot()
2665 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_new_iroot()
2666 ckp = xfs_btree_key_addr(cur, 1, cblock); in xfs_btree_new_iroot()
2667 xfs_btree_copy_keys(cur, ckp, kp, xfs_btree_get_numrecs(cblock)); in xfs_btree_new_iroot()
2669 cpp = xfs_btree_ptr_addr(cur, 1, cblock); in xfs_btree_new_iroot()
2672 error = xfs_btree_check_ptr(cur, pp, i, level); in xfs_btree_new_iroot()
2677 xfs_btree_copy_ptrs(cur, cpp, pp, xfs_btree_get_numrecs(cblock)); in xfs_btree_new_iroot()
2680 error = xfs_btree_check_ptr(cur, &nptr, 0, level); in xfs_btree_new_iroot()
2684 xfs_btree_copy_ptrs(cur, pp, &nptr, 1); in xfs_btree_new_iroot()
2686 xfs_iroot_realloc(cur->bc_private.b.ip, in xfs_btree_new_iroot()
2688 cur->bc_private.b.whichfork); in xfs_btree_new_iroot()
2690 xfs_btree_setbuf(cur, level, cbp); in xfs_btree_new_iroot()
2696 xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); in xfs_btree_new_iroot()
2697 xfs_btree_log_keys(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); in xfs_btree_new_iroot()
2698 xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); in xfs_btree_new_iroot()
2701 XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork); in xfs_btree_new_iroot()
2703 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_new_iroot()
2706 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_new_iroot()
2715 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_new_root() argument
2731 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_new_root()
2732 XFS_BTREE_STATS_INC(cur, newroot); in xfs_btree_new_root()
2735 cur->bc_ops->init_ptr_from_cur(cur, &rptr); in xfs_btree_new_root()
2738 error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, stat); in xfs_btree_new_root()
2743 XFS_BTREE_STATS_INC(cur, alloc); in xfs_btree_new_root()
2746 error = xfs_btree_get_buf_block(cur, &lptr, 0, &new, &nbp); in xfs_btree_new_root()
2751 cur->bc_ops->set_root(cur, &lptr, 1); in xfs_btree_new_root()
2759 block = xfs_btree_get_block(cur, cur->bc_nlevels - 1, &bp); in xfs_btree_new_root()
2762 error = xfs_btree_check_block(cur, block, cur->bc_nlevels - 1, bp); in xfs_btree_new_root()
2767 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_new_root()
2768 if (!xfs_btree_ptr_is_null(cur, &rptr)) { in xfs_btree_new_root()
2771 xfs_btree_buf_to_ptr(cur, lbp, &lptr); in xfs_btree_new_root()
2773 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_new_root()
2781 xfs_btree_buf_to_ptr(cur, rbp, &rptr); in xfs_btree_new_root()
2783 xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in xfs_btree_new_root()
2784 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_new_root()
2791 xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); in xfs_btree_new_root()
2792 xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); in xfs_btree_new_root()
2793 ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_new_root()
2794 !xfs_btree_ptr_is_null(cur, &rptr)); in xfs_btree_new_root()
2798 xfs_btree_copy_keys(cur, in xfs_btree_new_root()
2799 xfs_btree_key_addr(cur, 1, new), in xfs_btree_new_root()
2800 xfs_btree_key_addr(cur, 1, left), 1); in xfs_btree_new_root()
2801 xfs_btree_copy_keys(cur, in xfs_btree_new_root()
2802 xfs_btree_key_addr(cur, 2, new), in xfs_btree_new_root()
2803 xfs_btree_key_addr(cur, 1, right), 1); in xfs_btree_new_root()
2805 cur->bc_ops->init_key_from_rec( in xfs_btree_new_root()
2806 xfs_btree_key_addr(cur, 1, new), in xfs_btree_new_root()
2807 xfs_btree_rec_addr(cur, 1, left)); in xfs_btree_new_root()
2808 cur->bc_ops->init_key_from_rec( in xfs_btree_new_root()
2809 xfs_btree_key_addr(cur, 2, new), in xfs_btree_new_root()
2810 xfs_btree_rec_addr(cur, 1, right)); in xfs_btree_new_root()
2812 xfs_btree_log_keys(cur, nbp, 1, 2); in xfs_btree_new_root()
2815 xfs_btree_copy_ptrs(cur, in xfs_btree_new_root()
2816 xfs_btree_ptr_addr(cur, 1, new), &lptr, 1); in xfs_btree_new_root()
2817 xfs_btree_copy_ptrs(cur, in xfs_btree_new_root()
2818 xfs_btree_ptr_addr(cur, 2, new), &rptr, 1); in xfs_btree_new_root()
2819 xfs_btree_log_ptrs(cur, nbp, 1, 2); in xfs_btree_new_root()
2822 xfs_btree_setbuf(cur, cur->bc_nlevels, nbp); in xfs_btree_new_root()
2823 cur->bc_ptrs[cur->bc_nlevels] = nptr; in xfs_btree_new_root()
2824 cur->bc_nlevels++; in xfs_btree_new_root()
2825 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_new_root()
2829 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_new_root()
2832 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_new_root()
2839 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_make_block_unfull() argument
2852 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_make_block_unfull()
2853 level == cur->bc_nlevels - 1) { in xfs_btree_make_block_unfull()
2854 struct xfs_inode *ip = cur->bc_private.b.ip; in xfs_btree_make_block_unfull()
2856 if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) { in xfs_btree_make_block_unfull()
2858 xfs_iroot_realloc(ip, 1, cur->bc_private.b.whichfork); in xfs_btree_make_block_unfull()
2863 error = xfs_btree_new_iroot(cur, &logflags, stat); in xfs_btree_make_block_unfull()
2867 xfs_trans_log_inode(cur->bc_tp, ip, logflags); in xfs_btree_make_block_unfull()
2874 error = xfs_btree_rshift(cur, level, stat); in xfs_btree_make_block_unfull()
2879 error = xfs_btree_lshift(cur, level, stat); in xfs_btree_make_block_unfull()
2884 *oindex = *index = cur->bc_ptrs[level]; in xfs_btree_make_block_unfull()
2894 error = xfs_btree_split(cur, level, nptr, &key, ncur, stat); in xfs_btree_make_block_unfull()
2899 *index = cur->bc_ptrs[level]; in xfs_btree_make_block_unfull()
2900 cur->bc_ops->init_rec_from_key(&key, nrec); in xfs_btree_make_block_unfull()
2910 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_insrec() argument
2931 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_insrec()
2932 XFS_BTREE_TRACE_ARGIPR(cur, level, *ptrp, recp); in xfs_btree_insrec()
2940 if (!(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_insrec()
2941 (level >= cur->bc_nlevels)) { in xfs_btree_insrec()
2942 error = xfs_btree_new_root(cur, stat); in xfs_btree_insrec()
2943 xfs_btree_set_ptr_null(cur, ptrp); in xfs_btree_insrec()
2945 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_insrec()
2950 ptr = cur->bc_ptrs[level]; in xfs_btree_insrec()
2952 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_insrec()
2958 cur->bc_ops->init_key_from_rec(&key, recp); in xfs_btree_insrec()
2962 XFS_BTREE_STATS_INC(cur, insrec); in xfs_btree_insrec()
2965 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
2969 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
2976 ASSERT(cur->bc_ops->recs_inorder(cur, recp, in xfs_btree_insrec()
2977 xfs_btree_rec_addr(cur, ptr, block))); in xfs_btree_insrec()
2979 ASSERT(cur->bc_ops->keys_inorder(cur, &key, in xfs_btree_insrec()
2980 xfs_btree_key_addr(cur, ptr, block))); in xfs_btree_insrec()
2989 xfs_btree_set_ptr_null(cur, &nptr); in xfs_btree_insrec()
2990 if (numrecs == cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_insrec()
2991 error = xfs_btree_make_block_unfull(cur, level, numrecs, in xfs_btree_insrec()
3001 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
3005 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
3014 XFS_BTREE_STATS_ADD(cur, moves, numrecs - ptr + 1); in xfs_btree_insrec()
3021 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_insrec()
3022 pp = xfs_btree_ptr_addr(cur, ptr, block); in xfs_btree_insrec()
3026 error = xfs_btree_check_ptr(cur, pp, i, level); in xfs_btree_insrec()
3032 xfs_btree_shift_keys(cur, kp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3033 xfs_btree_shift_ptrs(cur, pp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3036 error = xfs_btree_check_ptr(cur, ptrp, 0, level); in xfs_btree_insrec()
3042 xfs_btree_copy_keys(cur, kp, &key, 1); in xfs_btree_insrec()
3043 xfs_btree_copy_ptrs(cur, pp, ptrp, 1); in xfs_btree_insrec()
3046 xfs_btree_log_ptrs(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3047 xfs_btree_log_keys(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3050 ASSERT(cur->bc_ops->keys_inorder(cur, kp, in xfs_btree_insrec()
3051 xfs_btree_key_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
3058 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_insrec()
3060 xfs_btree_shift_recs(cur, rp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3063 xfs_btree_copy_recs(cur, rp, recp, 1); in xfs_btree_insrec()
3065 xfs_btree_log_recs(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3068 ASSERT(cur->bc_ops->recs_inorder(cur, rp, in xfs_btree_insrec()
3069 xfs_btree_rec_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
3075 xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); in xfs_btree_insrec()
3079 error = xfs_btree_updkey(cur, &key, level + 1); in xfs_btree_insrec()
3088 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_insrec()
3089 cur->bc_ops->update_lastrec(cur, block, recp, in xfs_btree_insrec()
3098 if (!xfs_btree_ptr_is_null(cur, &nptr)) { in xfs_btree_insrec()
3103 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_insrec()
3108 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_insrec()
3121 struct xfs_btree_cur *cur, in xfs_btree_insert() argument
3134 pcur = cur; in xfs_btree_insert()
3136 xfs_btree_set_ptr_null(cur, &nptr); in xfs_btree_insert()
3137 cur->bc_ops->init_rec_from_cur(cur, &rec); in xfs_btree_insert()
3151 if (pcur != cur) in xfs_btree_insert()
3156 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_insert()
3164 if (pcur != cur && in xfs_btree_insert()
3165 (ncur || xfs_btree_ptr_is_null(cur, &nptr))) { in xfs_btree_insert()
3167 if (cur->bc_ops->update_cursor) in xfs_btree_insert()
3168 cur->bc_ops->update_cursor(pcur, cur); in xfs_btree_insert()
3169 cur->bc_nlevels = pcur->bc_nlevels; in xfs_btree_insert()
3177 } while (!xfs_btree_ptr_is_null(cur, &nptr)); in xfs_btree_insert()
3179 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_insert()
3183 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_insert()
3197 struct xfs_btree_cur *cur) in xfs_btree_kill_iroot() argument
3199 int whichfork = cur->bc_private.b.whichfork; in xfs_btree_kill_iroot()
3200 struct xfs_inode *ip = cur->bc_private.b.ip; in xfs_btree_kill_iroot()
3217 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_kill_iroot()
3219 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_kill_iroot()
3220 ASSERT(cur->bc_nlevels > 1); in xfs_btree_kill_iroot()
3226 level = cur->bc_nlevels - 1; in xfs_btree_kill_iroot()
3233 block = xfs_btree_get_iroot(cur); in xfs_btree_kill_iroot()
3237 cblock = xfs_btree_get_block(cur, level - 1, &cbp); in xfs_btree_kill_iroot()
3245 if (numrecs > cur->bc_ops->get_dmaxrecs(cur, level)) in xfs_btree_kill_iroot()
3248 XFS_BTREE_STATS_INC(cur, killroot); in xfs_btree_kill_iroot()
3251 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_kill_iroot()
3252 ASSERT(xfs_btree_ptr_is_null(cur, &ptr)); in xfs_btree_kill_iroot()
3253 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_kill_iroot()
3254 ASSERT(xfs_btree_ptr_is_null(cur, &ptr)); in xfs_btree_kill_iroot()
3257 index = numrecs - cur->bc_ops->get_maxrecs(cur, level); in xfs_btree_kill_iroot()
3259 xfs_iroot_realloc(cur->bc_private.b.ip, index, in xfs_btree_kill_iroot()
3260 cur->bc_private.b.whichfork); in xfs_btree_kill_iroot()
3267 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_kill_iroot()
3268 ckp = xfs_btree_key_addr(cur, 1, cblock); in xfs_btree_kill_iroot()
3269 xfs_btree_copy_keys(cur, kp, ckp, numrecs); in xfs_btree_kill_iroot()
3271 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_kill_iroot()
3272 cpp = xfs_btree_ptr_addr(cur, 1, cblock); in xfs_btree_kill_iroot()
3277 error = xfs_btree_check_ptr(cur, cpp, i, level - 1); in xfs_btree_kill_iroot()
3279 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_kill_iroot()
3284 xfs_btree_copy_ptrs(cur, pp, cpp, numrecs); in xfs_btree_kill_iroot()
3286 cur->bc_ops->free_block(cur, cbp); in xfs_btree_kill_iroot()
3287 XFS_BTREE_STATS_INC(cur, free); in xfs_btree_kill_iroot()
3289 cur->bc_bufs[level - 1] = NULL; in xfs_btree_kill_iroot()
3291 xfs_trans_log_inode(cur->bc_tp, ip, in xfs_btree_kill_iroot()
3292 XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork)); in xfs_btree_kill_iroot()
3293 cur->bc_nlevels--; in xfs_btree_kill_iroot()
3295 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_kill_iroot()
3304 struct xfs_btree_cur *cur, in xfs_btree_kill_root() argument
3311 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_kill_root()
3312 XFS_BTREE_STATS_INC(cur, killroot); in xfs_btree_kill_root()
3318 cur->bc_ops->set_root(cur, newroot, -1); in xfs_btree_kill_root()
3320 error = cur->bc_ops->free_block(cur, bp); in xfs_btree_kill_root()
3322 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_kill_root()
3326 XFS_BTREE_STATS_INC(cur, free); in xfs_btree_kill_root()
3328 cur->bc_bufs[level] = NULL; in xfs_btree_kill_root()
3329 cur->bc_ra[level] = 0; in xfs_btree_kill_root()
3330 cur->bc_nlevels--; in xfs_btree_kill_root()
3332 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_kill_root()
3338 struct xfs_btree_cur *cur, in xfs_btree_dec_cursor() argument
3346 error = xfs_btree_decrement(cur, level, &i); in xfs_btree_dec_cursor()
3351 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_dec_cursor()
3364 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_delrec() argument
3389 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_delrec()
3390 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_delrec()
3395 ptr = cur->bc_ptrs[level]; in xfs_btree_delrec()
3397 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delrec()
3403 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_delrec()
3407 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_delrec()
3414 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delrec()
3419 XFS_BTREE_STATS_INC(cur, delrec); in xfs_btree_delrec()
3420 XFS_BTREE_STATS_ADD(cur, moves, numrecs - ptr); in xfs_btree_delrec()
3428 lkp = xfs_btree_key_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3429 lpp = xfs_btree_ptr_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3433 error = xfs_btree_check_ptr(cur, lpp, i, level); in xfs_btree_delrec()
3440 xfs_btree_shift_keys(cur, lkp, -1, numrecs - ptr); in xfs_btree_delrec()
3441 xfs_btree_shift_ptrs(cur, lpp, -1, numrecs - ptr); in xfs_btree_delrec()
3442 xfs_btree_log_keys(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3443 xfs_btree_log_ptrs(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3451 keyp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_delrec()
3455 xfs_btree_shift_recs(cur, in xfs_btree_delrec()
3456 xfs_btree_rec_addr(cur, ptr + 1, block), in xfs_btree_delrec()
3458 xfs_btree_log_recs(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3466 cur->bc_ops->init_key_from_rec(&key, in xfs_btree_delrec()
3467 xfs_btree_rec_addr(cur, 1, block)); in xfs_btree_delrec()
3476 xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); in xfs_btree_delrec()
3482 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_delrec()
3483 cur->bc_ops->update_lastrec(cur, block, NULL, in xfs_btree_delrec()
3492 if (level == cur->bc_nlevels - 1) { in xfs_btree_delrec()
3493 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { in xfs_btree_delrec()
3494 xfs_iroot_realloc(cur->bc_private.b.ip, -1, in xfs_btree_delrec()
3495 cur->bc_private.b.whichfork); in xfs_btree_delrec()
3497 error = xfs_btree_kill_iroot(cur); in xfs_btree_delrec()
3501 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3519 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_delrec()
3520 error = xfs_btree_kill_root(cur, bp, level, pp); in xfs_btree_delrec()
3524 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3537 error = xfs_btree_updkey(cur, keyp, level + 1); in xfs_btree_delrec()
3546 if (numrecs >= cur->bc_ops->get_minrecs(cur, level)) { in xfs_btree_delrec()
3547 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3558 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3559 xfs_btree_get_sibling(cur, block, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3561 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { in xfs_btree_delrec()
3567 if (xfs_btree_ptr_is_null(cur, &rptr) && in xfs_btree_delrec()
3568 xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_delrec()
3569 level == cur->bc_nlevels - 2) { in xfs_btree_delrec()
3570 error = xfs_btree_kill_iroot(cur); in xfs_btree_delrec()
3572 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3579 ASSERT(!xfs_btree_ptr_is_null(cur, &rptr) || in xfs_btree_delrec()
3580 !xfs_btree_ptr_is_null(cur, &lptr)); in xfs_btree_delrec()
3586 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_delrec()
3594 if (!xfs_btree_ptr_is_null(cur, &rptr)) { in xfs_btree_delrec()
3600 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3605 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3608 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3626 cur->bc_ops->get_minrecs(tcur, level)) { in xfs_btree_delrec()
3632 cur->bc_ops->get_minrecs(tcur, level)); in xfs_btree_delrec()
3637 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3650 if (!xfs_btree_ptr_is_null(cur, &lptr)) { in xfs_btree_delrec()
3652 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3657 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3665 if (!xfs_btree_ptr_is_null(cur, &lptr)) { in xfs_btree_delrec()
3671 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3677 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3682 error = xfs_btree_check_block(cur, left, level, lbp); in xfs_btree_delrec()
3695 cur->bc_ops->get_minrecs(tcur, level)) { in xfs_btree_delrec()
3701 cur->bc_ops->get_minrecs(tcur, level)); in xfs_btree_delrec()
3705 cur->bc_ptrs[0]++; in xfs_btree_delrec()
3706 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delrec()
3724 ASSERT(!xfs_btree_ptr_is_null(cur, &cptr)); in xfs_btree_delrec()
3726 if (!xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_delrec()
3728 cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_delrec()
3736 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_delrec()
3743 } else if (!xfs_btree_ptr_is_null(cur, &rptr) && in xfs_btree_delrec()
3745 cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_delrec()
3753 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_delrec()
3762 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3775 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in xfs_btree_delrec()
3783 lkp = xfs_btree_key_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
3784 lpp = xfs_btree_ptr_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
3785 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_delrec()
3786 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_delrec()
3789 error = xfs_btree_check_ptr(cur, rpp, i, level); in xfs_btree_delrec()
3794 xfs_btree_copy_keys(cur, lkp, rkp, rrecs); in xfs_btree_delrec()
3795 xfs_btree_copy_ptrs(cur, lpp, rpp, rrecs); in xfs_btree_delrec()
3797 xfs_btree_log_keys(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
3798 xfs_btree_log_ptrs(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
3804 lrp = xfs_btree_rec_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
3805 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_delrec()
3807 xfs_btree_copy_recs(cur, lrp, rrp, rrecs); in xfs_btree_delrec()
3808 xfs_btree_log_recs(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
3811 XFS_BTREE_STATS_INC(cur, join); in xfs_btree_delrec()
3818 xfs_btree_get_sibling(cur, right, &cptr, XFS_BB_RIGHTSIB), in xfs_btree_delrec()
3819 xfs_btree_set_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3820 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3823 xfs_btree_get_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3824 if (!xfs_btree_ptr_is_null(cur, &cptr)) { in xfs_btree_delrec()
3825 error = xfs_btree_read_buf_block(cur, &cptr, 0, &rrblock, &rrbp); in xfs_btree_delrec()
3828 xfs_btree_set_sibling(cur, rrblock, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3829 xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3833 error = cur->bc_ops->free_block(cur, rbp); in xfs_btree_delrec()
3836 XFS_BTREE_STATS_INC(cur, free); in xfs_btree_delrec()
3843 cur->bc_bufs[level] = lbp; in xfs_btree_delrec()
3844 cur->bc_ptrs[level] += lrecs; in xfs_btree_delrec()
3845 cur->bc_ra[level] = 0; in xfs_btree_delrec()
3851 else if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) || in xfs_btree_delrec()
3852 (level + 1 < cur->bc_nlevels)) { in xfs_btree_delrec()
3853 error = xfs_btree_increment(cur, level + 1, &i); in xfs_btree_delrec()
3865 cur->bc_ptrs[level]--; in xfs_btree_delrec()
3867 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delrec()
3873 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_delrec()
3886 struct xfs_btree_cur *cur, in xfs_btree_delete() argument
3893 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_delete()
3902 error = xfs_btree_delrec(cur, level, &i); in xfs_btree_delete()
3908 for (level = 1; level < cur->bc_nlevels; level++) { in xfs_btree_delete()
3909 if (cur->bc_ptrs[level] == 0) { in xfs_btree_delete()
3910 error = xfs_btree_decrement(cur, level, &i); in xfs_btree_delete()
3918 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delete()
3922 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_delete()
3931 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_get_rec() argument
3942 ptr = cur->bc_ptrs[0]; in xfs_btree_get_rec()
3943 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_get_rec()
3946 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_get_rec()
3962 *recp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_get_rec()
3993 struct xfs_btree_cur *cur, in xfs_btree_block_change_owner() argument
4003 xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); in xfs_btree_block_change_owner()
4006 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_block_change_owner()
4007 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_block_change_owner()
4020 if (cur->bc_tp) { in xfs_btree_block_change_owner()
4021 xfs_trans_ordered_buf(cur->bc_tp, bp); in xfs_btree_block_change_owner()
4022 xfs_btree_log_block(cur, bp, XFS_BB_OWNER); in xfs_btree_block_change_owner()
4027 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_block_change_owner()
4028 ASSERT(level == cur->bc_nlevels - 1); in xfs_btree_block_change_owner()
4032 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_block_change_owner()
4033 if (xfs_btree_ptr_is_null(cur, &rptr)) in xfs_btree_block_change_owner()
4036 return xfs_btree_lookup_get_block(cur, level, &rptr, &block); in xfs_btree_block_change_owner()
4041 struct xfs_btree_cur *cur, in xfs_btree_change_owner() argument
4050 cur->bc_ops->init_ptr_from_cur(cur, &lptr); in xfs_btree_change_owner()
4053 for (level = cur->bc_nlevels - 1; level >= 0; level--) { in xfs_btree_change_owner()
4055 error = xfs_btree_lookup_get_block(cur, level, &lptr, &block); in xfs_btree_change_owner()
4063 ptr = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_change_owner()
4064 xfs_btree_readahead_ptr(cur, ptr, 1); in xfs_btree_change_owner()
4072 error = xfs_btree_block_change_owner(cur, level, in xfs_btree_change_owner()