Lines Matching refs:cur
59 struct xfs_btree_cur *cur, in __xfs_btree_check_lblock() argument
64 struct xfs_mount *mp = cur->bc_mp; in __xfs_btree_check_lblock()
65 xfs_btnum_t btnum = cur->bc_btnum; in __xfs_btree_check_lblock()
83 cur->bc_ops->get_maxrecs(cur, level)) in __xfs_btree_check_lblock()
86 !xfs_btree_check_lptr(cur, be64_to_cpu(block->bb_u.l.bb_leftsib), in __xfs_btree_check_lblock()
90 !xfs_btree_check_lptr(cur, be64_to_cpu(block->bb_u.l.bb_rightsib), in __xfs_btree_check_lblock()
100 struct xfs_btree_cur *cur, in xfs_btree_check_lblock() argument
105 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_check_lblock()
108 fa = __xfs_btree_check_lblock(cur, block, level, bp); in xfs_btree_check_lblock()
124 struct xfs_btree_cur *cur, in __xfs_btree_check_sblock() argument
129 struct xfs_mount *mp = cur->bc_mp; in __xfs_btree_check_sblock()
130 xfs_btnum_t btnum = cur->bc_btnum; in __xfs_btree_check_sblock()
146 cur->bc_ops->get_maxrecs(cur, level)) in __xfs_btree_check_sblock()
149 !xfs_btree_check_sptr(cur, be32_to_cpu(block->bb_u.s.bb_leftsib), in __xfs_btree_check_sblock()
153 !xfs_btree_check_sptr(cur, be32_to_cpu(block->bb_u.s.bb_rightsib), in __xfs_btree_check_sblock()
163 struct xfs_btree_cur *cur, in xfs_btree_check_sblock() argument
168 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_check_sblock()
171 fa = __xfs_btree_check_sblock(cur, block, level, bp); in xfs_btree_check_sblock()
186 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_check_block() argument
191 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_check_block()
192 return xfs_btree_check_lblock(cur, block, level, bp); in xfs_btree_check_block()
194 return xfs_btree_check_sblock(cur, block, level, bp); in xfs_btree_check_block()
200 struct xfs_btree_cur *cur, in xfs_btree_check_lptr() argument
206 return xfs_verify_fsbno(cur->bc_mp, fsbno); in xfs_btree_check_lptr()
212 struct xfs_btree_cur *cur, in xfs_btree_check_sptr() argument
218 return xfs_verify_agbno(cur->bc_mp, cur->bc_ag.agno, agbno); in xfs_btree_check_sptr()
227 struct xfs_btree_cur *cur, in xfs_btree_check_ptr() argument
232 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_check_ptr()
233 if (xfs_btree_check_lptr(cur, be64_to_cpu((&ptr->l)[index]), in xfs_btree_check_ptr()
236 xfs_err(cur->bc_mp, in xfs_btree_check_ptr()
238 cur->bc_ino.ip->i_ino, in xfs_btree_check_ptr()
239 cur->bc_ino.whichfork, cur->bc_btnum, in xfs_btree_check_ptr()
242 if (xfs_btree_check_sptr(cur, be32_to_cpu((&ptr->s)[index]), in xfs_btree_check_ptr()
245 xfs_err(cur->bc_mp, in xfs_btree_check_ptr()
247 cur->bc_ag.agno, cur->bc_btnum, in xfs_btree_check_ptr()
338 struct xfs_btree_cur *cur, in xfs_btree_free_block() argument
343 error = cur->bc_ops->free_block(cur, bp); in xfs_btree_free_block()
345 xfs_trans_binval(cur->bc_tp, bp); in xfs_btree_free_block()
346 XFS_BTREE_STATS_INC(cur, free); in xfs_btree_free_block()
356 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_del_cursor() argument
368 for (i = 0; i < cur->bc_nlevels; i++) { in xfs_btree_del_cursor()
369 if (cur->bc_bufs[i]) in xfs_btree_del_cursor()
370 xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[i]); in xfs_btree_del_cursor()
381 ASSERT(cur->bc_btnum != XFS_BTNUM_BMAP || cur->bc_ino.allocated == 0 || in xfs_btree_del_cursor()
382 XFS_FORCED_SHUTDOWN(cur->bc_mp) || error != 0); in xfs_btree_del_cursor()
383 if (unlikely(cur->bc_flags & XFS_BTREE_STAGING)) in xfs_btree_del_cursor()
384 kmem_free(cur->bc_ops); in xfs_btree_del_cursor()
385 kmem_cache_free(xfs_btree_cur_zone, cur); in xfs_btree_del_cursor()
394 xfs_btree_cur_t *cur, /* input cursor */ in xfs_btree_dup_cursor() argument
404 tp = cur->bc_tp; in xfs_btree_dup_cursor()
405 mp = cur->bc_mp; in xfs_btree_dup_cursor()
410 new = cur->bc_ops->dup_cursor(cur); in xfs_btree_dup_cursor()
415 new->bc_rec = cur->bc_rec; in xfs_btree_dup_cursor()
421 new->bc_ptrs[i] = cur->bc_ptrs[i]; in xfs_btree_dup_cursor()
422 new->bc_ra[i] = cur->bc_ra[i]; in xfs_btree_dup_cursor()
423 bp = cur->bc_bufs[i]; in xfs_btree_dup_cursor()
428 cur->bc_ops->buf_ops); in xfs_btree_dup_cursor()
518 static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) in xfs_btree_block_len() argument
520 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_block_len()
521 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) in xfs_btree_block_len()
525 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) in xfs_btree_block_len()
533 static inline size_t xfs_btree_ptr_len(struct xfs_btree_cur *cur) in xfs_btree_ptr_len() argument
535 return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? in xfs_btree_ptr_len()
544 struct xfs_btree_cur *cur, in xfs_btree_rec_offset() argument
547 return xfs_btree_block_len(cur) + in xfs_btree_rec_offset()
548 (n - 1) * cur->bc_ops->rec_len; in xfs_btree_rec_offset()
556 struct xfs_btree_cur *cur, in xfs_btree_key_offset() argument
559 return xfs_btree_block_len(cur) + in xfs_btree_key_offset()
560 (n - 1) * cur->bc_ops->key_len; in xfs_btree_key_offset()
568 struct xfs_btree_cur *cur, in xfs_btree_high_key_offset() argument
571 return xfs_btree_block_len(cur) + in xfs_btree_high_key_offset()
572 (n - 1) * cur->bc_ops->key_len + (cur->bc_ops->key_len / 2); in xfs_btree_high_key_offset()
580 struct xfs_btree_cur *cur, in xfs_btree_ptr_offset() argument
584 return xfs_btree_block_len(cur) + in xfs_btree_ptr_offset()
585 cur->bc_ops->get_maxrecs(cur, level) * cur->bc_ops->key_len + in xfs_btree_ptr_offset()
586 (n - 1) * xfs_btree_ptr_len(cur); in xfs_btree_ptr_offset()
594 struct xfs_btree_cur *cur, in xfs_btree_rec_addr() argument
599 ((char *)block + xfs_btree_rec_offset(cur, n)); in xfs_btree_rec_addr()
607 struct xfs_btree_cur *cur, in xfs_btree_key_addr() argument
612 ((char *)block + xfs_btree_key_offset(cur, n)); in xfs_btree_key_addr()
620 struct xfs_btree_cur *cur, in xfs_btree_high_key_addr() argument
625 ((char *)block + xfs_btree_high_key_offset(cur, n)); in xfs_btree_high_key_addr()
633 struct xfs_btree_cur *cur, in xfs_btree_ptr_addr() argument
642 ((char *)block + xfs_btree_ptr_offset(cur, n, level)); in xfs_btree_ptr_addr()
647 struct xfs_btree_cur *cur) in xfs_btree_ifork_ptr() argument
649 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_ifork_ptr()
651 if (cur->bc_flags & XFS_BTREE_STAGING) in xfs_btree_ifork_ptr()
652 return cur->bc_ino.ifake->if_fork; in xfs_btree_ifork_ptr()
653 return XFS_IFORK_PTR(cur->bc_ino.ip, cur->bc_ino.whichfork); in xfs_btree_ifork_ptr()
664 struct xfs_btree_cur *cur) in xfs_btree_get_iroot() argument
666 struct xfs_ifork *ifp = xfs_btree_ifork_ptr(cur); in xfs_btree_get_iroot()
677 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_get_block() argument
681 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_get_block()
682 (level == cur->bc_nlevels - 1)) { in xfs_btree_get_block()
684 return xfs_btree_get_iroot(cur); in xfs_btree_get_block()
687 *bpp = cur->bc_bufs[level]; in xfs_btree_get_block()
697 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_firstrec() argument
706 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_firstrec()
707 if (xfs_btree_check_block(cur, block, level, bp)) in xfs_btree_firstrec()
717 cur->bc_ptrs[level] = 1; in xfs_btree_firstrec()
727 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_lastrec() argument
736 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_lastrec()
737 if (xfs_btree_check_block(cur, block, level, bp)) in xfs_btree_lastrec()
747 cur->bc_ptrs[level] = be16_to_cpu(block->bb_numrecs); in xfs_btree_lastrec()
859 struct xfs_btree_cur *cur, in xfs_btree_readahead_lblock() argument
868 xfs_btree_reada_bufl(cur->bc_mp, left, 1, in xfs_btree_readahead_lblock()
869 cur->bc_ops->buf_ops); in xfs_btree_readahead_lblock()
874 xfs_btree_reada_bufl(cur->bc_mp, right, 1, in xfs_btree_readahead_lblock()
875 cur->bc_ops->buf_ops); in xfs_btree_readahead_lblock()
884 struct xfs_btree_cur *cur, in xfs_btree_readahead_sblock() argument
894 xfs_btree_reada_bufs(cur->bc_mp, cur->bc_ag.agno, in xfs_btree_readahead_sblock()
895 left, 1, cur->bc_ops->buf_ops); in xfs_btree_readahead_sblock()
900 xfs_btree_reada_bufs(cur->bc_mp, cur->bc_ag.agno, in xfs_btree_readahead_sblock()
901 right, 1, cur->bc_ops->buf_ops); in xfs_btree_readahead_sblock()
914 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_readahead() argument
924 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_readahead()
925 (lev == cur->bc_nlevels - 1)) in xfs_btree_readahead()
928 if ((cur->bc_ra[lev] | lr) == cur->bc_ra[lev]) in xfs_btree_readahead()
931 cur->bc_ra[lev] |= lr; in xfs_btree_readahead()
932 block = XFS_BUF_TO_BLOCK(cur->bc_bufs[lev]); in xfs_btree_readahead()
934 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_readahead()
935 return xfs_btree_readahead_lblock(cur, lr, block); in xfs_btree_readahead()
936 return xfs_btree_readahead_sblock(cur, lr, block); in xfs_btree_readahead()
941 struct xfs_btree_cur *cur, in xfs_btree_ptr_to_daddr() argument
949 error = xfs_btree_check_ptr(cur, ptr, 0, 1); in xfs_btree_ptr_to_daddr()
953 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_ptr_to_daddr()
955 *daddr = XFS_FSB_TO_DADDR(cur->bc_mp, fsbno); in xfs_btree_ptr_to_daddr()
958 *daddr = XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_ag.agno, in xfs_btree_ptr_to_daddr()
973 struct xfs_btree_cur *cur, in xfs_btree_readahead_ptr() argument
979 if (xfs_btree_ptr_to_daddr(cur, ptr, &daddr)) in xfs_btree_readahead_ptr()
981 xfs_buf_readahead(cur->bc_mp->m_ddev_targp, daddr, in xfs_btree_readahead_ptr()
982 cur->bc_mp->m_bsize * count, cur->bc_ops->buf_ops); in xfs_btree_readahead_ptr()
991 xfs_btree_cur_t *cur, /* btree cursor */ in xfs_btree_setbuf() argument
997 if (cur->bc_bufs[lev]) in xfs_btree_setbuf()
998 xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[lev]); in xfs_btree_setbuf()
999 cur->bc_bufs[lev] = bp; in xfs_btree_setbuf()
1000 cur->bc_ra[lev] = 0; in xfs_btree_setbuf()
1003 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_setbuf()
1005 cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA; in xfs_btree_setbuf()
1007 cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA; in xfs_btree_setbuf()
1010 cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA; in xfs_btree_setbuf()
1012 cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA; in xfs_btree_setbuf()
1018 struct xfs_btree_cur *cur, in xfs_btree_ptr_is_null() argument
1021 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_ptr_is_null()
1029 struct xfs_btree_cur *cur, in xfs_btree_set_ptr_null() argument
1032 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_set_ptr_null()
1043 struct xfs_btree_cur *cur, in xfs_btree_get_sibling() argument
1050 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_get_sibling()
1065 struct xfs_btree_cur *cur, in xfs_btree_set_sibling() argument
1072 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_set_sibling()
1143 struct xfs_btree_cur *cur, in xfs_btree_init_block_cur() argument
1156 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_init_block_cur()
1157 owner = cur->bc_ino.ip->i_ino; in xfs_btree_init_block_cur()
1159 owner = cur->bc_ag.agno; in xfs_btree_init_block_cur()
1161 xfs_btree_init_block_int(cur->bc_mp, XFS_BUF_TO_BLOCK(bp), bp->b_bn, in xfs_btree_init_block_cur()
1162 cur->bc_btnum, level, numrecs, in xfs_btree_init_block_cur()
1163 owner, cur->bc_flags); in xfs_btree_init_block_cur()
1173 struct xfs_btree_cur *cur, in xfs_btree_is_lastrec() argument
1181 if (!(cur->bc_flags & XFS_BTREE_LASTREC_UPDATE)) in xfs_btree_is_lastrec()
1184 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_is_lastrec()
1185 if (!xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_is_lastrec()
1192 struct xfs_btree_cur *cur, in xfs_btree_buf_to_ptr() argument
1196 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_buf_to_ptr()
1197 ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp, in xfs_btree_buf_to_ptr()
1200 ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp, in xfs_btree_buf_to_ptr()
1207 struct xfs_btree_cur *cur, in xfs_btree_set_refs() argument
1210 switch (cur->bc_btnum) { in xfs_btree_set_refs()
1235 struct xfs_btree_cur *cur, in xfs_btree_get_buf_block() argument
1240 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_get_buf_block()
1244 error = xfs_btree_ptr_to_daddr(cur, ptr, &d); in xfs_btree_get_buf_block()
1247 error = xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, mp->m_bsize, in xfs_btree_get_buf_block()
1252 (*bpp)->b_ops = cur->bc_ops->buf_ops; in xfs_btree_get_buf_block()
1263 struct xfs_btree_cur *cur, in xfs_btree_read_buf_block() argument
1269 struct xfs_mount *mp = cur->bc_mp; in xfs_btree_read_buf_block()
1276 error = xfs_btree_ptr_to_daddr(cur, ptr, &d); in xfs_btree_read_buf_block()
1279 error = xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d, in xfs_btree_read_buf_block()
1281 cur->bc_ops->buf_ops); in xfs_btree_read_buf_block()
1285 xfs_btree_set_refs(cur, *bpp); in xfs_btree_read_buf_block()
1295 struct xfs_btree_cur *cur, in xfs_btree_copy_keys() argument
1301 memcpy(dst_key, src_key, numkeys * cur->bc_ops->key_len); in xfs_btree_copy_keys()
1309 struct xfs_btree_cur *cur, in xfs_btree_copy_recs() argument
1315 memcpy(dst_rec, src_rec, numrecs * cur->bc_ops->rec_len); in xfs_btree_copy_recs()
1323 struct xfs_btree_cur *cur, in xfs_btree_copy_ptrs() argument
1329 memcpy(dst_ptr, src_ptr, numptrs * xfs_btree_ptr_len(cur)); in xfs_btree_copy_ptrs()
1337 struct xfs_btree_cur *cur, in xfs_btree_shift_keys() argument
1347 dst_key = (char *)key + (dir * cur->bc_ops->key_len); in xfs_btree_shift_keys()
1348 memmove(dst_key, key, numkeys * cur->bc_ops->key_len); in xfs_btree_shift_keys()
1356 struct xfs_btree_cur *cur, in xfs_btree_shift_recs() argument
1366 dst_rec = (char *)rec + (dir * cur->bc_ops->rec_len); in xfs_btree_shift_recs()
1367 memmove(dst_rec, rec, numrecs * cur->bc_ops->rec_len); in xfs_btree_shift_recs()
1375 struct xfs_btree_cur *cur, in xfs_btree_shift_ptrs() argument
1385 dst_ptr = (char *)ptr + (dir * xfs_btree_ptr_len(cur)); in xfs_btree_shift_ptrs()
1386 memmove(dst_ptr, ptr, numptrs * xfs_btree_ptr_len(cur)); in xfs_btree_shift_ptrs()
1394 struct xfs_btree_cur *cur, in xfs_btree_log_keys() argument
1401 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_keys()
1402 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_keys()
1403 xfs_btree_key_offset(cur, first), in xfs_btree_log_keys()
1404 xfs_btree_key_offset(cur, last + 1) - 1); in xfs_btree_log_keys()
1406 xfs_trans_log_inode(cur->bc_tp, cur->bc_ino.ip, in xfs_btree_log_keys()
1407 xfs_ilog_fbroot(cur->bc_ino.whichfork)); in xfs_btree_log_keys()
1416 struct xfs_btree_cur *cur, in xfs_btree_log_recs() argument
1422 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_recs()
1423 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_recs()
1424 xfs_btree_rec_offset(cur, first), in xfs_btree_log_recs()
1425 xfs_btree_rec_offset(cur, last + 1) - 1); in xfs_btree_log_recs()
1434 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_log_ptrs() argument
1444 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_ptrs()
1445 xfs_trans_log_buf(cur->bc_tp, bp, in xfs_btree_log_ptrs()
1446 xfs_btree_ptr_offset(cur, first, level), in xfs_btree_log_ptrs()
1447 xfs_btree_ptr_offset(cur, last + 1, level) - 1); in xfs_btree_log_ptrs()
1449 xfs_trans_log_inode(cur->bc_tp, cur->bc_ino.ip, in xfs_btree_log_ptrs()
1450 xfs_ilog_fbroot(cur->bc_ino.whichfork)); in xfs_btree_log_ptrs()
1460 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_log_block() argument
1497 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { in xfs_btree_log_block()
1512 (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? in xfs_btree_log_block()
1515 xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); in xfs_btree_log_block()
1516 xfs_trans_log_buf(cur->bc_tp, bp, first, last); in xfs_btree_log_block()
1518 xfs_trans_log_inode(cur->bc_tp, cur->bc_ino.ip, in xfs_btree_log_block()
1519 xfs_ilog_fbroot(cur->bc_ino.whichfork)); in xfs_btree_log_block()
1529 struct xfs_btree_cur *cur, in xfs_btree_increment() argument
1539 ASSERT(level < cur->bc_nlevels); in xfs_btree_increment()
1542 xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); in xfs_btree_increment()
1545 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_increment()
1548 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_increment()
1554 if (++cur->bc_ptrs[level] <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1558 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_increment()
1559 if (xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_increment()
1562 XFS_BTREE_STATS_INC(cur, increment); in xfs_btree_increment()
1568 for (lev = level + 1; lev < cur->bc_nlevels; lev++) { in xfs_btree_increment()
1569 block = xfs_btree_get_block(cur, lev, &bp); in xfs_btree_increment()
1572 error = xfs_btree_check_block(cur, block, lev, bp); in xfs_btree_increment()
1577 if (++cur->bc_ptrs[lev] <= xfs_btree_get_numrecs(block)) in xfs_btree_increment()
1581 xfs_btree_readahead(cur, lev, XFS_BTCUR_RIGHTRA); in xfs_btree_increment()
1588 if (lev == cur->bc_nlevels) { in xfs_btree_increment()
1589 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) in xfs_btree_increment()
1595 ASSERT(lev < cur->bc_nlevels); in xfs_btree_increment()
1601 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_increment()
1604 ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); in xfs_btree_increment()
1606 error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); in xfs_btree_increment()
1610 xfs_btree_setbuf(cur, lev, bp); in xfs_btree_increment()
1611 cur->bc_ptrs[lev] = 1; in xfs_btree_increment()
1631 struct xfs_btree_cur *cur, in xfs_btree_decrement() argument
1641 ASSERT(level < cur->bc_nlevels); in xfs_btree_decrement()
1644 xfs_btree_readahead(cur, level, XFS_BTCUR_LEFTRA); in xfs_btree_decrement()
1647 if (--cur->bc_ptrs[level] > 0) in xfs_btree_decrement()
1651 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_decrement()
1654 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_decrement()
1660 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_decrement()
1661 if (xfs_btree_ptr_is_null(cur, &ptr)) in xfs_btree_decrement()
1664 XFS_BTREE_STATS_INC(cur, decrement); in xfs_btree_decrement()
1670 for (lev = level + 1; lev < cur->bc_nlevels; lev++) { in xfs_btree_decrement()
1671 if (--cur->bc_ptrs[lev] > 0) in xfs_btree_decrement()
1674 xfs_btree_readahead(cur, lev, XFS_BTCUR_LEFTRA); in xfs_btree_decrement()
1681 if (lev == cur->bc_nlevels) { in xfs_btree_decrement()
1682 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) in xfs_btree_decrement()
1688 ASSERT(lev < cur->bc_nlevels); in xfs_btree_decrement()
1694 for (block = xfs_btree_get_block(cur, lev, &bp); lev > level; ) { in xfs_btree_decrement()
1697 ptrp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[lev], block); in xfs_btree_decrement()
1699 error = xfs_btree_read_buf_block(cur, ptrp, 0, &block, &bp); in xfs_btree_decrement()
1702 xfs_btree_setbuf(cur, lev, bp); in xfs_btree_decrement()
1703 cur->bc_ptrs[lev] = xfs_btree_get_numrecs(block); in xfs_btree_decrement()
1719 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lookup_get_block() argument
1729 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_lookup_get_block()
1730 (level == cur->bc_nlevels - 1)) { in xfs_btree_lookup_get_block()
1731 *blkp = xfs_btree_get_iroot(cur); in xfs_btree_lookup_get_block()
1741 bp = cur->bc_bufs[level]; in xfs_btree_lookup_get_block()
1742 error = xfs_btree_ptr_to_daddr(cur, pp, &daddr); in xfs_btree_lookup_get_block()
1750 error = xfs_btree_read_buf_block(cur, pp, 0, blkp, &bp); in xfs_btree_lookup_get_block()
1755 if (xfs_sb_version_hascrc(&cur->bc_mp->m_sb) && in xfs_btree_lookup_get_block()
1756 !(cur->bc_ino.flags & XFS_BTCUR_BMBT_INVALID_OWNER) && in xfs_btree_lookup_get_block()
1757 (cur->bc_flags & XFS_BTREE_LONG_PTRS) && in xfs_btree_lookup_get_block()
1759 cur->bc_ino.ip->i_ino) in xfs_btree_lookup_get_block()
1770 xfs_btree_setbuf(cur, level, bp); in xfs_btree_lookup_get_block()
1776 xfs_trans_brelse(cur->bc_tp, bp); in xfs_btree_lookup_get_block()
1787 struct xfs_btree_cur *cur, in xfs_lookup_get_search_key() argument
1794 cur->bc_ops->init_key_from_rec(kp, in xfs_lookup_get_search_key()
1795 xfs_btree_rec_addr(cur, keyno, block)); in xfs_lookup_get_search_key()
1799 return xfs_btree_key_addr(cur, keyno, block); in xfs_lookup_get_search_key()
1808 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_lookup() argument
1820 XFS_BTREE_STATS_INC(cur, lookup); in xfs_btree_lookup()
1823 if (XFS_IS_CORRUPT(cur->bc_mp, cur->bc_nlevels == 0)) in xfs_btree_lookup()
1830 cur->bc_ops->init_ptr_from_cur(cur, &ptr); in xfs_btree_lookup()
1839 for (level = cur->bc_nlevels - 1, diff = 1; level >= 0; level--) { in xfs_btree_lookup()
1841 error = xfs_btree_lookup_get_block(cur, level, pp, &block); in xfs_btree_lookup()
1862 if (level != 0 || cur->bc_nlevels != 1) { in xfs_btree_lookup()
1865 cur->bc_mp, block, in xfs_btree_lookup()
1870 cur->bc_ptrs[0] = dir != XFS_LOOKUP_LE; in xfs_btree_lookup()
1880 XFS_BTREE_STATS_INC(cur, compare); in xfs_btree_lookup()
1886 kp = xfs_lookup_get_search_key(cur, level, in xfs_btree_lookup()
1895 diff = cur->bc_ops->key_diff(cur, kp); in xfs_btree_lookup()
1916 pp = xfs_btree_ptr_addr(cur, keyno, block); in xfs_btree_lookup()
1918 error = xfs_btree_debug_check_ptr(cur, pp, 0, level); in xfs_btree_lookup()
1922 cur->bc_ptrs[level] = keyno; in xfs_btree_lookup()
1933 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_lookup()
1936 !xfs_btree_ptr_is_null(cur, &ptr)) { in xfs_btree_lookup()
1939 cur->bc_ptrs[0] = keyno; in xfs_btree_lookup()
1940 error = xfs_btree_increment(cur, 0, &i); in xfs_btree_lookup()
1943 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) in xfs_btree_lookup()
1950 cur->bc_ptrs[0] = keyno; in xfs_btree_lookup()
1968 struct xfs_btree_cur *cur, in xfs_btree_high_key_from_key() argument
1971 ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); in xfs_btree_high_key_from_key()
1973 (cur->bc_ops->key_len / 2)); in xfs_btree_high_key_from_key()
1979 struct xfs_btree_cur *cur, in xfs_btree_get_leaf_keys() argument
1989 rec = xfs_btree_rec_addr(cur, 1, block); in xfs_btree_get_leaf_keys()
1990 cur->bc_ops->init_key_from_rec(key, rec); in xfs_btree_get_leaf_keys()
1992 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in xfs_btree_get_leaf_keys()
1994 cur->bc_ops->init_high_key_from_rec(&max_hkey, rec); in xfs_btree_get_leaf_keys()
1996 rec = xfs_btree_rec_addr(cur, n, block); in xfs_btree_get_leaf_keys()
1997 cur->bc_ops->init_high_key_from_rec(&hkey, rec); in xfs_btree_get_leaf_keys()
1998 if (cur->bc_ops->diff_two_keys(cur, &hkey, &max_hkey) in xfs_btree_get_leaf_keys()
2003 high = xfs_btree_high_key_from_key(cur, key); in xfs_btree_get_leaf_keys()
2004 memcpy(high, &max_hkey, cur->bc_ops->key_len / 2); in xfs_btree_get_leaf_keys()
2011 struct xfs_btree_cur *cur, in xfs_btree_get_node_keys() argument
2020 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in xfs_btree_get_node_keys()
2021 memcpy(key, xfs_btree_key_addr(cur, 1, block), in xfs_btree_get_node_keys()
2022 cur->bc_ops->key_len / 2); in xfs_btree_get_node_keys()
2024 max_hkey = xfs_btree_high_key_addr(cur, 1, block); in xfs_btree_get_node_keys()
2026 hkey = xfs_btree_high_key_addr(cur, n, block); in xfs_btree_get_node_keys()
2027 if (cur->bc_ops->diff_two_keys(cur, hkey, max_hkey) > 0) in xfs_btree_get_node_keys()
2031 high = xfs_btree_high_key_from_key(cur, key); in xfs_btree_get_node_keys()
2032 memcpy(high, max_hkey, cur->bc_ops->key_len / 2); in xfs_btree_get_node_keys()
2034 memcpy(key, xfs_btree_key_addr(cur, 1, block), in xfs_btree_get_node_keys()
2035 cur->bc_ops->key_len); in xfs_btree_get_node_keys()
2042 struct xfs_btree_cur *cur, in xfs_btree_get_keys() argument
2047 xfs_btree_get_leaf_keys(cur, block, key); in xfs_btree_get_keys()
2049 xfs_btree_get_node_keys(cur, block, key); in xfs_btree_get_keys()
2061 struct xfs_btree_cur *cur, in xfs_btree_needs_key_update() argument
2064 return (cur->bc_flags & XFS_BTREE_OVERLAPPING) || ptr == 1; in xfs_btree_needs_key_update()
2074 struct xfs_btree_cur *cur, in __xfs_btree_updkeys() argument
2088 ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); in __xfs_btree_updkeys()
2091 if (level + 1 >= cur->bc_nlevels) in __xfs_btree_updkeys()
2094 trace_xfs_btree_updkeys(cur, level, bp0); in __xfs_btree_updkeys()
2097 hkey = xfs_btree_high_key_from_key(cur, lkey); in __xfs_btree_updkeys()
2098 xfs_btree_get_keys(cur, block, lkey); in __xfs_btree_updkeys()
2099 for (level++; level < cur->bc_nlevels; level++) { in __xfs_btree_updkeys()
2103 block = xfs_btree_get_block(cur, level, &bp); in __xfs_btree_updkeys()
2104 trace_xfs_btree_updkeys(cur, level, bp); in __xfs_btree_updkeys()
2106 error = xfs_btree_check_block(cur, block, level, bp); in __xfs_btree_updkeys()
2110 ptr = cur->bc_ptrs[level]; in __xfs_btree_updkeys()
2111 nlkey = xfs_btree_key_addr(cur, ptr, block); in __xfs_btree_updkeys()
2112 nhkey = xfs_btree_high_key_addr(cur, ptr, block); in __xfs_btree_updkeys()
2114 !(cur->bc_ops->diff_two_keys(cur, nlkey, lkey) != 0 || in __xfs_btree_updkeys()
2115 cur->bc_ops->diff_two_keys(cur, nhkey, hkey) != 0)) in __xfs_btree_updkeys()
2117 xfs_btree_copy_keys(cur, nlkey, lkey, 1); in __xfs_btree_updkeys()
2118 xfs_btree_log_keys(cur, bp, ptr, ptr); in __xfs_btree_updkeys()
2119 if (level + 1 >= cur->bc_nlevels) in __xfs_btree_updkeys()
2121 xfs_btree_get_node_keys(cur, block, lkey); in __xfs_btree_updkeys()
2130 struct xfs_btree_cur *cur, in xfs_btree_updkeys_force() argument
2136 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_updkeys_force()
2137 return __xfs_btree_updkeys(cur, level, block, bp, true); in xfs_btree_updkeys_force()
2145 struct xfs_btree_cur *cur, in xfs_btree_update_keys() argument
2156 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_update_keys()
2157 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) in xfs_btree_update_keys()
2158 return __xfs_btree_updkeys(cur, level, block, bp, false); in xfs_btree_update_keys()
2166 xfs_btree_get_keys(cur, block, &key); in xfs_btree_update_keys()
2167 for (level++, ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { in xfs_btree_update_keys()
2171 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_update_keys()
2173 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_update_keys()
2177 ptr = cur->bc_ptrs[level]; in xfs_btree_update_keys()
2178 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_update_keys()
2179 xfs_btree_copy_keys(cur, kp, &key, 1); in xfs_btree_update_keys()
2180 xfs_btree_log_keys(cur, bp, ptr, ptr); in xfs_btree_update_keys()
2193 struct xfs_btree_cur *cur, in xfs_btree_update() argument
2203 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_update()
2206 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_update()
2211 ptr = cur->bc_ptrs[0]; in xfs_btree_update()
2212 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_update()
2215 xfs_btree_copy_recs(cur, rp, rec, 1); in xfs_btree_update()
2216 xfs_btree_log_recs(cur, bp, ptr, ptr); in xfs_btree_update()
2222 if (xfs_btree_is_lastrec(cur, block, 0)) { in xfs_btree_update()
2223 cur->bc_ops->update_lastrec(cur, block, rec, in xfs_btree_update()
2228 if (xfs_btree_needs_key_update(cur, ptr)) { in xfs_btree_update()
2229 error = xfs_btree_update_keys(cur, 0); in xfs_btree_update()
2246 struct xfs_btree_cur *cur, in xfs_btree_lshift() argument
2264 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_lshift()
2265 level == cur->bc_nlevels - 1) in xfs_btree_lshift()
2269 right = xfs_btree_get_block(cur, level, &rbp); in xfs_btree_lshift()
2272 error = xfs_btree_check_block(cur, right, level, rbp); in xfs_btree_lshift()
2278 xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in xfs_btree_lshift()
2279 if (xfs_btree_ptr_is_null(cur, &lptr)) in xfs_btree_lshift()
2286 if (cur->bc_ptrs[level] <= 1) in xfs_btree_lshift()
2290 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_lshift()
2296 if (lrecs == cur->bc_ops->get_maxrecs(cur, level)) in xfs_btree_lshift()
2309 XFS_BTREE_STATS_INC(cur, lshift); in xfs_btree_lshift()
2310 XFS_BTREE_STATS_ADD(cur, moves, 1); in xfs_btree_lshift()
2321 lkp = xfs_btree_key_addr(cur, lrecs, left); in xfs_btree_lshift()
2322 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_lshift()
2324 lpp = xfs_btree_ptr_addr(cur, lrecs, left); in xfs_btree_lshift()
2325 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_lshift()
2327 error = xfs_btree_debug_check_ptr(cur, rpp, 0, level); in xfs_btree_lshift()
2331 xfs_btree_copy_keys(cur, lkp, rkp, 1); in xfs_btree_lshift()
2332 xfs_btree_copy_ptrs(cur, lpp, rpp, 1); in xfs_btree_lshift()
2334 xfs_btree_log_keys(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2335 xfs_btree_log_ptrs(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2337 ASSERT(cur->bc_ops->keys_inorder(cur, in xfs_btree_lshift()
2338 xfs_btree_key_addr(cur, lrecs - 1, left), lkp)); in xfs_btree_lshift()
2343 lrp = xfs_btree_rec_addr(cur, lrecs, left); in xfs_btree_lshift()
2344 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_lshift()
2346 xfs_btree_copy_recs(cur, lrp, rrp, 1); in xfs_btree_lshift()
2347 xfs_btree_log_recs(cur, lbp, lrecs, lrecs); in xfs_btree_lshift()
2349 ASSERT(cur->bc_ops->recs_inorder(cur, in xfs_btree_lshift()
2350 xfs_btree_rec_addr(cur, lrecs - 1, left), lrp)); in xfs_btree_lshift()
2354 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS); in xfs_btree_lshift()
2357 xfs_btree_log_block(cur, rbp, XFS_BB_NUMRECS); in xfs_btree_lshift()
2362 XFS_BTREE_STATS_ADD(cur, moves, rrecs - 1); in xfs_btree_lshift()
2366 error = xfs_btree_debug_check_ptr(cur, rpp, i + 1, level); in xfs_btree_lshift()
2371 xfs_btree_shift_keys(cur, in xfs_btree_lshift()
2372 xfs_btree_key_addr(cur, 2, right), in xfs_btree_lshift()
2374 xfs_btree_shift_ptrs(cur, in xfs_btree_lshift()
2375 xfs_btree_ptr_addr(cur, 2, right), in xfs_btree_lshift()
2378 xfs_btree_log_keys(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2379 xfs_btree_log_ptrs(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2382 xfs_btree_shift_recs(cur, in xfs_btree_lshift()
2383 xfs_btree_rec_addr(cur, 2, right), in xfs_btree_lshift()
2385 xfs_btree_log_recs(cur, rbp, 1, rrecs); in xfs_btree_lshift()
2392 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in xfs_btree_lshift()
2393 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_lshift()
2415 error = xfs_btree_update_keys(cur, level); in xfs_btree_lshift()
2420 cur->bc_ptrs[level]--; in xfs_btree_lshift()
2443 struct xfs_btree_cur *cur, in xfs_btree_rshift() argument
2459 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_rshift()
2460 (level == cur->bc_nlevels - 1)) in xfs_btree_rshift()
2464 left = xfs_btree_get_block(cur, level, &lbp); in xfs_btree_rshift()
2467 error = xfs_btree_check_block(cur, left, level, lbp); in xfs_btree_rshift()
2473 xfs_btree_get_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_rshift()
2474 if (xfs_btree_ptr_is_null(cur, &rptr)) in xfs_btree_rshift()
2482 if (cur->bc_ptrs[level] >= lrecs) in xfs_btree_rshift()
2486 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_rshift()
2492 if (rrecs == cur->bc_ops->get_maxrecs(cur, level)) in xfs_btree_rshift()
2495 XFS_BTREE_STATS_INC(cur, rshift); in xfs_btree_rshift()
2496 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in xfs_btree_rshift()
2508 lkp = xfs_btree_key_addr(cur, lrecs, left); in xfs_btree_rshift()
2509 lpp = xfs_btree_ptr_addr(cur, lrecs, left); in xfs_btree_rshift()
2510 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_rshift()
2511 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_rshift()
2514 error = xfs_btree_debug_check_ptr(cur, rpp, i, level); in xfs_btree_rshift()
2519 xfs_btree_shift_keys(cur, rkp, 1, rrecs); in xfs_btree_rshift()
2520 xfs_btree_shift_ptrs(cur, rpp, 1, rrecs); in xfs_btree_rshift()
2522 error = xfs_btree_debug_check_ptr(cur, lpp, 0, level); in xfs_btree_rshift()
2527 xfs_btree_copy_keys(cur, rkp, lkp, 1); in xfs_btree_rshift()
2528 xfs_btree_copy_ptrs(cur, rpp, lpp, 1); in xfs_btree_rshift()
2530 xfs_btree_log_keys(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2531 xfs_btree_log_ptrs(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2533 ASSERT(cur->bc_ops->keys_inorder(cur, rkp, in xfs_btree_rshift()
2534 xfs_btree_key_addr(cur, 2, right))); in xfs_btree_rshift()
2540 lrp = xfs_btree_rec_addr(cur, lrecs, left); in xfs_btree_rshift()
2541 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_rshift()
2543 xfs_btree_shift_recs(cur, rrp, 1, rrecs); in xfs_btree_rshift()
2546 xfs_btree_copy_recs(cur, rrp, lrp, 1); in xfs_btree_rshift()
2547 xfs_btree_log_recs(cur, rbp, 1, rrecs + 1); in xfs_btree_rshift()
2554 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS); in xfs_btree_rshift()
2557 xfs_btree_log_block(cur, rbp, XFS_BB_NUMRECS); in xfs_btree_rshift()
2563 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_rshift()
2577 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in xfs_btree_rshift()
2578 error = xfs_btree_update_keys(cur, level); in xfs_btree_rshift()
2612 struct xfs_btree_cur *cur, in __xfs_btree_split() argument
2634 XFS_BTREE_STATS_INC(cur, split); in __xfs_btree_split()
2637 left = xfs_btree_get_block(cur, level, &lbp); in __xfs_btree_split()
2640 error = xfs_btree_check_block(cur, left, level, lbp); in __xfs_btree_split()
2645 xfs_btree_buf_to_ptr(cur, lbp, &lptr); in __xfs_btree_split()
2648 error = cur->bc_ops->alloc_block(cur, &lptr, &rptr, stat); in __xfs_btree_split()
2653 XFS_BTREE_STATS_INC(cur, alloc); in __xfs_btree_split()
2656 error = xfs_btree_get_buf_block(cur, &rptr, &right, &rbp); in __xfs_btree_split()
2661 xfs_btree_init_block_cur(cur, rbp, xfs_btree_get_level(left), 0); in __xfs_btree_split()
2670 if ((lrecs & 1) && cur->bc_ptrs[level] <= rrecs + 1) in __xfs_btree_split()
2674 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in __xfs_btree_split()
2693 lkp = xfs_btree_key_addr(cur, src_index, left); in __xfs_btree_split()
2694 lpp = xfs_btree_ptr_addr(cur, src_index, left); in __xfs_btree_split()
2695 rkp = xfs_btree_key_addr(cur, 1, right); in __xfs_btree_split()
2696 rpp = xfs_btree_ptr_addr(cur, 1, right); in __xfs_btree_split()
2699 error = xfs_btree_debug_check_ptr(cur, lpp, i, level); in __xfs_btree_split()
2705 xfs_btree_copy_keys(cur, rkp, lkp, rrecs); in __xfs_btree_split()
2706 xfs_btree_copy_ptrs(cur, rpp, lpp, rrecs); in __xfs_btree_split()
2708 xfs_btree_log_keys(cur, rbp, 1, rrecs); in __xfs_btree_split()
2709 xfs_btree_log_ptrs(cur, rbp, 1, rrecs); in __xfs_btree_split()
2712 xfs_btree_get_node_keys(cur, right, key); in __xfs_btree_split()
2718 lrp = xfs_btree_rec_addr(cur, src_index, left); in __xfs_btree_split()
2719 rrp = xfs_btree_rec_addr(cur, 1, right); in __xfs_btree_split()
2722 xfs_btree_copy_recs(cur, rrp, lrp, rrecs); in __xfs_btree_split()
2723 xfs_btree_log_recs(cur, rbp, 1, rrecs); in __xfs_btree_split()
2726 xfs_btree_get_leaf_keys(cur, right, key); in __xfs_btree_split()
2733 xfs_btree_get_sibling(cur, left, &rrptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2734 xfs_btree_set_sibling(cur, right, &rrptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2735 xfs_btree_set_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in __xfs_btree_split()
2736 xfs_btree_set_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); in __xfs_btree_split()
2738 xfs_btree_log_block(cur, rbp, XFS_BB_ALL_BITS); in __xfs_btree_split()
2739 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); in __xfs_btree_split()
2745 if (!xfs_btree_ptr_is_null(cur, &rrptr)) { in __xfs_btree_split()
2746 error = xfs_btree_read_buf_block(cur, &rrptr, in __xfs_btree_split()
2750 xfs_btree_set_sibling(cur, rrblock, &rptr, XFS_BB_LEFTSIB); in __xfs_btree_split()
2751 xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); in __xfs_btree_split()
2755 if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { in __xfs_btree_split()
2756 error = xfs_btree_update_keys(cur, level); in __xfs_btree_split()
2766 if (cur->bc_ptrs[level] > lrecs + 1) { in __xfs_btree_split()
2767 xfs_btree_setbuf(cur, level, rbp); in __xfs_btree_split()
2768 cur->bc_ptrs[level] -= lrecs; in __xfs_btree_split()
2774 if (level + 1 < cur->bc_nlevels) { in __xfs_btree_split()
2775 error = xfs_btree_dup_cursor(cur, curp); in __xfs_btree_split()
2792 struct xfs_btree_cur *cur; member
2826 xfs_trans_set_context(args->cur->bc_tp); in xfs_btree_split_worker()
2828 args->result = __xfs_btree_split(args->cur, args->level, args->ptrp, in xfs_btree_split_worker()
2831 xfs_trans_clear_context(args->cur->bc_tp); in xfs_btree_split_worker()
2849 struct xfs_btree_cur *cur, in xfs_btree_split() argument
2859 if (cur->bc_btnum != XFS_BTNUM_BMAP) in xfs_btree_split()
2860 return __xfs_btree_split(cur, level, ptrp, key, curp, stat); in xfs_btree_split()
2862 args.cur = cur; in xfs_btree_split()
2884 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_new_iroot() argument
2900 XFS_BTREE_STATS_INC(cur, newroot); in xfs_btree_new_iroot()
2902 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_new_iroot()
2904 level = cur->bc_nlevels - 1; in xfs_btree_new_iroot()
2906 block = xfs_btree_get_iroot(cur); in xfs_btree_new_iroot()
2907 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_new_iroot()
2910 error = cur->bc_ops->alloc_block(cur, pp, &nptr, stat); in xfs_btree_new_iroot()
2916 XFS_BTREE_STATS_INC(cur, alloc); in xfs_btree_new_iroot()
2919 error = xfs_btree_get_buf_block(cur, &nptr, &cblock, &cbp); in xfs_btree_new_iroot()
2927 memcpy(cblock, block, xfs_btree_block_len(cur)); in xfs_btree_new_iroot()
2928 if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { in xfs_btree_new_iroot()
2929 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_new_iroot()
2937 cur->bc_nlevels++; in xfs_btree_new_iroot()
2938 cur->bc_ptrs[level + 1] = 1; in xfs_btree_new_iroot()
2940 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_new_iroot()
2941 ckp = xfs_btree_key_addr(cur, 1, cblock); in xfs_btree_new_iroot()
2942 xfs_btree_copy_keys(cur, ckp, kp, xfs_btree_get_numrecs(cblock)); in xfs_btree_new_iroot()
2944 cpp = xfs_btree_ptr_addr(cur, 1, cblock); in xfs_btree_new_iroot()
2946 error = xfs_btree_debug_check_ptr(cur, pp, i, level); in xfs_btree_new_iroot()
2951 xfs_btree_copy_ptrs(cur, cpp, pp, xfs_btree_get_numrecs(cblock)); in xfs_btree_new_iroot()
2953 error = xfs_btree_debug_check_ptr(cur, &nptr, 0, level); in xfs_btree_new_iroot()
2957 xfs_btree_copy_ptrs(cur, pp, &nptr, 1); in xfs_btree_new_iroot()
2959 xfs_iroot_realloc(cur->bc_ino.ip, in xfs_btree_new_iroot()
2961 cur->bc_ino.whichfork); in xfs_btree_new_iroot()
2963 xfs_btree_setbuf(cur, level, cbp); in xfs_btree_new_iroot()
2969 xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); in xfs_btree_new_iroot()
2970 xfs_btree_log_keys(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); in xfs_btree_new_iroot()
2971 xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); in xfs_btree_new_iroot()
2974 XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_ino.whichfork); in xfs_btree_new_iroot()
2986 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_new_root() argument
3002 XFS_BTREE_STATS_INC(cur, newroot); in xfs_btree_new_root()
3005 cur->bc_ops->init_ptr_from_cur(cur, &rptr); in xfs_btree_new_root()
3008 error = cur->bc_ops->alloc_block(cur, &rptr, &lptr, stat); in xfs_btree_new_root()
3013 XFS_BTREE_STATS_INC(cur, alloc); in xfs_btree_new_root()
3016 error = xfs_btree_get_buf_block(cur, &lptr, &new, &nbp); in xfs_btree_new_root()
3021 cur->bc_ops->set_root(cur, &lptr, 1); in xfs_btree_new_root()
3029 block = xfs_btree_get_block(cur, cur->bc_nlevels - 1, &bp); in xfs_btree_new_root()
3032 error = xfs_btree_check_block(cur, block, cur->bc_nlevels - 1, bp); in xfs_btree_new_root()
3037 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_new_root()
3038 if (!xfs_btree_ptr_is_null(cur, &rptr)) { in xfs_btree_new_root()
3041 xfs_btree_buf_to_ptr(cur, lbp, &lptr); in xfs_btree_new_root()
3043 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_new_root()
3051 xfs_btree_buf_to_ptr(cur, rbp, &rptr); in xfs_btree_new_root()
3053 xfs_btree_get_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); in xfs_btree_new_root()
3054 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_new_root()
3062 xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); in xfs_btree_new_root()
3063 xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); in xfs_btree_new_root()
3064 ASSERT(!xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_new_root()
3065 !xfs_btree_ptr_is_null(cur, &rptr)); in xfs_btree_new_root()
3073 xfs_btree_get_node_keys(cur, left, in xfs_btree_new_root()
3074 xfs_btree_key_addr(cur, 1, new)); in xfs_btree_new_root()
3075 xfs_btree_get_node_keys(cur, right, in xfs_btree_new_root()
3076 xfs_btree_key_addr(cur, 2, new)); in xfs_btree_new_root()
3083 xfs_btree_get_leaf_keys(cur, left, in xfs_btree_new_root()
3084 xfs_btree_key_addr(cur, 1, new)); in xfs_btree_new_root()
3085 xfs_btree_get_leaf_keys(cur, right, in xfs_btree_new_root()
3086 xfs_btree_key_addr(cur, 2, new)); in xfs_btree_new_root()
3088 xfs_btree_log_keys(cur, nbp, 1, 2); in xfs_btree_new_root()
3091 xfs_btree_copy_ptrs(cur, in xfs_btree_new_root()
3092 xfs_btree_ptr_addr(cur, 1, new), &lptr, 1); in xfs_btree_new_root()
3093 xfs_btree_copy_ptrs(cur, in xfs_btree_new_root()
3094 xfs_btree_ptr_addr(cur, 2, new), &rptr, 1); in xfs_btree_new_root()
3095 xfs_btree_log_ptrs(cur, nbp, 1, 2); in xfs_btree_new_root()
3098 xfs_btree_setbuf(cur, cur->bc_nlevels, nbp); in xfs_btree_new_root()
3099 cur->bc_ptrs[cur->bc_nlevels] = nptr; in xfs_btree_new_root()
3100 cur->bc_nlevels++; in xfs_btree_new_root()
3112 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_make_block_unfull() argument
3124 if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_make_block_unfull()
3125 level == cur->bc_nlevels - 1) { in xfs_btree_make_block_unfull()
3126 struct xfs_inode *ip = cur->bc_ino.ip; in xfs_btree_make_block_unfull()
3128 if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) { in xfs_btree_make_block_unfull()
3130 xfs_iroot_realloc(ip, 1, cur->bc_ino.whichfork); in xfs_btree_make_block_unfull()
3136 error = xfs_btree_new_iroot(cur, &logflags, stat); in xfs_btree_make_block_unfull()
3140 xfs_trans_log_inode(cur->bc_tp, ip, logflags); in xfs_btree_make_block_unfull()
3147 error = xfs_btree_rshift(cur, level, stat); in xfs_btree_make_block_unfull()
3152 error = xfs_btree_lshift(cur, level, stat); in xfs_btree_make_block_unfull()
3157 *oindex = *index = cur->bc_ptrs[level]; in xfs_btree_make_block_unfull()
3167 error = xfs_btree_split(cur, level, nptr, key, ncur, stat); in xfs_btree_make_block_unfull()
3172 *index = cur->bc_ptrs[level]; in xfs_btree_make_block_unfull()
3182 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_insrec() argument
3210 if (!(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && in xfs_btree_insrec()
3211 (level >= cur->bc_nlevels)) { in xfs_btree_insrec()
3212 error = xfs_btree_new_root(cur, stat); in xfs_btree_insrec()
3213 xfs_btree_set_ptr_null(cur, ptrp); in xfs_btree_insrec()
3219 ptr = cur->bc_ptrs[level]; in xfs_btree_insrec()
3227 XFS_BTREE_STATS_INC(cur, insrec); in xfs_btree_insrec()
3230 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
3235 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
3242 ASSERT(cur->bc_ops->recs_inorder(cur, rec, in xfs_btree_insrec()
3243 xfs_btree_rec_addr(cur, ptr, block))); in xfs_btree_insrec()
3245 ASSERT(cur->bc_ops->keys_inorder(cur, key, in xfs_btree_insrec()
3246 xfs_btree_key_addr(cur, ptr, block))); in xfs_btree_insrec()
3255 xfs_btree_set_ptr_null(cur, &nptr); in xfs_btree_insrec()
3256 if (numrecs == cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_insrec()
3257 error = xfs_btree_make_block_unfull(cur, level, numrecs, in xfs_btree_insrec()
3267 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_insrec()
3271 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_insrec()
3280 XFS_BTREE_STATS_ADD(cur, moves, numrecs - ptr + 1); in xfs_btree_insrec()
3287 kp = xfs_btree_key_addr(cur, ptr, block); in xfs_btree_insrec()
3288 pp = xfs_btree_ptr_addr(cur, ptr, block); in xfs_btree_insrec()
3291 error = xfs_btree_debug_check_ptr(cur, pp, i, level); in xfs_btree_insrec()
3296 xfs_btree_shift_keys(cur, kp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3297 xfs_btree_shift_ptrs(cur, pp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3299 error = xfs_btree_debug_check_ptr(cur, ptrp, 0, level); in xfs_btree_insrec()
3304 xfs_btree_copy_keys(cur, kp, key, 1); in xfs_btree_insrec()
3305 xfs_btree_copy_ptrs(cur, pp, ptrp, 1); in xfs_btree_insrec()
3308 xfs_btree_log_ptrs(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3309 xfs_btree_log_keys(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3312 ASSERT(cur->bc_ops->keys_inorder(cur, kp, in xfs_btree_insrec()
3313 xfs_btree_key_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
3320 rp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_insrec()
3322 xfs_btree_shift_recs(cur, rp, 1, numrecs - ptr + 1); in xfs_btree_insrec()
3325 xfs_btree_copy_recs(cur, rp, rec, 1); in xfs_btree_insrec()
3327 xfs_btree_log_recs(cur, bp, ptr, numrecs); in xfs_btree_insrec()
3330 ASSERT(cur->bc_ops->recs_inorder(cur, rp, in xfs_btree_insrec()
3331 xfs_btree_rec_addr(cur, ptr + 1, block))); in xfs_btree_insrec()
3337 xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); in xfs_btree_insrec()
3348 xfs_btree_get_keys(cur, block, lkey); in xfs_btree_insrec()
3349 } else if (xfs_btree_needs_key_update(cur, optr)) { in xfs_btree_insrec()
3350 error = xfs_btree_update_keys(cur, level); in xfs_btree_insrec()
3359 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_insrec()
3360 cur->bc_ops->update_lastrec(cur, block, rec, in xfs_btree_insrec()
3369 if (!xfs_btree_ptr_is_null(cur, &nptr)) { in xfs_btree_insrec()
3370 xfs_btree_copy_keys(cur, key, lkey, 1); in xfs_btree_insrec()
3390 struct xfs_btree_cur *cur, in xfs_btree_insert() argument
3405 pcur = cur; in xfs_btree_insert()
3408 xfs_btree_set_ptr_null(cur, &nptr); in xfs_btree_insert()
3411 cur->bc_ops->init_rec_from_cur(cur, &rec); in xfs_btree_insert()
3412 cur->bc_ops->init_key_from_rec(key, &rec); in xfs_btree_insert()
3427 if (pcur != cur) in xfs_btree_insert()
3432 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_insert()
3443 if (pcur != cur && in xfs_btree_insert()
3444 (ncur || xfs_btree_ptr_is_null(cur, &nptr))) { in xfs_btree_insert()
3446 if (cur->bc_ops->update_cursor) in xfs_btree_insert()
3447 cur->bc_ops->update_cursor(pcur, cur); in xfs_btree_insert()
3448 cur->bc_nlevels = pcur->bc_nlevels; in xfs_btree_insert()
3456 } while (!xfs_btree_ptr_is_null(cur, &nptr)); in xfs_btree_insert()
3474 struct xfs_btree_cur *cur) in xfs_btree_kill_iroot() argument
3476 int whichfork = cur->bc_ino.whichfork; in xfs_btree_kill_iroot()
3477 struct xfs_inode *ip = cur->bc_ino.ip; in xfs_btree_kill_iroot()
3495 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_kill_iroot()
3496 ASSERT(cur->bc_nlevels > 1); in xfs_btree_kill_iroot()
3502 level = cur->bc_nlevels - 1; in xfs_btree_kill_iroot()
3509 block = xfs_btree_get_iroot(cur); in xfs_btree_kill_iroot()
3513 cblock = xfs_btree_get_block(cur, level - 1, &cbp); in xfs_btree_kill_iroot()
3521 if (numrecs > cur->bc_ops->get_dmaxrecs(cur, level)) in xfs_btree_kill_iroot()
3524 XFS_BTREE_STATS_INC(cur, killroot); in xfs_btree_kill_iroot()
3527 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_LEFTSIB); in xfs_btree_kill_iroot()
3528 ASSERT(xfs_btree_ptr_is_null(cur, &ptr)); in xfs_btree_kill_iroot()
3529 xfs_btree_get_sibling(cur, block, &ptr, XFS_BB_RIGHTSIB); in xfs_btree_kill_iroot()
3530 ASSERT(xfs_btree_ptr_is_null(cur, &ptr)); in xfs_btree_kill_iroot()
3533 index = numrecs - cur->bc_ops->get_maxrecs(cur, level); in xfs_btree_kill_iroot()
3535 xfs_iroot_realloc(cur->bc_ino.ip, index, in xfs_btree_kill_iroot()
3536 cur->bc_ino.whichfork); in xfs_btree_kill_iroot()
3543 kp = xfs_btree_key_addr(cur, 1, block); in xfs_btree_kill_iroot()
3544 ckp = xfs_btree_key_addr(cur, 1, cblock); in xfs_btree_kill_iroot()
3545 xfs_btree_copy_keys(cur, kp, ckp, numrecs); in xfs_btree_kill_iroot()
3547 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_kill_iroot()
3548 cpp = xfs_btree_ptr_addr(cur, 1, cblock); in xfs_btree_kill_iroot()
3551 error = xfs_btree_debug_check_ptr(cur, cpp, i, level - 1); in xfs_btree_kill_iroot()
3556 xfs_btree_copy_ptrs(cur, pp, cpp, numrecs); in xfs_btree_kill_iroot()
3558 error = xfs_btree_free_block(cur, cbp); in xfs_btree_kill_iroot()
3562 cur->bc_bufs[level - 1] = NULL; in xfs_btree_kill_iroot()
3564 xfs_trans_log_inode(cur->bc_tp, ip, in xfs_btree_kill_iroot()
3565 XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_ino.whichfork)); in xfs_btree_kill_iroot()
3566 cur->bc_nlevels--; in xfs_btree_kill_iroot()
3576 struct xfs_btree_cur *cur, in xfs_btree_kill_root() argument
3583 XFS_BTREE_STATS_INC(cur, killroot); in xfs_btree_kill_root()
3589 cur->bc_ops->set_root(cur, newroot, -1); in xfs_btree_kill_root()
3591 error = xfs_btree_free_block(cur, bp); in xfs_btree_kill_root()
3595 cur->bc_bufs[level] = NULL; in xfs_btree_kill_root()
3596 cur->bc_ra[level] = 0; in xfs_btree_kill_root()
3597 cur->bc_nlevels--; in xfs_btree_kill_root()
3604 struct xfs_btree_cur *cur, in xfs_btree_dec_cursor() argument
3612 error = xfs_btree_decrement(cur, level, &i); in xfs_btree_dec_cursor()
3629 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_delrec() argument
3655 ptr = cur->bc_ptrs[level]; in xfs_btree_delrec()
3662 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_delrec()
3666 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_delrec()
3677 XFS_BTREE_STATS_INC(cur, delrec); in xfs_btree_delrec()
3678 XFS_BTREE_STATS_ADD(cur, moves, numrecs - ptr); in xfs_btree_delrec()
3686 lkp = xfs_btree_key_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3687 lpp = xfs_btree_ptr_addr(cur, ptr + 1, block); in xfs_btree_delrec()
3690 error = xfs_btree_debug_check_ptr(cur, lpp, i, level); in xfs_btree_delrec()
3696 xfs_btree_shift_keys(cur, lkp, -1, numrecs - ptr); in xfs_btree_delrec()
3697 xfs_btree_shift_ptrs(cur, lpp, -1, numrecs - ptr); in xfs_btree_delrec()
3698 xfs_btree_log_keys(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3699 xfs_btree_log_ptrs(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3704 xfs_btree_shift_recs(cur, in xfs_btree_delrec()
3705 xfs_btree_rec_addr(cur, ptr + 1, block), in xfs_btree_delrec()
3707 xfs_btree_log_recs(cur, bp, ptr, numrecs - 1); in xfs_btree_delrec()
3715 xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); in xfs_btree_delrec()
3721 if (xfs_btree_is_lastrec(cur, block, level)) { in xfs_btree_delrec()
3722 cur->bc_ops->update_lastrec(cur, block, NULL, in xfs_btree_delrec()
3731 if (level == cur->bc_nlevels - 1) { in xfs_btree_delrec()
3732 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { in xfs_btree_delrec()
3733 xfs_iroot_realloc(cur->bc_ino.ip, -1, in xfs_btree_delrec()
3734 cur->bc_ino.whichfork); in xfs_btree_delrec()
3736 error = xfs_btree_kill_iroot(cur); in xfs_btree_delrec()
3740 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3758 pp = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_delrec()
3759 error = xfs_btree_kill_root(cur, bp, level, pp); in xfs_btree_delrec()
3763 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3775 if (xfs_btree_needs_key_update(cur, ptr)) { in xfs_btree_delrec()
3776 error = xfs_btree_update_keys(cur, level); in xfs_btree_delrec()
3785 if (numrecs >= cur->bc_ops->get_minrecs(cur, level)) { in xfs_btree_delrec()
3786 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3797 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
3798 xfs_btree_get_sibling(cur, block, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
3800 if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { in xfs_btree_delrec()
3806 if (xfs_btree_ptr_is_null(cur, &rptr) && in xfs_btree_delrec()
3807 xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_delrec()
3808 level == cur->bc_nlevels - 2) { in xfs_btree_delrec()
3809 error = xfs_btree_kill_iroot(cur); in xfs_btree_delrec()
3811 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3818 ASSERT(!xfs_btree_ptr_is_null(cur, &rptr) || in xfs_btree_delrec()
3819 !xfs_btree_ptr_is_null(cur, &lptr)); in xfs_btree_delrec()
3825 error = xfs_btree_dup_cursor(cur, &tcur); in xfs_btree_delrec()
3833 if (!xfs_btree_ptr_is_null(cur, &rptr)) { in xfs_btree_delrec()
3839 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3847 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3853 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3874 cur->bc_ops->get_minrecs(tcur, level)) { in xfs_btree_delrec()
3880 cur->bc_ops->get_minrecs(tcur, level)); in xfs_btree_delrec()
3885 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
3898 if (!xfs_btree_ptr_is_null(cur, &lptr)) { in xfs_btree_delrec()
3900 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3908 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3919 if (!xfs_btree_ptr_is_null(cur, &lptr)) { in xfs_btree_delrec()
3925 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3934 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_btree_delrec()
3942 error = xfs_btree_check_block(cur, left, level, lbp); in xfs_btree_delrec()
3955 cur->bc_ops->get_minrecs(tcur, level)) { in xfs_btree_delrec()
3961 cur->bc_ops->get_minrecs(tcur, level)); in xfs_btree_delrec()
3965 cur->bc_ptrs[0]++; in xfs_btree_delrec()
3984 ASSERT(!xfs_btree_ptr_is_null(cur, &cptr)); in xfs_btree_delrec()
3986 if (!xfs_btree_ptr_is_null(cur, &lptr) && in xfs_btree_delrec()
3988 cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_delrec()
3996 error = xfs_btree_read_buf_block(cur, &lptr, 0, &left, &lbp); in xfs_btree_delrec()
4003 } else if (!xfs_btree_ptr_is_null(cur, &rptr) && in xfs_btree_delrec()
4005 cur->bc_ops->get_maxrecs(cur, level)) { in xfs_btree_delrec()
4013 error = xfs_btree_read_buf_block(cur, &rptr, 0, &right, &rbp); in xfs_btree_delrec()
4022 error = xfs_btree_dec_cursor(cur, level, stat); in xfs_btree_delrec()
4035 XFS_BTREE_STATS_ADD(cur, moves, rrecs); in xfs_btree_delrec()
4043 lkp = xfs_btree_key_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
4044 lpp = xfs_btree_ptr_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
4045 rkp = xfs_btree_key_addr(cur, 1, right); in xfs_btree_delrec()
4046 rpp = xfs_btree_ptr_addr(cur, 1, right); in xfs_btree_delrec()
4049 error = xfs_btree_debug_check_ptr(cur, rpp, i, level); in xfs_btree_delrec()
4054 xfs_btree_copy_keys(cur, lkp, rkp, rrecs); in xfs_btree_delrec()
4055 xfs_btree_copy_ptrs(cur, lpp, rpp, rrecs); in xfs_btree_delrec()
4057 xfs_btree_log_keys(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
4058 xfs_btree_log_ptrs(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
4064 lrp = xfs_btree_rec_addr(cur, lrecs + 1, left); in xfs_btree_delrec()
4065 rrp = xfs_btree_rec_addr(cur, 1, right); in xfs_btree_delrec()
4067 xfs_btree_copy_recs(cur, lrp, rrp, rrecs); in xfs_btree_delrec()
4068 xfs_btree_log_recs(cur, lbp, lrecs + 1, lrecs + rrecs); in xfs_btree_delrec()
4071 XFS_BTREE_STATS_INC(cur, join); in xfs_btree_delrec()
4078 xfs_btree_get_sibling(cur, right, &cptr, XFS_BB_RIGHTSIB), in xfs_btree_delrec()
4079 xfs_btree_set_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
4080 xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); in xfs_btree_delrec()
4083 xfs_btree_get_sibling(cur, left, &cptr, XFS_BB_RIGHTSIB); in xfs_btree_delrec()
4084 if (!xfs_btree_ptr_is_null(cur, &cptr)) { in xfs_btree_delrec()
4085 error = xfs_btree_read_buf_block(cur, &cptr, 0, &rrblock, &rrbp); in xfs_btree_delrec()
4088 xfs_btree_set_sibling(cur, rrblock, &lptr, XFS_BB_LEFTSIB); in xfs_btree_delrec()
4089 xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); in xfs_btree_delrec()
4093 error = xfs_btree_free_block(cur, rbp); in xfs_btree_delrec()
4102 cur->bc_bufs[level] = lbp; in xfs_btree_delrec()
4103 cur->bc_ptrs[level] += lrecs; in xfs_btree_delrec()
4104 cur->bc_ra[level] = 0; in xfs_btree_delrec()
4110 else if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) || in xfs_btree_delrec()
4111 (level + 1 < cur->bc_nlevels)) { in xfs_btree_delrec()
4112 error = xfs_btree_increment(cur, level + 1, &i); in xfs_btree_delrec()
4124 cur->bc_ptrs[level]--; in xfs_btree_delrec()
4153 struct xfs_btree_cur *cur, in xfs_btree_delete() argument
4168 error = xfs_btree_delrec(cur, level, &i); in xfs_btree_delete()
4179 if (joined && (cur->bc_flags & XFS_BTREE_OVERLAPPING)) { in xfs_btree_delete()
4180 error = xfs_btree_updkeys_force(cur, 0); in xfs_btree_delete()
4186 for (level = 1; level < cur->bc_nlevels; level++) { in xfs_btree_delete()
4187 if (cur->bc_ptrs[level] == 0) { in xfs_btree_delete()
4188 error = xfs_btree_decrement(cur, level, &i); in xfs_btree_delete()
4207 struct xfs_btree_cur *cur, /* btree cursor */ in xfs_btree_get_rec() argument
4218 ptr = cur->bc_ptrs[0]; in xfs_btree_get_rec()
4219 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_get_rec()
4222 error = xfs_btree_check_block(cur, block, 0, bp); in xfs_btree_get_rec()
4238 *recp = xfs_btree_rec_addr(cur, ptr, block); in xfs_btree_get_rec()
4246 struct xfs_btree_cur *cur, in xfs_btree_visit_block() argument
4257 xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); in xfs_btree_visit_block()
4258 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_visit_block()
4261 error = fn(cur, level, data); in xfs_btree_visit_block()
4266 xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); in xfs_btree_visit_block()
4267 if (xfs_btree_ptr_is_null(cur, &rptr)) in xfs_btree_visit_block()
4270 return xfs_btree_lookup_get_block(cur, level, &rptr, &block); in xfs_btree_visit_block()
4277 struct xfs_btree_cur *cur, in xfs_btree_visit_blocks() argument
4287 cur->bc_ops->init_ptr_from_cur(cur, &lptr); in xfs_btree_visit_blocks()
4290 for (level = cur->bc_nlevels - 1; level >= 0; level--) { in xfs_btree_visit_blocks()
4292 error = xfs_btree_lookup_get_block(cur, level, &lptr, &block); in xfs_btree_visit_blocks()
4300 ptr = xfs_btree_ptr_addr(cur, 1, block); in xfs_btree_visit_blocks()
4301 xfs_btree_readahead_ptr(cur, ptr, 1); in xfs_btree_visit_blocks()
4304 xfs_btree_copy_ptrs(cur, &lptr, ptr, 1); in xfs_btree_visit_blocks()
4314 error = xfs_btree_visit_block(cur, level, fn, data); in xfs_btree_visit_blocks()
4355 struct xfs_btree_cur *cur, in xfs_btree_block_change_owner() argument
4364 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_block_change_owner()
4365 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { in xfs_btree_block_change_owner()
4383 ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); in xfs_btree_block_change_owner()
4384 ASSERT(level == cur->bc_nlevels - 1); in xfs_btree_block_change_owner()
4388 if (cur->bc_tp) { in xfs_btree_block_change_owner()
4389 if (!xfs_trans_ordered_buf(cur->bc_tp, bp)) { in xfs_btree_block_change_owner()
4390 xfs_btree_log_block(cur, bp, XFS_BB_OWNER); in xfs_btree_block_change_owner()
4402 struct xfs_btree_cur *cur, in xfs_btree_change_owner() argument
4411 return xfs_btree_visit_blocks(cur, xfs_btree_block_change_owner, in xfs_btree_change_owner()
4541 struct xfs_btree_cur *cur, in xfs_btree_simple_query_range() argument
4554 ASSERT(cur->bc_ops->init_high_key_from_rec); in xfs_btree_simple_query_range()
4555 ASSERT(cur->bc_ops->diff_two_keys); in xfs_btree_simple_query_range()
4562 error = xfs_btree_lookup(cur, XFS_LOOKUP_LE, &stat); in xfs_btree_simple_query_range()
4568 error = xfs_btree_increment(cur, 0, &stat); in xfs_btree_simple_query_range()
4575 error = xfs_btree_get_rec(cur, &recp, &stat); in xfs_btree_simple_query_range()
4581 cur->bc_ops->init_high_key_from_rec(&rec_key, recp); in xfs_btree_simple_query_range()
4583 diff = cur->bc_ops->diff_two_keys(cur, low_key, in xfs_btree_simple_query_range()
4590 cur->bc_ops->init_key_from_rec(&rec_key, recp); in xfs_btree_simple_query_range()
4591 diff = cur->bc_ops->diff_two_keys(cur, &rec_key, high_key); in xfs_btree_simple_query_range()
4596 error = fn(cur, recp, priv); in xfs_btree_simple_query_range()
4602 error = xfs_btree_increment(cur, 0, &stat); in xfs_btree_simple_query_range()
4632 struct xfs_btree_cur *cur, in xfs_btree_overlapped_query_range() argument
4654 level = cur->bc_nlevels - 1; in xfs_btree_overlapped_query_range()
4655 cur->bc_ops->init_ptr_from_cur(cur, &ptr); in xfs_btree_overlapped_query_range()
4656 error = xfs_btree_lookup_get_block(cur, level, &ptr, &block); in xfs_btree_overlapped_query_range()
4659 xfs_btree_get_block(cur, level, &bp); in xfs_btree_overlapped_query_range()
4660 trace_xfs_btree_overlapped_query_range(cur, level, bp); in xfs_btree_overlapped_query_range()
4662 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_overlapped_query_range()
4666 cur->bc_ptrs[level] = 1; in xfs_btree_overlapped_query_range()
4668 while (level < cur->bc_nlevels) { in xfs_btree_overlapped_query_range()
4669 block = xfs_btree_get_block(cur, level, &bp); in xfs_btree_overlapped_query_range()
4672 if (cur->bc_ptrs[level] > be16_to_cpu(block->bb_numrecs)) { in xfs_btree_overlapped_query_range()
4674 if (level < cur->bc_nlevels - 1) in xfs_btree_overlapped_query_range()
4675 cur->bc_ptrs[level + 1]++; in xfs_btree_overlapped_query_range()
4682 recp = xfs_btree_rec_addr(cur, cur->bc_ptrs[0], block); in xfs_btree_overlapped_query_range()
4684 cur->bc_ops->init_high_key_from_rec(&rec_hkey, recp); in xfs_btree_overlapped_query_range()
4685 ldiff = cur->bc_ops->diff_two_keys(cur, &rec_hkey, in xfs_btree_overlapped_query_range()
4688 cur->bc_ops->init_key_from_rec(&rec_key, recp); in xfs_btree_overlapped_query_range()
4689 hdiff = cur->bc_ops->diff_two_keys(cur, high_key, in xfs_btree_overlapped_query_range()
4698 error = fn(cur, recp, priv); in xfs_btree_overlapped_query_range()
4705 cur->bc_ptrs[level]++; in xfs_btree_overlapped_query_range()
4710 lkp = xfs_btree_key_addr(cur, cur->bc_ptrs[level], block); in xfs_btree_overlapped_query_range()
4711 hkp = xfs_btree_high_key_addr(cur, cur->bc_ptrs[level], block); in xfs_btree_overlapped_query_range()
4712 pp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[level], block); in xfs_btree_overlapped_query_range()
4714 ldiff = cur->bc_ops->diff_two_keys(cur, hkp, low_key); in xfs_btree_overlapped_query_range()
4715 hdiff = cur->bc_ops->diff_two_keys(cur, high_key, lkp); in xfs_btree_overlapped_query_range()
4724 error = xfs_btree_lookup_get_block(cur, level, pp, in xfs_btree_overlapped_query_range()
4728 xfs_btree_get_block(cur, level, &bp); in xfs_btree_overlapped_query_range()
4729 trace_xfs_btree_overlapped_query_range(cur, level, bp); in xfs_btree_overlapped_query_range()
4731 error = xfs_btree_check_block(cur, block, level, bp); in xfs_btree_overlapped_query_range()
4735 cur->bc_ptrs[level] = 1; in xfs_btree_overlapped_query_range()
4741 cur->bc_ptrs[level]++; in xfs_btree_overlapped_query_range()
4752 if (cur->bc_bufs[0] == NULL) { in xfs_btree_overlapped_query_range()
4753 for (i = 0; i < cur->bc_nlevels; i++) { in xfs_btree_overlapped_query_range()
4754 if (cur->bc_bufs[i]) { in xfs_btree_overlapped_query_range()
4755 xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[i]); in xfs_btree_overlapped_query_range()
4756 cur->bc_bufs[i] = NULL; in xfs_btree_overlapped_query_range()
4757 cur->bc_ptrs[i] = 0; in xfs_btree_overlapped_query_range()
4758 cur->bc_ra[i] = 0; in xfs_btree_overlapped_query_range()
4774 struct xfs_btree_cur *cur, in xfs_btree_query_range() argument
4785 cur->bc_rec = *high_rec; in xfs_btree_query_range()
4786 cur->bc_ops->init_rec_from_cur(cur, &rec); in xfs_btree_query_range()
4787 cur->bc_ops->init_key_from_rec(&high_key, &rec); in xfs_btree_query_range()
4789 cur->bc_rec = *low_rec; in xfs_btree_query_range()
4790 cur->bc_ops->init_rec_from_cur(cur, &rec); in xfs_btree_query_range()
4791 cur->bc_ops->init_key_from_rec(&low_key, &rec); in xfs_btree_query_range()
4794 if (cur->bc_ops->diff_two_keys(cur, &low_key, &high_key) > 0) in xfs_btree_query_range()
4797 if (!(cur->bc_flags & XFS_BTREE_OVERLAPPING)) in xfs_btree_query_range()
4798 return xfs_btree_simple_query_range(cur, &low_key, in xfs_btree_query_range()
4800 return xfs_btree_overlapped_query_range(cur, &low_key, &high_key, in xfs_btree_query_range()
4807 struct xfs_btree_cur *cur, in xfs_btree_query_all() argument
4814 memset(&cur->bc_rec, 0, sizeof(cur->bc_rec)); in xfs_btree_query_all()
4818 return xfs_btree_simple_query_range(cur, &low_key, &high_key, fn, priv); in xfs_btree_query_all()
4846 struct xfs_btree_cur *cur, in xfs_btree_count_blocks_helper() argument
4859 struct xfs_btree_cur *cur, in xfs_btree_count_blocks() argument
4863 return xfs_btree_visit_blocks(cur, xfs_btree_count_blocks_helper, in xfs_btree_count_blocks()
4870 struct xfs_btree_cur *cur, in xfs_btree_diff_two_ptrs() argument
4874 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_diff_two_ptrs()
4882 struct xfs_btree_cur *cur, in xfs_btree_has_record_helper() argument
4892 struct xfs_btree_cur *cur, in xfs_btree_has_record() argument
4899 error = xfs_btree_query_range(cur, low, high, in xfs_btree_has_record()
4912 struct xfs_btree_cur *cur) in xfs_btree_has_more_records() argument
4917 block = xfs_btree_get_block(cur, 0, &bp); in xfs_btree_has_more_records()
4920 if (cur->bc_ptrs[0] < xfs_btree_get_numrecs(block)) in xfs_btree_has_more_records()
4924 if (cur->bc_flags & XFS_BTREE_LONG_PTRS) in xfs_btree_has_more_records()