/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2020 Oracle. All Rights Reserved. * Author: Darrick J. Wong <darrick.wong@oracle.com> */ #ifndef __XFS_BTREE_STAGING_H__ #define __XFS_BTREE_STAGING_H__ /* Fake root for an AG-rooted btree. */ struct xbtree_afakeroot { /* AG block number of the new btree root. */ xfs_agblock_t af_root; /* Height of the new btree. */ unsigned int af_levels; /* Number of blocks used by the btree. */ unsigned int af_blocks; }; /* Cursor interactions with fake roots for AG-rooted btrees. */ void xfs_btree_stage_afakeroot(struct xfs_btree_cur *cur, struct xbtree_afakeroot *afake); void xfs_btree_commit_afakeroot(struct xfs_btree_cur *cur, struct xfs_trans *tp, struct xfs_buf *agbp, const struct xfs_btree_ops *ops); /* Fake root for an inode-rooted btree. */ struct xbtree_ifakeroot { /* Fake inode fork. */ struct xfs_ifork *if_fork; /* Number of blocks used by the btree. */ int64_t if_blocks; /* Height of the new btree. */ unsigned int if_levels; /* Number of bytes available for this fork in the inode. */ unsigned int if_fork_size; /* Fork format. */ unsigned int if_format; /* Number of records. */ unsigned int if_extents; }; /* Cursor interactions with fake roots for inode-rooted btrees. */ void xfs_btree_stage_ifakeroot(struct xfs_btree_cur *cur, struct xbtree_ifakeroot *ifake, struct xfs_btree_ops **new_ops); void xfs_btree_commit_ifakeroot(struct xfs_btree_cur *cur, struct xfs_trans *tp, int whichfork, const struct xfs_btree_ops *ops); /* Bulk loading of staged btrees. */ typedef int (*xfs_btree_bload_get_record_fn)(struct xfs_btree_cur *cur, void *priv); typedef int (*xfs_btree_bload_claim_block_fn)(struct xfs_btree_cur *cur, union xfs_btree_ptr *ptr, void *priv); typedef size_t (*xfs_btree_bload_iroot_size_fn)(struct xfs_btree_cur *cur, unsigned int nr_this_level, void *priv); struct xfs_btree_bload { /* * This function will be called nr_records times to load records into * the btree. The function does this by setting the cursor's bc_rec * field in in-core format. Records must be returned in sort order. */ xfs_btree_bload_get_record_fn get_record; /* * This function will be called nr_blocks times to obtain a pointer * to a new btree block on disk. Callers must preallocate all space * for the new btree before calling xfs_btree_bload, and this function * is what claims that reservation. */ xfs_btree_bload_claim_block_fn claim_block; /* * This function should return the size of the in-core btree root * block. It is only necessary for XFS_BTREE_ROOT_IN_INODE btree * types. */ xfs_btree_bload_iroot_size_fn iroot_size; /* * The caller should set this to the number of records that will be * stored in the new btree. */ uint64_t nr_records; /* * Number of free records to leave in each leaf block. If the caller * sets this to -1, the slack value will be calculated to be halfway * between maxrecs and minrecs. This typically leaves the block 75% * full. Note that slack values are not enforced on inode root blocks. */ int leaf_slack; /* * Number of free key/ptrs pairs to leave in each node block. This * field has the same semantics as leaf_slack. */ int node_slack; /* * The xfs_btree_bload_compute_geometry function will set this to the * number of btree blocks needed to store nr_records records. */ uint64_t nr_blocks; /* * The xfs_btree_bload_compute_geometry function will set this to the * height of the new btree. */ unsigned int btree_height; }; int xfs_btree_bload_compute_geometry(struct xfs_btree_cur *cur, struct xfs_btree_bload *bbl, uint64_t nr_records); int xfs_btree_bload(struct xfs_btree_cur *cur, struct xfs_btree_bload *bbl, void *priv); #endif /* __XFS_BTREE_STAGING_H__ */
You are looking at a code browser for Linux.
By using this web interface, you can navigate the source code of Linux by following simple links, search it by using the box in the navigation bar, or use vi inspired key bindings to move within files.
It should all be pretty intuitive, but to get started, here are a few things you may want to try:
This site was generated via sbexr, which uses LLVM and clang to parse and index the code.
sbexr is free software (as in "free speech"), under heavy development. sbexr.rabexc.org and the Linux kernel source code are used as a playground to test new features, observe bugs, and gather feedback. Check there often if you want to see new features in action.
As of today, the best way to know more about the project or participate in the development is to join the mailing list, and follow the project on github.