Lines Matching +full:reverse +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2018-2024 Oracle. All Rights Reserved.
37 * Realtime Reverse Map btree.
50 return xfs_rtrmapbt_init_cursor(cur->bc_tp, to_rtg(cur->bc_group)); in xfs_rtrmapbt_dup_cursor()
58 if (level == cur->bc_nlevels - 1) { in xfs_rtrmapbt_get_minrecs()
61 return xfs_rtrmapbt_maxrecs(cur->bc_mp, ifp->if_broot_bytes, in xfs_rtrmapbt_get_minrecs()
65 return cur->bc_mp->m_rtrmap_mnr[level != 0]; in xfs_rtrmapbt_get_minrecs()
73 if (level == cur->bc_nlevels - 1) { in xfs_rtrmapbt_get_maxrecs()
76 return xfs_rtrmapbt_maxrecs(cur->bc_mp, ifp->if_broot_bytes, in xfs_rtrmapbt_get_maxrecs()
80 return cur->bc_mp->m_rtrmap_mxr[level != 0]; in xfs_rtrmapbt_get_maxrecs()
89 blocklen -= sizeof(struct xfs_rtrmap_root); in xfs_rtrmapbt_droot_maxrecs()
98 * Get the maximum records we could store in the on-disk format.
100 * For non-root nodes this is equivalent to xfs_rtrmapbt_get_maxrecs, but
102 * so that we can resize the in-memory buffer to match it. After a
111 if (level != cur->bc_nlevels - 1) in xfs_rtrmapbt_get_dmaxrecs()
112 return cur->bc_mp->m_rtrmap_mxr[level != 0]; in xfs_rtrmapbt_get_dmaxrecs()
113 return xfs_rtrmapbt_droot_maxrecs(cur->bc_ino.forksize, level == 0); in xfs_rtrmapbt_get_dmaxrecs()
123 return rec->rmap.rm_offset & ~cpu_to_be64(XFS_RMAP_OFF_UNWRITTEN); in ondisk_rec_offset_to_key()
131 key->rmap.rm_startblock = rec->rmap.rm_startblock; in xfs_rtrmapbt_init_key_from_rec()
132 key->rmap.rm_owner = rec->rmap.rm_owner; in xfs_rtrmapbt_init_key_from_rec()
133 key->rmap.rm_offset = ondisk_rec_offset_to_key(rec); in xfs_rtrmapbt_init_key_from_rec()
144 adj = be32_to_cpu(rec->rmap.rm_blockcount) - 1; in xfs_rtrmapbt_init_high_key_from_rec()
146 key->rmap.rm_startblock = rec->rmap.rm_startblock; in xfs_rtrmapbt_init_high_key_from_rec()
147 be32_add_cpu(&key->rmap.rm_startblock, adj); in xfs_rtrmapbt_init_high_key_from_rec()
148 key->rmap.rm_owner = rec->rmap.rm_owner; in xfs_rtrmapbt_init_high_key_from_rec()
149 key->rmap.rm_offset = ondisk_rec_offset_to_key(rec); in xfs_rtrmapbt_init_high_key_from_rec()
150 if (XFS_RMAP_NON_INODE_OWNER(be64_to_cpu(rec->rmap.rm_owner)) || in xfs_rtrmapbt_init_high_key_from_rec()
151 XFS_RMAP_IS_BMBT_BLOCK(be64_to_cpu(rec->rmap.rm_offset))) in xfs_rtrmapbt_init_high_key_from_rec()
153 off = be64_to_cpu(key->rmap.rm_offset); in xfs_rtrmapbt_init_high_key_from_rec()
155 key->rmap.rm_offset = cpu_to_be64(off); in xfs_rtrmapbt_init_high_key_from_rec()
163 rec->rmap.rm_startblock = cpu_to_be32(cur->bc_rec.r.rm_startblock); in xfs_rtrmapbt_init_rec_from_cur()
164 rec->rmap.rm_blockcount = cpu_to_be32(cur->bc_rec.r.rm_blockcount); in xfs_rtrmapbt_init_rec_from_cur()
165 rec->rmap.rm_owner = cpu_to_be64(cur->bc_rec.r.rm_owner); in xfs_rtrmapbt_init_rec_from_cur()
166 rec->rmap.rm_offset = cpu_to_be64( in xfs_rtrmapbt_init_rec_from_cur()
167 xfs_rmap_irec_offset_pack(&cur->bc_rec.r)); in xfs_rtrmapbt_init_rec_from_cur()
175 ptr->l = 0; in xfs_rtrmapbt_init_ptr_from_cur()
193 struct xfs_rmap_irec *rec = &cur->bc_rec.r; in xfs_rtrmapbt_key_diff()
194 const struct xfs_rmap_key *kp = &key->rmap; in xfs_rtrmapbt_key_diff()
198 d = (int64_t)be32_to_cpu(kp->rm_startblock) - rec->rm_startblock; in xfs_rtrmapbt_key_diff()
202 x = be64_to_cpu(kp->rm_owner); in xfs_rtrmapbt_key_diff()
203 y = rec->rm_owner; in xfs_rtrmapbt_key_diff()
207 return -1; in xfs_rtrmapbt_key_diff()
209 x = offset_keymask(be64_to_cpu(kp->rm_offset)); in xfs_rtrmapbt_key_diff()
214 return -1; in xfs_rtrmapbt_key_diff()
225 const struct xfs_rmap_key *kp1 = &k1->rmap; in xfs_rtrmapbt_diff_two_keys()
226 const struct xfs_rmap_key *kp2 = &k2->rmap; in xfs_rtrmapbt_diff_two_keys()
231 ASSERT(!mask || mask->rmap.rm_startblock); in xfs_rtrmapbt_diff_two_keys()
233 d = (int64_t)be32_to_cpu(kp1->rm_startblock) - in xfs_rtrmapbt_diff_two_keys()
234 be32_to_cpu(kp2->rm_startblock); in xfs_rtrmapbt_diff_two_keys()
238 if (!mask || mask->rmap.rm_owner) { in xfs_rtrmapbt_diff_two_keys()
239 x = be64_to_cpu(kp1->rm_owner); in xfs_rtrmapbt_diff_two_keys()
240 y = be64_to_cpu(kp2->rm_owner); in xfs_rtrmapbt_diff_two_keys()
244 return -1; in xfs_rtrmapbt_diff_two_keys()
247 if (!mask || mask->rmap.rm_offset) { in xfs_rtrmapbt_diff_two_keys()
249 ASSERT(!mask || mask->rmap.rm_owner); in xfs_rtrmapbt_diff_two_keys()
251 x = offset_keymask(be64_to_cpu(kp1->rm_offset)); in xfs_rtrmapbt_diff_two_keys()
252 y = offset_keymask(be64_to_cpu(kp2->rm_offset)); in xfs_rtrmapbt_diff_two_keys()
256 return -1; in xfs_rtrmapbt_diff_two_keys()
266 struct xfs_mount *mp = bp->b_target->bt_mount; in xfs_rtrmapbt_verify()
271 if (!xfs_verify_magic(bp, block->bb_magic)) in xfs_rtrmapbt_verify()
279 level = be16_to_cpu(block->bb_level); in xfs_rtrmapbt_verify()
280 if (level > mp->m_rtrmap_maxlevels) in xfs_rtrmapbt_verify()
283 return xfs_btree_fsblock_verify(bp, mp->m_rtrmap_mxr[level != 0]); in xfs_rtrmapbt_verify()
293 xfs_verifier_error(bp, -EFSBADCRC, __this_address); in xfs_rtrmapbt_read_verify()
297 xfs_verifier_error(bp, -EFSCORRUPTED, fa); in xfs_rtrmapbt_read_verify()
300 if (bp->b_error) in xfs_rtrmapbt_read_verify()
313 xfs_verifier_error(bp, -EFSCORRUPTED, fa); in xfs_rtrmapbt_write_verify()
339 x = be32_to_cpu(k1->rmap.rm_startblock); in xfs_rtrmapbt_keys_inorder()
340 y = be32_to_cpu(k2->rmap.rm_startblock); in xfs_rtrmapbt_keys_inorder()
345 a = be64_to_cpu(k1->rmap.rm_owner); in xfs_rtrmapbt_keys_inorder()
346 b = be64_to_cpu(k2->rmap.rm_owner); in xfs_rtrmapbt_keys_inorder()
351 a = offset_keymask(be64_to_cpu(k1->rmap.rm_offset)); in xfs_rtrmapbt_keys_inorder()
352 b = offset_keymask(be64_to_cpu(k2->rmap.rm_offset)); in xfs_rtrmapbt_keys_inorder()
369 x = be32_to_cpu(r1->rmap.rm_startblock); in xfs_rtrmapbt_recs_inorder()
370 y = be32_to_cpu(r2->rmap.rm_startblock); in xfs_rtrmapbt_recs_inorder()
375 a = be64_to_cpu(r1->rmap.rm_owner); in xfs_rtrmapbt_recs_inorder()
376 b = be64_to_cpu(r2->rmap.rm_owner); in xfs_rtrmapbt_recs_inorder()
381 a = offset_keymask(be64_to_cpu(r1->rmap.rm_offset)); in xfs_rtrmapbt_recs_inorder()
382 b = offset_keymask(be64_to_cpu(r2->rmap.rm_offset)); in xfs_rtrmapbt_recs_inorder()
395 ASSERT(!mask || mask->rmap.rm_startblock); in xfs_rtrmapbt_keys_contiguous()
402 ASSERT(!mask || (!mask->rmap.rm_owner && !mask->rmap.rm_offset)); in xfs_rtrmapbt_keys_contiguous()
404 return xbtree_key_contig(be32_to_cpu(key1->rmap.rm_startblock), in xfs_rtrmapbt_keys_contiguous()
405 be32_to_cpu(key2->rmap.rm_startblock)); in xfs_rtrmapbt_keys_contiguous()
429 struct xfs_mount *mp = cur->bc_mp; in xfs_rtrmapbt_broot_realloc()
433 unsigned int old_size = ifp->if_broot_bytes; in xfs_rtrmapbt_broot_realloc()
434 const unsigned int level = cur->bc_nlevels - 1; in xfs_rtrmapbt_broot_realloc()
440 return ifp->if_broot; in xfs_rtrmapbt_broot_realloc()
469 ASSERT(ifp->if_broot != NULL && old_size > 0); in xfs_rtrmapbt_broot_realloc()
479 xfs_rtrmapbt_move_ptrs(mp, ifp->if_broot, old_size, new_size, in xfs_rtrmapbt_broot_realloc()
485 xfs_inode_fork_size(cur->bc_ino.ip, cur->bc_ino.whichfork)); in xfs_rtrmapbt_broot_realloc()
536 mp->m_rtrmap_maxlevels, xfs_rtrmapbt_cur_cache); in xfs_rtrmapbt_init_cursor()
538 cur->bc_ino.ip = ip; in xfs_rtrmapbt_init_cursor()
539 cur->bc_group = xfs_group_hold(rtg_group(rtg)); in xfs_rtrmapbt_init_cursor()
540 cur->bc_ino.whichfork = XFS_DATA_FORK; in xfs_rtrmapbt_init_cursor()
541 cur->bc_nlevels = be16_to_cpu(ip->i_df.if_broot->bb_level) + 1; in xfs_rtrmapbt_init_cursor()
542 cur->bc_ino.forksize = xfs_inode_fork_size(ip, XFS_DATA_FORK); in xfs_rtrmapbt_init_cursor()
549 * Validate an in-memory realtime rmap btree block. Callers are allowed to
550 * generate an in-memory btree even if the ondisk feature is not enabled.
556 struct xfs_mount *mp = bp->b_mount; in xfs_rtrmapbt_mem_verify()
562 if (!xfs_verify_magic(bp, block->bb_magic)) in xfs_rtrmapbt_mem_verify()
569 level = be16_to_cpu(block->bb_level); in xfs_rtrmapbt_mem_verify()
571 if (level >= mp->m_rtrmap_maxlevels) in xfs_rtrmapbt_mem_verify()
589 xfs_verifier_error(bp, -EFSCORRUPTED, fa); in xfs_rtrmapbt_mem_rw_verify()
592 /* skip crc checks on in-memory btrees to save time */
631 /* Create a cursor for an in-memory btree. */
642 mp->m_rtrmap_maxlevels, xfs_rtrmapbt_cur_cache); in xfs_rtrmapbt_mem_cursor()
643 cur->bc_mem.xfbtree = xfbt; in xfs_rtrmapbt_mem_cursor()
644 cur->bc_nlevels = xfbt->nlevels; in xfs_rtrmapbt_mem_cursor()
645 cur->bc_group = xfs_group_hold(rtg_group(rtg)); in xfs_rtrmapbt_mem_cursor()
649 /* Create an in-memory realtime rmap btree. */
657 xfbt->owner = rgno; in xfs_rtrmapbt_mem_init()
663 * Install a new rt reverse mapping btree root. Caller is responsible for
671 struct xbtree_ifakeroot *ifake = cur->bc_ino.ifake; in xfs_rtrmapbt_commit_staged_btree()
675 ASSERT(cur->bc_flags & XFS_BTREE_STAGING); in xfs_rtrmapbt_commit_staged_btree()
676 ASSERT(ifake->if_fork->if_format == XFS_DINODE_FMT_META_BTREE); in xfs_rtrmapbt_commit_staged_btree()
679 * Free any resources hanging off the real fork, then shallow-copy the in xfs_rtrmapbt_commit_staged_btree()
683 ifp = xfs_ifork_ptr(cur->bc_ino.ip, XFS_DATA_FORK); in xfs_rtrmapbt_commit_staged_btree()
685 memcpy(ifp, ifake->if_fork, sizeof(struct xfs_ifork)); in xfs_rtrmapbt_commit_staged_btree()
687 cur->bc_ino.ip->i_projid = cur->bc_group->xg_gno; in xfs_rtrmapbt_commit_staged_btree()
688 xfs_trans_log_inode(tp, cur->bc_ino.ip, flags); in xfs_rtrmapbt_commit_staged_btree()
692 /* Calculate number of records in a rt reverse mapping btree block. */
705 * Calculate number of records in an rt reverse mapping btree block.
713 blocklen -= XFS_RTRMAP_BLOCK_LEN; in xfs_rtrmapbt_maxrecs()
717 /* Compute the max possible height for realtime reverse mapping btrees. */
725 blocklen = XFS_MIN_CRC_BLOCKSIZE - XFS_BTREE_LBLOCK_CRC_LEN; in xfs_rtrmapbt_maxlevels_ondisk()
736 * likely to run out of blocks in the data device long before that in xfs_rtrmapbt_maxlevels_ondisk()
739 * in the data device due to maximal sharing factor. in xfs_rtrmapbt_maxlevels_ondisk()
741 max_dblocks = -1U; /* max ag count */ in xfs_rtrmapbt_maxlevels_ondisk()
754 return -ENOMEM; in xfs_rtrmapbt_init_cur_cache()
765 /* Compute the maximum height of an rt reverse mapping btree. */
773 mp->m_rtrmap_maxlevels = 0; in xfs_rtrmapbt_compute_maxlevels()
778 * The realtime rmapbt lives on the data device, which means that its in xfs_rtrmapbt_compute_maxlevels()
779 * maximum height is constrained by the size of the data device and in xfs_rtrmapbt_compute_maxlevels()
787 * size of the data device. in xfs_rtrmapbt_compute_maxlevels()
789 d_maxlevels = xfs_btree_space_to_height(mp->m_rtrmap_mnr, in xfs_rtrmapbt_compute_maxlevels()
790 mp->m_sb.sb_dblocks); in xfs_rtrmapbt_compute_maxlevels()
792 mp->m_rtrmap_maxlevels = d_maxlevels + 1; in xfs_rtrmapbt_compute_maxlevels()
796 r_maxlevels = xfs_btree_compute_maxlevels(mp->m_rtrmap_mnr, in xfs_rtrmapbt_compute_maxlevels()
797 mp->m_groups[XG_TYPE_RTG].blocks); in xfs_rtrmapbt_compute_maxlevels()
800 mp->m_rtrmap_maxlevels = min(d_maxlevels, r_maxlevels) + 1; in xfs_rtrmapbt_compute_maxlevels()
809 return xfs_btree_calc_size(mp->m_rtrmap_mnr, len); in xfs_rtrmapbt_calc_size()
821 if (mp->m_rtrmap_mxr[0] == 0) in xfs_rtrmapbt_max_size()
834 uint32_t blocks = mp->m_groups[XG_TYPE_RTG].blocks; in xfs_rtrmapbt_calc_reserves()
844 /* Convert on-disk form of btree root to in-memory form. */
852 struct xfs_mount *mp = ip->i_mount; in xfs_rtrmapbt_from_disk()
863 xfs_btree_init_block(mp, rblock, &xfs_rtrmapbt_ops, 0, 0, ip->i_ino); in xfs_rtrmapbt_from_disk()
865 rblock->bb_level = dblock->bb_level; in xfs_rtrmapbt_from_disk()
866 rblock->bb_numrecs = dblock->bb_numrecs; in xfs_rtrmapbt_from_disk()
867 numrecs = be16_to_cpu(dblock->bb_numrecs); in xfs_rtrmapbt_from_disk()
869 if (be16_to_cpu(rblock->bb_level) > 0) { in xfs_rtrmapbt_from_disk()
884 /* Load a realtime reverse mapping btree root in from disk. */
890 struct xfs_mount *mp = ip->i_mount; in xfs_iformat_rtrmap()
901 if (!xfs_has_rmapbt(ip->i_mount)) { in xfs_iformat_rtrmap()
903 return -EFSCORRUPTED; in xfs_iformat_rtrmap()
907 numrecs = be16_to_cpu(dfp->bb_numrecs); in xfs_iformat_rtrmap()
908 level = be16_to_cpu(dfp->bb_level); in xfs_iformat_rtrmap()
910 if (level > mp->m_rtrmap_maxlevels || in xfs_iformat_rtrmap()
913 return -EFSCORRUPTED; in xfs_iformat_rtrmap()
923 /* Convert in-memory form of btree root to on-disk form. */
941 ASSERT(rblock->bb_magic == cpu_to_be32(XFS_RTRMAP_CRC_MAGIC)); in xfs_rtrmapbt_to_disk()
942 ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)); in xfs_rtrmapbt_to_disk()
943 ASSERT(rblock->bb_u.l.bb_blkno == cpu_to_be64(XFS_BUF_DADDR_NULL)); in xfs_rtrmapbt_to_disk()
944 ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLFSBLOCK)); in xfs_rtrmapbt_to_disk()
945 ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLFSBLOCK)); in xfs_rtrmapbt_to_disk()
947 dblock->bb_level = rblock->bb_level; in xfs_rtrmapbt_to_disk()
948 dblock->bb_numrecs = rblock->bb_numrecs; in xfs_rtrmapbt_to_disk()
949 numrecs = be16_to_cpu(rblock->bb_numrecs); in xfs_rtrmapbt_to_disk()
951 if (be16_to_cpu(rblock->bb_level) > 0) { in xfs_rtrmapbt_to_disk()
966 /* Flush a realtime reverse mapping btree root out to disk. */
975 ASSERT(ifp->if_broot != NULL); in xfs_iflush_rtrmap()
976 ASSERT(ifp->if_broot_bytes > 0); in xfs_iflush_rtrmap()
977 ASSERT(xfs_rtrmap_droot_space(ifp->if_broot) <= in xfs_iflush_rtrmap()
979 xfs_rtrmapbt_to_disk(ip->i_mount, ifp->if_broot, ifp->if_broot_bytes, in xfs_iflush_rtrmap()
980 dfp, XFS_DFORK_SIZE(dip, ip->i_mount, XFS_DATA_FORK)); in xfs_iflush_rtrmap()
994 struct xfs_mount *mp = ip->i_mount; in xfs_rtrmapbt_create()
997 ifp->if_format = XFS_DINODE_FMT_META_BTREE; in xfs_rtrmapbt_create()
998 ASSERT(ifp->if_broot_bytes == 0); in xfs_rtrmapbt_create()
999 ASSERT(ifp->if_bytes == 0); in xfs_rtrmapbt_create()
1005 ip->i_ino); in xfs_rtrmapbt_create()
1022 .rm_blockcount = mp->m_sb.sb_rextsize, in xfs_rtrmapbt_init_rtsb()