xfs: introduce interval queries on btrees
Create a function to enable querying of btree records mapping to a range of keys. This will be used in subsequent patches to allow querying the reverse mapping btree to find the extents mapped to a range of physical blocks, though the generic code can be used for any range query. The overlapped query range function needs to use the btree get_block helper because the root block could be an inode, in which case bc_bufs[nlevels-1] will be NULL. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:

committed by
Dave Chinner

parent
2c813ad66a
commit
105f7d83db
@@ -227,6 +227,12 @@ struct xfs_btree_ops {
|
||||
#define LASTREC_DELREC 2
|
||||
|
||||
|
||||
union xfs_btree_irec {
|
||||
struct xfs_alloc_rec_incore a;
|
||||
struct xfs_bmbt_irec b;
|
||||
struct xfs_inobt_rec_incore i;
|
||||
};
|
||||
|
||||
/*
|
||||
* Btree cursor structure.
|
||||
* This collects all information needed by the btree code in one place.
|
||||
@@ -237,11 +243,7 @@ typedef struct xfs_btree_cur
|
||||
struct xfs_mount *bc_mp; /* file system mount struct */
|
||||
const struct xfs_btree_ops *bc_ops;
|
||||
uint bc_flags; /* btree features - below */
|
||||
union {
|
||||
xfs_alloc_rec_incore_t a;
|
||||
xfs_bmbt_irec_t b;
|
||||
xfs_inobt_rec_incore_t i;
|
||||
} bc_rec; /* current insert/search record value */
|
||||
union xfs_btree_irec bc_rec; /* current insert/search record value */
|
||||
struct xfs_buf *bc_bufs[XFS_BTREE_MAXLEVELS]; /* buf ptr per level */
|
||||
int bc_ptrs[XFS_BTREE_MAXLEVELS]; /* key/record # */
|
||||
__uint8_t bc_ra[XFS_BTREE_MAXLEVELS]; /* readahead bits */
|
||||
@@ -524,4 +526,14 @@ void xfs_btree_get_node_keys_overlapped(struct xfs_btree_cur *cur,
|
||||
struct xfs_btree_block *block, union xfs_btree_key *key);
|
||||
int xfs_btree_update_keys_overlapped(struct xfs_btree_cur *cur, int level);
|
||||
|
||||
/* return codes */
|
||||
#define XFS_BTREE_QUERY_RANGE_CONTINUE 0 /* keep iterating */
|
||||
#define XFS_BTREE_QUERY_RANGE_ABORT 1 /* stop iterating */
|
||||
typedef int (*xfs_btree_query_range_fn)(struct xfs_btree_cur *cur,
|
||||
union xfs_btree_rec *rec, void *priv);
|
||||
|
||||
int xfs_btree_query_range(struct xfs_btree_cur *cur,
|
||||
union xfs_btree_irec *low_rec, union xfs_btree_irec *high_rec,
|
||||
xfs_btree_query_range_fn fn, void *priv);
|
||||
|
||||
#endif /* __XFS_BTREE_H__ */
|
||||
|
Reference in New Issue
Block a user