From: Christoph Hellwig Date: Mon, 21 Oct 2024 00:10:40 +0000 (-0700) Subject: libfrog: add xarray emulation X-Git-Tag: v6.12.0~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5bed9480fecd31304f087307a05a58bf1d520589;p=thirdparty%2Fxfsprogs-dev.git libfrog: add xarray emulation Implement the simple parts of the kernel xarray API on-top of the libfrog radix-tree. Signed-off-by: Christoph Hellwig Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong --- diff --git a/libfrog/radix-tree.h b/libfrog/radix-tree.h index dad5f5b7..fe896134 100644 --- a/libfrog/radix-tree.h +++ b/libfrog/radix-tree.h @@ -63,4 +63,39 @@ int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag); static inline int radix_tree_preload(int gfp_mask) { return 0; } static inline void radix_tree_preload_end(void) { } +/* + * Emulation of the kernel xarray API. Note that unlike the kernel + * xarray, there is no internal locking so code using this should not + * allow concurrent operations in userspace. + */ +struct xarray { + struct radix_tree_root r; +}; + +static inline void xa_init(struct xarray *xa) +{ + INIT_RADIX_TREE(&xa->r, GFP_KERNEL); +} + +static inline void *xa_load(struct xarray *xa, unsigned long index) +{ + return radix_tree_lookup(&xa->r, index); +} + +static inline void *xa_erase(struct xarray *xa, unsigned long index) +{ + return radix_tree_delete(&xa->r, index); +} + +static inline int xa_insert(struct xarray *xa, unsigned long index, void *entry, + unsigned int gfp) +{ + int error; + + error = radix_tree_insert(&xa->r, index, entry); + if (error == -EEXIST) + return -EBUSY; + return error; +} + #endif /* __LIBFROG_RADIX_TREE_H__ */