Lines Matching refs:cur
50 #define xfs_btree_magic(cur) \ argument
51 xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum]
56 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_lblock() argument
64 mp = cur->bc_mp; in xfs_btree_check_lblock()
74 be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && in xfs_btree_check_lblock()
77 cur->bc_ops->get_maxrecs(cur, level) && in xfs_btree_check_lblock()
100 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_sblock() argument
111 mp = cur->bc_mp; in xfs_btree_check_sblock()
112 agbp = cur->bc_private.a.agbp; in xfs_btree_check_sblock()
124 be32_to_cpu(block->bb_magic) == xfs_btree_magic(cur) && in xfs_btree_check_sblock()
127 cur->bc_ops->get_maxrecs(cur, level) && in xfs_btree_check_sblock()
151 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_block() argument
156 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_check_block()
157 return xfs_btree_check_lblock(cur, block, level, bp); in xfs_btree_check_block()
159 return xfs_btree_check_sblock(cur, block, level, bp); in xfs_btree_check_block()
167 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_lptr() argument
171 XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, in xfs_btree_check_lptr()
174 XFS_FSB_SANITY_CHECK(cur->bc_mp, bno)); in xfs_btree_check_lptr()
184 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_sptr() argument
188 xfs_agblock_t agblocks = cur->bc_mp->m_sb.sb_agblocks; in xfs_btree_check_sptr()
190 XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, in xfs_btree_check_sptr()
203 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_ptr() argument
208 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_check_ptr()
209 return xfs_btree_check_lptr(cur, in xfs_btree_check_ptr()
212 return xfs_btree_check_sptr(cur, in xfs_btree_check_ptr()
287 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_del_cursor() argument
302 for (i = 0; i < cur->bc_nlevels; i++) { in xfs_btree_del_cursor()
303 if (cur->bc_bufs[i]) in xfs_btree_del_cursor()
304 xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[i]); in xfs_btree_del_cursor()
312 ASSERT(cur->bc_btnum != XFS_BTNUM_BMAP || in xfs_btree_del_cursor()
313 cur->bc_private.b.allocated == 0); in xfs_btree_del_cursor()
317 kmem_zone_free(xfs_btree_cur_zone, cur); in xfs_btree_del_cursor()
326 xfs_btree_cur_t *cur, /* input cursor */ in xfs_btree_dup_cursor() argument
336 tp = cur->bc_tp; in xfs_btree_dup_cursor()
337 mp = cur->bc_mp; in xfs_btree_dup_cursor()
342 new = cur->bc_ops->dup_cursor(cur); in xfs_btree_dup_cursor()
347 new->bc_rec = cur->bc_rec; in xfs_btree_dup_cursor()
353 new->bc_ptrs[i] = cur->bc_ptrs[i]; in xfs_btree_dup_cursor()
354 new->bc_ra[i] = cur->bc_ra[i]; in xfs_btree_dup_cursor()
355 bp = cur->bc_bufs[i]; in xfs_btree_dup_cursor()
360 cur->bc_ops->buf_ops); in xfs_btree_dup_cursor()
406 static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) in xfs_btree_block_len() argument
408 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_block_len()
409 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) in xfs_btree_block_len()
413 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) in xfs_btree_block_len()
421 static inline size_t xfs_btree_ptr_len(struct xfs_btree_cur *cur) in xfs_btree_ptr_len() argument
423 return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? in xfs_btree_ptr_len()
432 struct xfs_btree_cur *cur, in xfs_btree_rec_offset() argument
435 return xfs_btree_block_len(cur) + in xfs_btree_rec_offset()
436 (n - 1) * cur->bc_ops->rec_len; in xfs_btree_rec_offset()
444 struct xfs_btree_cur *cur, in xfs_btree_key_offset() argument
447 return xfs_btree_block_len(cur) + in xfs_btree_key_offset()
448 (n - 1) * cur->bc_ops->key_len; in xfs_btree_key_offset()
456 struct xfs_btree_cur *cur, in xfs_btree_ptr_offset() argument
460 return xfs_btree_block_len(cur) + in xfs_btree_ptr_offset()
461 cur->bc_ops->get_maxrecs(cur, level) * cur->bc_ops->key_len + in xfs_btree_ptr_offset()
462 (n - 1) * xfs_btree_ptr_len(cur); in xfs_btree_ptr_offset()
470 struct xfs_btree_cur *cur, in xfs_btree_rec_addr() argument
475 ((char *)block + xfs_btree_rec_offset(cur, n)); in xfs_btree_rec_addr()
483 struct xfs_btree_cur *cur, in xfs_btree_key_addr() argument
488 ((char *)block + xfs_btree_key_offset(cur, n)); in xfs_btree_key_addr()
496 struct xfs_btree_cur *cur, in xfs_btree_ptr_addr() argument
505 ((char *)block + xfs_btree_ptr_offset(cur, n, level)); in xfs_btree_ptr_addr()
516 struct xfs_btree_cur *cur) in xfs_btree_get_iroot() argument
520 ifp = XFS_IFORK_PTR(cur->bc_private.b.ip, cur->bc_private.b.whichfork); in xfs_btree_get_iroot()
530 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_get_block() argument
534 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_get_block()
535 (level == cur->bc_nlevels - 1)) { in xfs_btree_get_block()
537 return xfs_btree_get_iroot(cur); in xfs_btree_get_block()
540 *bpp = cur->bc_bufs[level]; in xfs_btree_get_block()
587 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_islastblock() argument
593 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_islastblock()
594 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_islastblock()
595 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_islastblock()
607 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_firstrec() argument
616 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_firstrec()
617 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_firstrec()
626 cur->bc_ptrs[level] = 1; in xfs_btree_firstrec()
636 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_lastrec() argument
645 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_lastrec()
646 xfs_btree_check_block(cur, block, level, bp); in xfs_btree_lastrec()
655 cur->bc_ptrs[level] = be16_to_cpu(block->bb_numrecs); in xfs_btree_lastrec()
767 struct xfs_btree_cur *cur, in xfs_btree_readahead_lblock() argument
776 xfs_btree_reada_bufl(cur->bc_mp, left, 1, in xfs_btree_readahead_lblock()
777 cur->bc_ops->buf_ops); in xfs_btree_readahead_lblock()
782 xfs_btree_reada_bufl(cur->bc_mp, right, 1, in xfs_btree_readahead_lblock()
783 cur->bc_ops->buf_ops); in xfs_btree_readahead_lblock()
792 struct xfs_btree_cur *cur, in xfs_btree_readahead_sblock() argument
802 xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno, in xfs_btree_readahead_sblock()
803 left, 1, cur->bc_ops->buf_ops); in xfs_btree_readahead_sblock()
808 xfs_btree_reada_bufs(cur->bc_mp, cur->bc_private.a.agno, in xfs_btree_readahead_sblock()
809 right, 1, cur->bc_ops->buf_ops); in xfs_btree_readahead_sblock()
822 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_readahead() argument
832 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_readahead()
833 (lev == cur->bc_nlevels - 1)) in xfs_btree_readahead()
836 if ((cur->bc_ra[lev] | lr) == cur->bc_ra[lev]) in xfs_btree_readahead()
839 cur->bc_ra[lev] |= lr; in xfs_btree_readahead()
840 block = XFS_BUF_TO_BLOCK(cur->bc_bufs[lev]); in xfs_btree_readahead()
842 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_readahead()
843 return xfs_btree_readahead_lblock(cur, lr, block); in xfs_btree_readahead()
844 return xfs_btree_readahead_sblock(cur, lr, block); in xfs_btree_readahead()
849 struct xfs_btree_cur *cur, in xfs_btree_ptr_to_daddr() argument
852 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_ptr_to_daddr()
855 return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); in xfs_btree_ptr_to_daddr()
857 ASSERT(cur->bc_private.a.agno != NULLAGNUMBER); in xfs_btree_ptr_to_daddr()
860 return XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_private.a.agno, in xfs_btree_ptr_to_daddr()
873 struct xfs_btree_cur *cur, in xfs_btree_readahead_ptr() argument
877 xfs_buf_readahead(cur->bc_mp->m_ddev_targp, in xfs_btree_readahead_ptr()
878 xfs_btree_ptr_to_daddr(cur, ptr), in xfs_btree_readahead_ptr()
879 cur->bc_mp->m_bsize * count, cur->bc_ops->buf_ops); in xfs_btree_readahead_ptr()
888 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_setbuf() argument
894 if (cur->bc_bufs[lev]) in xfs_btree_setbuf()
895 xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[lev]); in xfs_btree_setbuf()
896 cur->bc_bufs[lev] = bp; in xfs_btree_setbuf()
897 cur->bc_ra[lev] = 0; in xfs_btree_setbuf()
900 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_setbuf()
902 cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA; in xfs_btree_setbuf()
904 cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA; in xfs_btree_setbuf()
907 cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA; in xfs_btree_setbuf()
909 cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA; in xfs_btree_setbuf()
915 struct xfs_btree_cur *cur, in xfs_btree_ptr_is_null() argument
918 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_ptr_is_null()
926 struct xfs_btree_cur *cur, in xfs_btree_set_ptr_null() argument
929 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_set_ptr_null()
940 struct xfs_btree_cur *cur, in xfs_btree_get_sibling() argument
947 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_get_sibling()
962 struct xfs_btree_cur *cur, in xfs_btree_set_sibling() argument
969 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_set_sibling()
1038 struct xfs_btree_cur *cur, in xfs_btree_init_block_cur() argument
1051 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_init_block_cur()
1052 owner = cur->bc_private.b.ip->i_ino; in xfs_btree_init_block_cur()
1054 owner = cur->bc_private.a.agno; in xfs_btree_init_block_cur()
1056 xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, in xfs_btree_init_block_cur()
1057 xfs_btree_magic(cur), level, numrecs, in xfs_btree_init_block_cur()
1058 owner, cur->bc_flags); in xfs_btree_init_block_cur()
1068 struct xfs_btree_cur *cur, in xfs_btree_is_lastrec() argument
1076 if (!(cur->bc_flags & XFS_BTREE_LASTREC_UPDATE)) in xfs_btree_is_lastrec()
1079 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_is_lastrec()
1080 if (!xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_is_lastrec()
1087 struct xfs_btree_cur *cur, in xfs_btree_buf_to_ptr() argument
1091 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_buf_to_ptr()
1092 ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp, in xfs_btree_buf_to_ptr()
1095 ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp, in xfs_btree_buf_to_ptr()
1102 struct xfs_btree_cur *cur, in xfs_btree_set_refs() argument
1105 switch (cur->bc_btnum) { in xfs_btree_set_refs()
1124 struct xfs_btree_cur *cur, in xfs_btree_get_buf_block() argument
1130 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_get_buf_block()
1136 d = xfs_btree_ptr_to_daddr(cur, ptr); in xfs_btree_get_buf_block()
1137 *bpp = xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, in xfs_btree_get_buf_block()
1143 (*bpp)->b_ops = cur->bc_ops->buf_ops; in xfs_btree_get_buf_block()
1154 struct xfs_btree_cur *cur, in xfs_btree_read_buf_block() argument
1160 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_read_buf_block()
1167 d = xfs_btree_ptr_to_daddr(cur, ptr); in xfs_btree_read_buf_block()
1168 error = xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d, in xfs_btree_read_buf_block()
1170 cur->bc_ops->buf_ops); in xfs_btree_read_buf_block()
1174 xfs_btree_set_refs(cur, *bpp); in xfs_btree_read_buf_block()
1184 struct xfs_btree_cur *cur, in xfs_btree_copy_keys() argument
1190 memcpy(dst_key, src_key, numkeys * cur->bc_ops->key_len); in xfs_btree_copy_keys()
1198 struct xfs_btree_cur *cur, in xfs_btree_copy_recs() argument
1204 memcpy(dst_rec, src_rec, numrecs * cur->bc_ops->rec_len); in xfs_btree_copy_recs()
1212 struct xfs_btree_cur *cur, in xfs_btree_copy_ptrs() argument
1218 memcpy(dst_ptr, src_ptr, numptrs * xfs_btree_ptr_len(cur)); in xfs_btree_copy_ptrs()
1226 struct xfs_btree_cur *cur, in xfs_btree_shift_keys() argument
1236 dst_key = (char *)key + (dir * cur->bc_ops->key_len); in xfs_btree_shift_keys()
1237 memmove(dst_key, key, numkeys * cur->bc_ops->key_len); in xfs_btree_shift_keys()
1245 struct xfs_btree_cur *cur, in xfs_btree_shift_recs() argument
1255 dst_rec = (char *)rec + (dir * cur->bc_ops->rec_len); in xfs_btree_shift_recs()
1256 memmove(dst_rec, rec, numrecs * cur->bc_ops->rec_len); in xfs_btree_shift_recs()
1264 struct xfs_btree_cur *cur, in xfs_btree_shift_ptrs() argument
1274 dst_ptr = (char *)ptr + (dir * xfs_btree_ptr_len(cur)); in xfs_btree_shift_ptrs()
1275 memmove(dst_ptr, ptr, numptrs * xfs_btree_ptr_len(cur)); in xfs_btree_shift_ptrs()
1283 struct xfs_btree_cur *cur, in xfs_btree_log_keys() argument
1288 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_log_keys()
1289 XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); in xfs_btree_log_keys()
1292 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_keys()
1293 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_keys()
1294 xfs_btree_key_offset(cur, first), in xfs_btree_log_keys()
1295 xfs_btree_key_offset(cur, last + 1) - 1); in xfs_btree_log_keys()
1297 xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, in xfs_btree_log_keys()
1298 xfs_ilog_fbroot(cur->bc_private.b.whichfork)); in xfs_btree_log_keys()
1301 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_log_keys()
1309 struct xfs_btree_cur *cur, in xfs_btree_log_recs() argument
1314 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_log_recs()
1315 XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); in xfs_btree_log_recs()
1317 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_recs()
1318 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_recs()
1319 xfs_btree_rec_offset(cur, first), in xfs_btree_log_recs()
1320 xfs_btree_rec_offset(cur, last + 1) - 1); in xfs_btree_log_recs()
1322 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_log_recs()
1330 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_log_ptrs() argument
1335 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_log_ptrs()
1336 XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); in xfs_btree_log_ptrs()
1342 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_ptrs()
1343 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_ptrs()
1344 xfs_btree_ptr_offset(cur, first, level), in xfs_btree_log_ptrs()
1345 xfs_btree_ptr_offset(cur, last + 1, level) - 1); in xfs_btree_log_ptrs()
1347 xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, in xfs_btree_log_ptrs()
1348 xfs_ilog_fbroot(cur->bc_private.b.whichfork)); in xfs_btree_log_ptrs()
1351 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_log_ptrs()
1359 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_log_block() argument
1393 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_log_block()
1394 XFS_BTREE_TRACE_ARGBI(cur, bp, fields); in xfs_btree_log_block()
1399 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { in xfs_btree_log_block()
1414 (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? in xfs_btree_log_block()
1417 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_block()
1418 xfs_trans_log_buf(cur->bc_tp, bp, first, last); in xfs_btree_log_block()
1420 xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, in xfs_btree_log_block()
1421 xfs_ilog_fbroot(cur->bc_private.b.whichfork)); in xfs_btree_log_block()
1424 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_log_block()
1433 struct xfs_btree_cur *cur, in xfs_btree_increment() argument
1443 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_increment()
1444 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_increment()
1446 ASSERT(level < cur->bc_nlevels); in xfs_btree_increment()
1449 xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); in xfs_btree_increment()
1452 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_increment()
1455 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_increment()
1461 if (++cur->bc_ptrs[level] <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1465 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_increment()
1466 if (xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_increment()
1469 XFS_BTREE_STATS_INC(cur, increment); in xfs_btree_increment()
1475 for (lev = level + 1; lev < cur->bc_nlevels; lev++) { in xfs_btree_increment()
1476 block = xfs_btree_get_block(cur, lev, &bp); in xfs_btree_increment()
1479 error = xfs_btree_check_block(cur, block, lev, bp); in xfs_btree_increment()
1484 if (++cur->bc_ptrs[lev] <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1488 xfs_btree_readahead(cur, lev, XFS_BTCUR_RIGHTRA); in xfs_btree_increment()
1495 if (lev == cur->bc_nlevels) { in xfs_btree_increment()
1496 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) in xfs_btree_increment()
1502 ASSERT(lev < cur->bc_nlevels); in xfs_btree_increment()
1508 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_increment()
1511 ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); in xfs_btree_increment()
1513 error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); in xfs_btree_increment()
1517 xfs_btree_setbuf(cur, lev, bp); in xfs_btree_increment()
1518 cur->bc_ptrs[lev] = 1; in xfs_btree_increment()
1521 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_increment()
1526 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_increment()
1531 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_increment()
1541 struct xfs_btree_cur *cur, in xfs_btree_decrement() argument
1551 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_decrement()
1552 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_decrement()
1554 ASSERT(level < cur->bc_nlevels); in xfs_btree_decrement()
1557 xfs_btree_readahead(cur, level, XFS_BTCUR_LEFTRA); in xfs_btree_decrement()
1560 if (--cur->bc_ptrs[level] > 0) in xfs_btree_decrement()
1564 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_decrement()
1567 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_decrement()
1573 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_decrement()
1574 if (xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_decrement()
1577 XFS_BTREE_STATS_INC(cur, decrement); in xfs_btree_decrement()
1583 for (lev = level + 1; lev < cur->bc_nlevels; lev++) { in xfs_btree_decrement()
1584 if (--cur->bc_ptrs[lev] > 0) in xfs_btree_decrement()
1587 xfs_btree_readahead(cur, lev, XFS_BTCUR_LEFTRA); in xfs_btree_decrement()
1594 if (lev == cur->bc_nlevels) { in xfs_btree_decrement()
1595 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) in xfs_btree_decrement()
1601 ASSERT(lev < cur->bc_nlevels); in xfs_btree_decrement()
1607 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_decrement()
1610 ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); in xfs_btree_decrement()
1612 error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); in xfs_btree_decrement()
1615 xfs_btree_setbuf(cur, lev, bp); in xfs_btree_decrement()
1616 cur->bc_ptrs[lev] = xfs_btree_get_numrecs(block); in xfs_btree_decrement()
1619 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_decrement()
1624 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_decrement()
1629 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_decrement()
1635 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lookup_get_block() argument
1644 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_lookup_get_block()
1645 (level == cur->bc_nlevels - 1)) { in xfs_btree_lookup_get_block()
1646 *blkp = xfs_btree_get_iroot(cur); in xfs_btree_lookup_get_block()
1656 bp = cur->bc_bufs[level]; in xfs_btree_lookup_get_block()
1657 if (bp && XFS_BUF_ADDR(bp) == xfs_btree_ptr_to_daddr(cur, pp)) { in xfs_btree_lookup_get_block()
1662 error = xfs_btree_read_buf_block(cur, pp, 0, blkp, &bp); in xfs_btree_lookup_get_block()
1666 xfs_btree_setbuf(cur, level, bp); in xfs_btree_lookup_get_block()
1677 struct xfs_btree_cur *cur, in xfs_lookup_get_search_key() argument
1684 cur->bc_ops->init_key_from_rec(kp, in xfs_lookup_get_search_key()
1685 xfs_btree_rec_addr(cur, keyno, block)); in xfs_lookup_get_search_key()
1689 return xfs_btree_key_addr(cur, keyno, block); in xfs_lookup_get_search_key()
1698 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lookup() argument
1710 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_lookup()
1711 XFS_BTREE_TRACE_ARGI(cur, dir); in xfs_btree_lookup()
1713 XFS_BTREE_STATS_INC(cur, lookup); in xfs_btree_lookup()
1719 cur->bc_ops->init_ptr_from_cur(cur, &ptr); in xfs_btree_lookup()
1728 for (level = cur->bc_nlevels - 1, diff = 1; level >= 0; level--) { in xfs_btree_lookup()
1730 error = xfs_btree_lookup_get_block(cur, level, pp, &block); in xfs_btree_lookup()
1751 ASSERT(level == 0 && cur->bc_nlevels == 1); in xfs_btree_lookup()
1753 cur->bc_ptrs[0] = dir != XFS_LOOKUP_LE; in xfs_btree_lookup()
1754 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lookup()
1764 XFS_BTREE_STATS_INC(cur, compare); in xfs_btree_lookup()
1770 kp = xfs_lookup_get_search_key(cur, level, in xfs_btree_lookup()
1779 diff = cur->bc_ops->key_diff(cur, kp); in xfs_btree_lookup()
1800 pp = xfs_btree_ptr_addr(cur, keyno, block); in xfs_btree_lookup()
1803 error = xfs_btree_check_ptr(cur, pp, 0, level); in xfs_btree_lookup()
1807 cur->bc_ptrs[level] = keyno; in xfs_btree_lookup()
1818 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_lookup()
1821 !xfs_btree_ptr_is_null(cur, &ptr)) { in xfs_btree_lookup()
1824 cur->bc_ptrs[0] = keyno; in xfs_btree_lookup()
1825 error = xfs_btree_increment(cur, 0, &i); in xfs_btree_lookup()
1828 XFS_WANT_CORRUPTED_RETURN(cur->bc_mp, i == 1); in xfs_btree_lookup()
1829 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lookup()
1835 cur->bc_ptrs[0] = keyno; in xfs_btree_lookup()
1844 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lookup()
1848 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_lookup()
1857 struct xfs_btree_cur *cur, in xfs_btree_updkey() argument
1866 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_updkey()
1867 XFS_BTREE_TRACE_ARGIK(cur, level, keyp); in xfs_btree_updkey()
1869 ASSERT(!(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) || level >= 1); in xfs_btree_updkey()
1877 for (ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { in xfs_btree_updkey()
1881 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_updkey()
1883 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_updkey()
1885 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_updkey()
1889 ptr = cur->bc_ptrs[level]; in xfs_btree_updkey()
1890 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_updkey()
1891 xfs_btree_copy_keys(cur, kp, keyp, 1); in xfs_btree_updkey()
1892 xfs_btree_log_keys(cur, bp, ptr, ptr); in xfs_btree_updkey()
1895 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_updkey()
1906 struct xfs_btree_cur *cur, in xfs_btree_update() argument
1915 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_update()
1916 XFS_BTREE_TRACE_ARGR(cur, rec); in xfs_btree_update()
1919 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_update()
1922 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_update()
1927 ptr = cur->bc_ptrs[0]; in xfs_btree_update()
1928 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_update()
1931 xfs_btree_copy_recs(cur, rp, rec, 1); in xfs_btree_update()
1932 xfs_btree_log_recs(cur, bp, ptr, ptr); in xfs_btree_update()
1938 if (xfs_btree_is_lastrec(cur, block, 0)) { in xfs_btree_update()
1939 cur->bc_ops->update_lastrec(cur, block, rec, in xfs_btree_update()
1947 cur->bc_ops->init_key_from_rec(&key, rec); in xfs_btree_update()
1948 error = xfs_btree_updkey(cur, &key, 1); in xfs_btree_update()
1953 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_update()
1957 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_update()
1967 struct xfs_btree_cur *cur, in xfs_btree_lshift() argument
1984 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_lshift()
1985 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_lshift()
1987 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_lshift()
1988 level == cur->bc_nlevels - 1) in xfs_btree_lshift()
1992 right = xfs_btree_get_block(cur, level, &rbp); in xfs_btree_lshift()
1995 error = xfs_btree_check_block(cur, right, level, rbp); in xfs_btree_lshift()
2001 xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in xfs_btree_lshift()
2002 if (xfs_btree_ptr_is_null(cur, &lptr)) in xfs_btree_lshift()
2009 if (cur->bc_ptrs[level] <= 1) in xfs_btree_lshift()
2013 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_lshift()
2019 if (lrecs == cur->bc_ops->get_maxrecs(cur, level)) in xfs_btree_lshift()
2032 XFS_BTREE_STATS_INC(cur, lshift); in xfs_btree_lshift()
2033 XFS_BTREE_STATS_ADD(cur, moves, 1); in xfs_btree_lshift()
2044 lkp = xfs_btree_key_addr(cur, lrecs, left); in xfs_btree_lshift()
2045 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_lshift()
2047 lpp = xfs_btree_ptr_addr(cur, lrecs, left); in xfs_btree_lshift()
2048 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_lshift()
2050 error = xfs_btree_check_ptr(cur, rpp, 0, level); in xfs_btree_lshift()
2054 xfs_btree_copy_keys(cur, lkp, rkp, 1); in xfs_btree_lshift()
2055 xfs_btree_copy_ptrs(cur, lpp, rpp, 1); in xfs_btree_lshift()
2057 xfs_btree_log_keys(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2058 xfs_btree_log_ptrs(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2060 ASSERT(cur->bc_ops->keys_inorder(cur, in xfs_btree_lshift()
2061 xfs_btree_key_addr(cur, lrecs - 1, left), lkp)); in xfs_btree_lshift()
2066 lrp = xfs_btree_rec_addr(cur, lrecs, left); in xfs_btree_lshift()
2067 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_lshift()
2069 xfs_btree_copy_recs(cur, lrp, rrp, 1); in xfs_btree_lshift()
2070 xfs_btree_log_recs(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2072 ASSERT(cur->bc_ops->recs_inorder(cur, in xfs_btree_lshift()
2073 xfs_btree_rec_addr(cur, lrecs - 1, left), lrp)); in xfs_btree_lshift()
2077 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS); in xfs_btree_lshift()
2080 xfs_btree_log_block(cur, rbp, XFS_BB_NUMRECS); in xfs_btree_lshift()
2085 XFS_BTREE_STATS_ADD(cur, moves, rrecs - 1); in xfs_btree_lshift()
2092 error = xfs_btree_check_ptr(cur, rpp, i + 1, level); in xfs_btree_lshift()
2097 xfs_btree_shift_keys(cur, in xfs_btree_lshift()
2098 xfs_btree_key_addr(cur, 2, right), in xfs_btree_lshift()
2100 xfs_btree_shift_ptrs(cur, in xfs_btree_lshift()
2101 xfs_btree_ptr_addr(cur, 2, right), in xfs_btree_lshift()
2104 xfs_btree_log_keys(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2105 xfs_btree_log_ptrs(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2108 xfs_btree_shift_recs(cur, in xfs_btree_lshift()
2109 xfs_btree_rec_addr(cur, 2, right), in xfs_btree_lshift()
2111 xfs_btree_log_recs(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2117 cur->bc_ops->init_key_from_rec(&key, in xfs_btree_lshift()
2118 xfs_btree_rec_addr(cur, 1, right)); in xfs_btree_lshift()
2123 error = xfs_btree_updkey(cur, rkp, level + 1); in xfs_btree_lshift()
2128 cur->bc_ptrs[level]--; in xfs_btree_lshift()
2130 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lshift()
2135 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_lshift()
2140 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_lshift()
2150 struct xfs_btree_cur *cur, in xfs_btree_rshift() argument
2167 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_rshift()
2168 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_rshift()
2170 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_rshift()
2171 (level == cur->bc_nlevels - 1)) in xfs_btree_rshift()
2175 left = xfs_btree_get_block(cur, level, &lbp); in xfs_btree_rshift()
2178 error = xfs_btree_check_block(cur, left, level, lbp); in xfs_btree_rshift()
2184 xfs_btree_get_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_rshift()
2185 if (xfs_btree_ptr_is_null(cur, &rptr)) in xfs_btree_rshift()
2193 if (cur->bc_ptrs[level] >= lrecs) in xfs_btree_rshift()
2197 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_rshift()
2203 if (rrecs == cur->bc_ops->get_maxrecs(cur, level)) in xfs_btree_rshift()
2206 XFS_BTREE_STATS_INC(cur, rshift); in xfs_btree_rshift()
2207 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in xfs_btree_rshift()
2219 lkp = xfs_btree_key_addr(cur, lrecs, left); in xfs_btree_rshift()
2220 lpp = xfs_btree_ptr_addr(cur, lrecs, left); in xfs_btree_rshift()
2221 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_rshift()
2222 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_rshift()
2226 error = xfs_btree_check_ptr(cur, rpp, i, level); in xfs_btree_rshift()
2232 xfs_btree_shift_keys(cur, rkp, 1, rrecs); in xfs_btree_rshift()
2233 xfs_btree_shift_ptrs(cur, rpp, 1, rrecs); in xfs_btree_rshift()
2236 error = xfs_btree_check_ptr(cur, lpp, 0, level); in xfs_btree_rshift()
2242 xfs_btree_copy_keys(cur, rkp, lkp, 1); in xfs_btree_rshift()
2243 xfs_btree_copy_ptrs(cur, rpp, lpp, 1); in xfs_btree_rshift()
2245 xfs_btree_log_keys(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2246 xfs_btree_log_ptrs(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2248 ASSERT(cur->bc_ops->keys_inorder(cur, rkp, in xfs_btree_rshift()
2249 xfs_btree_key_addr(cur, 2, right))); in xfs_btree_rshift()
2255 lrp = xfs_btree_rec_addr(cur, lrecs, left); in xfs_btree_rshift()
2256 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_rshift()
2258 xfs_btree_shift_recs(cur, rrp, 1, rrecs); in xfs_btree_rshift()
2261 xfs_btree_copy_recs(cur, rrp, lrp, 1); in xfs_btree_rshift()
2262 xfs_btree_log_recs(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2264 cur->bc_ops->init_key_from_rec(&key, rrp); in xfs_btree_rshift()
2267 ASSERT(cur->bc_ops->recs_inorder(cur, rrp, in xfs_btree_rshift()
2268 xfs_btree_rec_addr(cur, 2, right))); in xfs_btree_rshift()
2275 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS); in xfs_btree_rshift()
2278 xfs_btree_log_block(cur, rbp, XFS_BB_NUMRECS); in xfs_btree_rshift()
2284 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_rshift()
2288 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_rshift()
2300 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_rshift()
2305 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_rshift()
2310 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_rshift()
2326 struct xfs_btree_cur *cur, in __xfs_btree_split() argument
2350 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in __xfs_btree_split()
2351 XFS_BTREE_TRACE_ARGIPK(cur, level, *ptrp, key); in __xfs_btree_split()
2353 XFS_BTREE_STATS_INC(cur, split); in __xfs_btree_split()
2356 left = xfs_btree_get_block(cur, level, &lbp); in __xfs_btree_split()
2359 error = xfs_btree_check_block(cur, left, level, lbp); in __xfs_btree_split()
2364 xfs_btree_buf_to_ptr(cur, lbp, &lptr); in __xfs_btree_split()
2367 error = cur->bc_ops->alloc_block(cur, &lptr, &rptr, stat); in __xfs_btree_split()
2372 XFS_BTREE_STATS_INC(cur, alloc); in __xfs_btree_split()
2375 error = xfs_btree_get_buf_block(cur, &rptr, 0, &right, &rbp); in __xfs_btree_split()
2380 xfs_btree_init_block_cur(cur, rbp, xfs_btree_get_level(left), 0); in __xfs_btree_split()
2389 if ((lrecs & 1) && cur->bc_ptrs[level] <= rrecs + 1) in __xfs_btree_split()
2393 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in __xfs_btree_split()
2407 lkp = xfs_btree_key_addr(cur, src_index, left); in __xfs_btree_split()
2408 lpp = xfs_btree_ptr_addr(cur, src_index, left); in __xfs_btree_split()
2409 rkp = xfs_btree_key_addr(cur, 1, right); in __xfs_btree_split()
2410 rpp = xfs_btree_ptr_addr(cur, 1, right); in __xfs_btree_split()
2414 error = xfs_btree_check_ptr(cur, lpp, i, level); in __xfs_btree_split()
2420 xfs_btree_copy_keys(cur, rkp, lkp, rrecs); in __xfs_btree_split()
2421 xfs_btree_copy_ptrs(cur, rpp, lpp, rrecs); in __xfs_btree_split()
2423 xfs_btree_log_keys(cur, rbp, 1, rrecs); in __xfs_btree_split()
2424 xfs_btree_log_ptrs(cur, rbp, 1, rrecs); in __xfs_btree_split()
2427 xfs_btree_copy_keys(cur, key, rkp, 1); in __xfs_btree_split()
2433 lrp = xfs_btree_rec_addr(cur, src_index, left); in __xfs_btree_split()
2434 rrp = xfs_btree_rec_addr(cur, 1, right); in __xfs_btree_split()
2436 xfs_btree_copy_recs(cur, rrp, lrp, rrecs); in __xfs_btree_split()
2437 xfs_btree_log_recs(cur, rbp, 1, rrecs); in __xfs_btree_split()
2439 cur->bc_ops->init_key_from_rec(key, in __xfs_btree_split()
2440 xfs_btree_rec_addr(cur, 1, right)); in __xfs_btree_split()
2448 xfs_btree_get_sibling(cur, left, &rrptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2449 xfs_btree_set_sibling(cur, right, &rrptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2450 xfs_btree_set_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in __xfs_btree_split()
2451 xfs_btree_set_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2457 xfs_btree_log_block(cur, rbp, XFS_BB_ALL_BITS); in __xfs_btree_split()
2458 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); in __xfs_btree_split()
2464 if (!xfs_btree_ptr_is_null(cur, &rrptr)) { in __xfs_btree_split()
2465 error = xfs_btree_read_buf_block(cur, &rrptr, in __xfs_btree_split()
2469 xfs_btree_set_sibling(cur, rrblock, &rptr, XFS_BB_LEFTSIB); in __xfs_btree_split()
2470 xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); in __xfs_btree_split()
2477 if (cur->bc_ptrs[level] > lrecs + 1) { in __xfs_btree_split()
2478 xfs_btree_setbuf(cur, level, rbp); in __xfs_btree_split()
2479 cur->bc_ptrs[level] -= lrecs; in __xfs_btree_split()
2485 if (level + 1 < cur->bc_nlevels) { in __xfs_btree_split()
2486 error = xfs_btree_dup_cursor(cur, curp); in __xfs_btree_split()
2492 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in __xfs_btree_split()
2496 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in __xfs_btree_split()
2501 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in __xfs_btree_split()
2506 struct xfs_btree_cur *cur; member
2541 args->result = __xfs_btree_split(args->cur, args->level, args->ptrp, in xfs_btree_split_worker()
2555 struct xfs_btree_cur *cur, in xfs_btree_split() argument
2565 if (cur->bc_btnum != XFS_BTNUM_BMAP) in xfs_btree_split()
2566 return __xfs_btree_split(cur, level, ptrp, key, curp, stat); in xfs_btree_split()
2568 args.cur = cur; in xfs_btree_split()
2590 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_new_iroot() argument
2608 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_new_iroot()
2609 XFS_BTREE_STATS_INC(cur, newroot); in xfs_btree_new_iroot()
2611 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_new_iroot()
2613 level = cur->bc_nlevels - 1; in xfs_btree_new_iroot()
2615 block = xfs_btree_get_iroot(cur); in xfs_btree_new_iroot()
2616 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_new_iroot()
2619 error = cur->bc_ops->alloc_block(cur, pp, &nptr, stat); in xfs_btree_new_iroot()
2623 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_new_iroot()
2626 XFS_BTREE_STATS_INC(cur, alloc); in xfs_btree_new_iroot()
2629 error = xfs_btree_get_buf_block(cur, &nptr, 0, &cblock, &cbp); in xfs_btree_new_iroot()
2637 memcpy(cblock, block, xfs_btree_block_len(cur)); in xfs_btree_new_iroot()
2638 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { in xfs_btree_new_iroot()
2639 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_new_iroot()
2647 cur->bc_nlevels++; in xfs_btree_new_iroot()
2648 cur->bc_ptrs[level + 1] = 1; in xfs_btree_new_iroot()
2650 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_new_iroot()
2651 ckp = xfs_btree_key_addr(cur, 1, cblock); in xfs_btree_new_iroot()
2652 xfs_btree_copy_keys(cur, ckp, kp, xfs_btree_get_numrecs(cblock)); in xfs_btree_new_iroot()
2654 cpp = xfs_btree_ptr_addr(cur, 1, cblock); in xfs_btree_new_iroot()
2657 error = xfs_btree_check_ptr(cur, pp, i, level); in xfs_btree_new_iroot()
2662 xfs_btree_copy_ptrs(cur, cpp, pp, xfs_btree_get_numrecs(cblock)); in xfs_btree_new_iroot()
2665 error = xfs_btree_check_ptr(cur, &nptr, 0, level); in xfs_btree_new_iroot()
2669 xfs_btree_copy_ptrs(cur, pp, &nptr, 1); in xfs_btree_new_iroot()
2671 xfs_iroot_realloc(cur->bc_private.b.ip, in xfs_btree_new_iroot()
2673 cur->bc_private.b.whichfork); in xfs_btree_new_iroot()
2675 xfs_btree_setbuf(cur, level, cbp); in xfs_btree_new_iroot()
2681 xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); in xfs_btree_new_iroot()
2682 xfs_btree_log_keys(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); in xfs_btree_new_iroot()
2683 xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); in xfs_btree_new_iroot()
2686 XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork); in xfs_btree_new_iroot()
2688 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_new_iroot()
2691 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_new_iroot()
2700 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_new_root() argument
2716 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_new_root()
2717 XFS_BTREE_STATS_INC(cur, newroot); in xfs_btree_new_root()
2720 cur->bc_ops->init_ptr_from_cur(cur, &rptr); in xfs_btree_new_root()
2723 error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, stat); in xfs_btree_new_root()
2728 XFS_BTREE_STATS_INC(cur, alloc); in xfs_btree_new_root()
2731 error = xfs_btree_get_buf_block(cur, &lptr, 0, &new, &nbp); in xfs_btree_new_root()
2736 cur->bc_ops->set_root(cur, &lptr, 1); in xfs_btree_new_root()
2744 block = xfs_btree_get_block(cur, cur->bc_nlevels - 1, &bp); in xfs_btree_new_root()
2747 error = xfs_btree_check_block(cur, block, cur->bc_nlevels - 1, bp); in xfs_btree_new_root()
2752 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_new_root()
2753 if (!xfs_btree_ptr_is_null(cur, &rptr)) { in xfs_btree_new_root()
2756 xfs_btree_buf_to_ptr(cur, lbp, &lptr); in xfs_btree_new_root()
2758 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_new_root()
2766 xfs_btree_buf_to_ptr(cur, rbp, &rptr); in xfs_btree_new_root()
2768 xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in xfs_btree_new_root()
2769 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_new_root()
2776 xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); in xfs_btree_new_root()
2777 xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); in xfs_btree_new_root()
2778 ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_new_root()
2779 !xfs_btree_ptr_is_null(cur, &rptr)); in xfs_btree_new_root()
2783 xfs_btree_copy_keys(cur, in xfs_btree_new_root()
2784 xfs_btree_key_addr(cur, 1, new), in xfs_btree_new_root()
2785 xfs_btree_key_addr(cur, 1, left), 1); in xfs_btree_new_root()
2786 xfs_btree_copy_keys(cur, in xfs_btree_new_root()
2787 xfs_btree_key_addr(cur, 2, new), in xfs_btree_new_root()
2788 xfs_btree_key_addr(cur, 1, right), 1); in xfs_btree_new_root()
2790 cur->bc_ops->init_key_from_rec( in xfs_btree_new_root()
2791 xfs_btree_key_addr(cur, 1, new), in xfs_btree_new_root()
2792 xfs_btree_rec_addr(cur, 1, left)); in xfs_btree_new_root()
2793 cur->bc_ops->init_key_from_rec( in xfs_btree_new_root()
2794 xfs_btree_key_addr(cur, 2, new), in xfs_btree_new_root()
2795 xfs_btree_rec_addr(cur, 1, right)); in xfs_btree_new_root()
2797 xfs_btree_log_keys(cur, nbp, 1, 2); in xfs_btree_new_root()
2800 xfs_btree_copy_ptrs(cur, in xfs_btree_new_root()
2801 xfs_btree_ptr_addr(cur, 1, new), &lptr, 1); in xfs_btree_new_root()
2802 xfs_btree_copy_ptrs(cur, in xfs_btree_new_root()
2803 xfs_btree_ptr_addr(cur, 2, new), &rptr, 1); in xfs_btree_new_root()
2804 xfs_btree_log_ptrs(cur, nbp, 1, 2); in xfs_btree_new_root()
2807 xfs_btree_setbuf(cur, cur->bc_nlevels, nbp); in xfs_btree_new_root()
2808 cur->bc_ptrs[cur->bc_nlevels] = nptr; in xfs_btree_new_root()
2809 cur->bc_nlevels++; in xfs_btree_new_root()
2810 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_new_root()
2814 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_new_root()
2817 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_new_root()
2824 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_make_block_unfull() argument
2837 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_make_block_unfull()
2838 level == cur->bc_nlevels - 1) { in xfs_btree_make_block_unfull()
2839 struct xfs_inode *ip = cur->bc_private.b.ip; in xfs_btree_make_block_unfull()
2841 if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) { in xfs_btree_make_block_unfull()
2843 xfs_iroot_realloc(ip, 1, cur->bc_private.b.whichfork); in xfs_btree_make_block_unfull()
2848 error = xfs_btree_new_iroot(cur, &logflags, stat); in xfs_btree_make_block_unfull()
2852 xfs_trans_log_inode(cur->bc_tp, ip, logflags); in xfs_btree_make_block_unfull()
2859 error = xfs_btree_rshift(cur, level, stat); in xfs_btree_make_block_unfull()
2864 error = xfs_btree_lshift(cur, level, stat); in xfs_btree_make_block_unfull()
2869 *oindex = *index = cur->bc_ptrs[level]; in xfs_btree_make_block_unfull()
2879 error = xfs_btree_split(cur, level, nptr, &key, ncur, stat); in xfs_btree_make_block_unfull()
2884 *index = cur->bc_ptrs[level]; in xfs_btree_make_block_unfull()
2885 cur->bc_ops->init_rec_from_key(&key, nrec); in xfs_btree_make_block_unfull()
2895 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_insrec() argument
2916 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_insrec()
2917 XFS_BTREE_TRACE_ARGIPR(cur, level, *ptrp, recp); in xfs_btree_insrec()
2925 if (!(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_insrec()
2926 (level >= cur->bc_nlevels)) { in xfs_btree_insrec()
2927 error = xfs_btree_new_root(cur, stat); in xfs_btree_insrec()
2928 xfs_btree_set_ptr_null(cur, ptrp); in xfs_btree_insrec()
2930 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_insrec()
2935 ptr = cur->bc_ptrs[level]; in xfs_btree_insrec()
2937 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_insrec()
2943 cur->bc_ops->init_key_from_rec(&key, recp); in xfs_btree_insrec()
2947 XFS_BTREE_STATS_INC(cur, insrec); in xfs_btree_insrec()
2950 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
2954 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
2961 ASSERT(cur->bc_ops->recs_inorder(cur, recp, in xfs_btree_insrec()
2962 xfs_btree_rec_addr(cur, ptr, block))); in xfs_btree_insrec()
2964 ASSERT(cur->bc_ops->keys_inorder(cur, &key, in xfs_btree_insrec()
2965 xfs_btree_key_addr(cur, ptr, block))); in xfs_btree_insrec()
2974 xfs_btree_set_ptr_null(cur, &nptr); in xfs_btree_insrec()
2975 if (numrecs == cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_insrec()
2976 error = xfs_btree_make_block_unfull(cur, level, numrecs, in xfs_btree_insrec()
2986 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
2990 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
2999 XFS_BTREE_STATS_ADD(cur, moves, numrecs - ptr + 1); in xfs_btree_insrec()
3006 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_insrec()
3007 pp = xfs_btree_ptr_addr(cur, ptr, block); in xfs_btree_insrec()
3011 error = xfs_btree_check_ptr(cur, pp, i, level); in xfs_btree_insrec()
3017 xfs_btree_shift_keys(cur, kp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3018 xfs_btree_shift_ptrs(cur, pp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3021 error = xfs_btree_check_ptr(cur, ptrp, 0, level); in xfs_btree_insrec()
3027 xfs_btree_copy_keys(cur, kp, &key, 1); in xfs_btree_insrec()
3028 xfs_btree_copy_ptrs(cur, pp, ptrp, 1); in xfs_btree_insrec()
3031 xfs_btree_log_ptrs(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3032 xfs_btree_log_keys(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3035 ASSERT(cur->bc_ops->keys_inorder(cur, kp, in xfs_btree_insrec()
3036 xfs_btree_key_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
3043 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_insrec()
3045 xfs_btree_shift_recs(cur, rp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3048 xfs_btree_copy_recs(cur, rp, recp, 1); in xfs_btree_insrec()
3050 xfs_btree_log_recs(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3053 ASSERT(cur->bc_ops->recs_inorder(cur, rp, in xfs_btree_insrec()
3054 xfs_btree_rec_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
3060 xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); in xfs_btree_insrec()
3064 error = xfs_btree_updkey(cur, &key, level + 1); in xfs_btree_insrec()
3073 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_insrec()
3074 cur->bc_ops->update_lastrec(cur, block, recp, in xfs_btree_insrec()
3083 if (!xfs_btree_ptr_is_null(cur, &nptr)) { in xfs_btree_insrec()
3088 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_insrec()
3093 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_insrec()
3106 struct xfs_btree_cur *cur, in xfs_btree_insert() argument
3119 pcur = cur; in xfs_btree_insert()
3121 xfs_btree_set_ptr_null(cur, &nptr); in xfs_btree_insert()
3122 cur->bc_ops->init_rec_from_cur(cur, &rec); in xfs_btree_insert()
3136 if (pcur != cur) in xfs_btree_insert()
3141 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_insert()
3149 if (pcur != cur && in xfs_btree_insert()
3150 (ncur || xfs_btree_ptr_is_null(cur, &nptr))) { in xfs_btree_insert()
3152 if (cur->bc_ops->update_cursor) in xfs_btree_insert()
3153 cur->bc_ops->update_cursor(pcur, cur); in xfs_btree_insert()
3154 cur->bc_nlevels = pcur->bc_nlevels; in xfs_btree_insert()
3162 } while (!xfs_btree_ptr_is_null(cur, &nptr)); in xfs_btree_insert()
3164 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_insert()
3168 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_insert()
3182 struct xfs_btree_cur *cur) in xfs_btree_kill_iroot() argument
3184 int whichfork = cur->bc_private.b.whichfork; in xfs_btree_kill_iroot()
3185 struct xfs_inode *ip = cur->bc_private.b.ip; in xfs_btree_kill_iroot()
3202 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_kill_iroot()
3204 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_kill_iroot()
3205 ASSERT(cur->bc_nlevels > 1); in xfs_btree_kill_iroot()
3211 level = cur->bc_nlevels - 1; in xfs_btree_kill_iroot()
3218 block = xfs_btree_get_iroot(cur); in xfs_btree_kill_iroot()
3222 cblock = xfs_btree_get_block(cur, level - 1, &cbp); in xfs_btree_kill_iroot()
3230 if (numrecs > cur->bc_ops->get_dmaxrecs(cur, level)) in xfs_btree_kill_iroot()
3233 XFS_BTREE_STATS_INC(cur, killroot); in xfs_btree_kill_iroot()
3236 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_kill_iroot()
3237 ASSERT(xfs_btree_ptr_is_null(cur, &ptr)); in xfs_btree_kill_iroot()
3238 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_kill_iroot()
3239 ASSERT(xfs_btree_ptr_is_null(cur, &ptr)); in xfs_btree_kill_iroot()
3242 index = numrecs - cur->bc_ops->get_maxrecs(cur, level); in xfs_btree_kill_iroot()
3244 xfs_iroot_realloc(cur->bc_private.b.ip, index, in xfs_btree_kill_iroot()
3245 cur->bc_private.b.whichfork); in xfs_btree_kill_iroot()
3252 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_kill_iroot()
3253 ckp = xfs_btree_key_addr(cur, 1, cblock); in xfs_btree_kill_iroot()
3254 xfs_btree_copy_keys(cur, kp, ckp, numrecs); in xfs_btree_kill_iroot()
3256 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_kill_iroot()
3257 cpp = xfs_btree_ptr_addr(cur, 1, cblock); in xfs_btree_kill_iroot()
3262 error = xfs_btree_check_ptr(cur, cpp, i, level - 1); in xfs_btree_kill_iroot()
3264 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_kill_iroot()
3269 xfs_btree_copy_ptrs(cur, pp, cpp, numrecs); in xfs_btree_kill_iroot()
3271 cur->bc_ops->free_block(cur, cbp); in xfs_btree_kill_iroot()
3272 XFS_BTREE_STATS_INC(cur, free); in xfs_btree_kill_iroot()
3274 cur->bc_bufs[level - 1] = NULL; in xfs_btree_kill_iroot()
3276 xfs_trans_log_inode(cur->bc_tp, ip, in xfs_btree_kill_iroot()
3277 XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork)); in xfs_btree_kill_iroot()
3278 cur->bc_nlevels--; in xfs_btree_kill_iroot()
3280 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_kill_iroot()
3289 struct xfs_btree_cur *cur, in xfs_btree_kill_root() argument
3296 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_kill_root()
3297 XFS_BTREE_STATS_INC(cur, killroot); in xfs_btree_kill_root()
3303 cur->bc_ops->set_root(cur, newroot, -1); in xfs_btree_kill_root()
3305 error = cur->bc_ops->free_block(cur, bp); in xfs_btree_kill_root()
3307 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_kill_root()
3311 XFS_BTREE_STATS_INC(cur, free); in xfs_btree_kill_root()
3313 cur->bc_bufs[level] = NULL; in xfs_btree_kill_root()
3314 cur->bc_ra[level] = 0; in xfs_btree_kill_root()
3315 cur->bc_nlevels--; in xfs_btree_kill_root()
3317 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_kill_root()
3323 struct xfs_btree_cur *cur, in xfs_btree_dec_cursor() argument
3331 error = xfs_btree_decrement(cur, level, &i); in xfs_btree_dec_cursor()
3336 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_dec_cursor()
3349 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_delrec() argument
3374 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_delrec()
3375 XFS_BTREE_TRACE_ARGI(cur, level); in xfs_btree_delrec()
3380 ptr = cur->bc_ptrs[level]; in xfs_btree_delrec()
3382 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delrec()
3388 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_delrec()
3392 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_delrec()
3399 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delrec()
3404 XFS_BTREE_STATS_INC(cur, delrec); in xfs_btree_delrec()
3405 XFS_BTREE_STATS_ADD(cur, moves, numrecs - ptr); in xfs_btree_delrec()
3413 lkp = xfs_btree_key_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3414 lpp = xfs_btree_ptr_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3418 error = xfs_btree_check_ptr(cur, lpp, i, level); in xfs_btree_delrec()
3425 xfs_btree_shift_keys(cur, lkp, -1, numrecs - ptr); in xfs_btree_delrec()
3426 xfs_btree_shift_ptrs(cur, lpp, -1, numrecs - ptr); in xfs_btree_delrec()
3427 xfs_btree_log_keys(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3428 xfs_btree_log_ptrs(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3436 keyp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_delrec()
3440 xfs_btree_shift_recs(cur, in xfs_btree_delrec()
3441 xfs_btree_rec_addr(cur, ptr + 1, block), in xfs_btree_delrec()
3443 xfs_btree_log_recs(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3451 cur->bc_ops->init_key_from_rec(&key, in xfs_btree_delrec()
3452 xfs_btree_rec_addr(cur, 1, block)); in xfs_btree_delrec()
3461 xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); in xfs_btree_delrec()
3467 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_delrec()
3468 cur->bc_ops->update_lastrec(cur, block, NULL, in xfs_btree_delrec()
3477 if (level == cur->bc_nlevels - 1) { in xfs_btree_delrec()
3478 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { in xfs_btree_delrec()
3479 xfs_iroot_realloc(cur->bc_private.b.ip, -1, in xfs_btree_delrec()
3480 cur->bc_private.b.whichfork); in xfs_btree_delrec()
3482 error = xfs_btree_kill_iroot(cur); in xfs_btree_delrec()
3486 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3504 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_delrec()
3505 error = xfs_btree_kill_root(cur, bp, level, pp); in xfs_btree_delrec()
3509 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3522 error = xfs_btree_updkey(cur, keyp, level + 1); in xfs_btree_delrec()
3531 if (numrecs >= cur->bc_ops->get_minrecs(cur, level)) { in xfs_btree_delrec()
3532 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3543 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3544 xfs_btree_get_sibling(cur, block, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3546 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { in xfs_btree_delrec()
3552 if (xfs_btree_ptr_is_null(cur, &rptr) && in xfs_btree_delrec()
3553 xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_delrec()
3554 level == cur->bc_nlevels - 2) { in xfs_btree_delrec()
3555 error = xfs_btree_kill_iroot(cur); in xfs_btree_delrec()
3557 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3564 ASSERT(!xfs_btree_ptr_is_null(cur, &rptr) || in xfs_btree_delrec()
3565 !xfs_btree_ptr_is_null(cur, &lptr)); in xfs_btree_delrec()
3571 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_delrec()
3579 if (!xfs_btree_ptr_is_null(cur, &rptr)) { in xfs_btree_delrec()
3585 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3590 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3593 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3611 cur->bc_ops->get_minrecs(tcur, level)) { in xfs_btree_delrec()
3617 cur->bc_ops->get_minrecs(tcur, level)); in xfs_btree_delrec()
3622 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3635 if (!xfs_btree_ptr_is_null(cur, &lptr)) { in xfs_btree_delrec()
3637 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3642 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3650 if (!xfs_btree_ptr_is_null(cur, &lptr)) { in xfs_btree_delrec()
3656 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3662 XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); in xfs_btree_delrec()
3667 error = xfs_btree_check_block(cur, left, level, lbp); in xfs_btree_delrec()
3680 cur->bc_ops->get_minrecs(tcur, level)) { in xfs_btree_delrec()
3686 cur->bc_ops->get_minrecs(tcur, level)); in xfs_btree_delrec()
3690 cur->bc_ptrs[0]++; in xfs_btree_delrec()
3691 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delrec()
3709 ASSERT(!xfs_btree_ptr_is_null(cur, &cptr)); in xfs_btree_delrec()
3711 if (!xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_delrec()
3713 cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_delrec()
3721 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_delrec()
3728 } else if (!xfs_btree_ptr_is_null(cur, &rptr) && in xfs_btree_delrec()
3730 cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_delrec()
3738 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_delrec()
3747 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3760 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in xfs_btree_delrec()
3768 lkp = xfs_btree_key_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
3769 lpp = xfs_btree_ptr_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
3770 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_delrec()
3771 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_delrec()
3774 error = xfs_btree_check_ptr(cur, rpp, i, level); in xfs_btree_delrec()
3779 xfs_btree_copy_keys(cur, lkp, rkp, rrecs); in xfs_btree_delrec()
3780 xfs_btree_copy_ptrs(cur, lpp, rpp, rrecs); in xfs_btree_delrec()
3782 xfs_btree_log_keys(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
3783 xfs_btree_log_ptrs(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
3789 lrp = xfs_btree_rec_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
3790 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_delrec()
3792 xfs_btree_copy_recs(cur, lrp, rrp, rrecs); in xfs_btree_delrec()
3793 xfs_btree_log_recs(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
3796 XFS_BTREE_STATS_INC(cur, join); in xfs_btree_delrec()
3803 xfs_btree_get_sibling(cur, right, &cptr, XFS_BB_RIGHTSIB), in xfs_btree_delrec()
3804 xfs_btree_set_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3805 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3808 xfs_btree_get_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3809 if (!xfs_btree_ptr_is_null(cur, &cptr)) { in xfs_btree_delrec()
3810 error = xfs_btree_read_buf_block(cur, &cptr, 0, &rrblock, &rrbp); in xfs_btree_delrec()
3813 xfs_btree_set_sibling(cur, rrblock, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3814 xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3818 error = cur->bc_ops->free_block(cur, rbp); in xfs_btree_delrec()
3821 XFS_BTREE_STATS_INC(cur, free); in xfs_btree_delrec()
3828 cur->bc_bufs[level] = lbp; in xfs_btree_delrec()
3829 cur->bc_ptrs[level] += lrecs; in xfs_btree_delrec()
3830 cur->bc_ra[level] = 0; in xfs_btree_delrec()
3836 else if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) || in xfs_btree_delrec()
3837 (level + 1 < cur->bc_nlevels)) { in xfs_btree_delrec()
3838 error = xfs_btree_increment(cur, level + 1, &i); in xfs_btree_delrec()
3850 cur->bc_ptrs[level]--; in xfs_btree_delrec()
3852 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delrec()
3858 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_delrec()
3871 struct xfs_btree_cur *cur, in xfs_btree_delete() argument
3878 XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); in xfs_btree_delete()
3887 error = xfs_btree_delrec(cur, level, &i); in xfs_btree_delete()
3893 for (level = 1; level < cur->bc_nlevels; level++) { in xfs_btree_delete()
3894 if (cur->bc_ptrs[level] == 0) { in xfs_btree_delete()
3895 error = xfs_btree_decrement(cur, level, &i); in xfs_btree_delete()
3903 XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); in xfs_btree_delete()
3907 XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); in xfs_btree_delete()
3916 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_get_rec() argument
3927 ptr = cur->bc_ptrs[0]; in xfs_btree_get_rec()
3928 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_get_rec()
3931 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_get_rec()
3947 *recp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_get_rec()
3978 struct xfs_btree_cur *cur, in xfs_btree_block_change_owner() argument
3988 xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); in xfs_btree_block_change_owner()
3991 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_block_change_owner()
3992 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_block_change_owner()
4005 if (cur->bc_tp) { in xfs_btree_block_change_owner()
4006 xfs_trans_ordered_buf(cur->bc_tp, bp); in xfs_btree_block_change_owner()
4007 xfs_btree_log_block(cur, bp, XFS_BB_OWNER); in xfs_btree_block_change_owner()
4012 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_block_change_owner()
4013 ASSERT(level == cur->bc_nlevels - 1); in xfs_btree_block_change_owner()
4017 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_block_change_owner()
4018 if (xfs_btree_ptr_is_null(cur, &rptr)) in xfs_btree_block_change_owner()
4021 return xfs_btree_lookup_get_block(cur, level, &rptr, &block); in xfs_btree_block_change_owner()
4026 struct xfs_btree_cur *cur, in xfs_btree_change_owner() argument
4035 cur->bc_ops->init_ptr_from_cur(cur, &lptr); in xfs_btree_change_owner()
4038 for (level = cur->bc_nlevels - 1; level >= 0; level--) { in xfs_btree_change_owner()
4040 error = xfs_btree_lookup_get_block(cur, level, &lptr, &block); in xfs_btree_change_owner()
4048 ptr = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_change_owner()
4049 xfs_btree_readahead_ptr(cur, ptr, 1); in xfs_btree_change_owner()
4057 error = xfs_btree_block_change_owner(cur, level, in xfs_btree_change_owner()