From: Andreas Gruenbacher Date: Mon, 27 Jan 2025 16:26:05 +0000 (+0100) Subject: bcachefs: add eytzinger0_for_each_prev X-Git-Tag: v6.15-rc1~146^2~120 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dc5ceaaad81a724e7090d8709290fae36e3f2a5d;p=thirdparty%2Fkernel%2Flinux.git bcachefs: add eytzinger0_for_each_prev Add an eytzinger0_for_each_prev() macro for iterating through an eytzinger array in reverse. Signed-off-by: Andreas Gruenbacher Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/eytzinger.h b/fs/bcachefs/eytzinger.h index 5f2f96b1295ef..99edae4bb9950 100644 --- a/fs/bcachefs/eytzinger.h +++ b/fs/bcachefs/eytzinger.h @@ -244,6 +244,11 @@ static inline unsigned inorder_to_eytzinger0(unsigned i, unsigned size) (_i) != -1; \ (_i) = eytzinger0_next((_i), (_size))) +#define eytzinger0_for_each_prev(_i, _size) \ + for (unsigned (_i) = eytzinger0_last((_size)); \ + (_i) != -1; \ + (_i) = eytzinger0_prev((_i), (_size))) + /* return greatest node <= @search, or -1 if not found */ static inline int eytzinger0_find_le(void *base, size_t nr, size_t size, cmp_func_t cmp, const void *search) diff --git a/fs/bcachefs/util.c b/fs/bcachefs/util.c index 4114e5264965b..ebe3b5b1e615b 100644 --- a/fs/bcachefs/util.c +++ b/fs/bcachefs/util.c @@ -769,6 +769,15 @@ void eytzinger0_test(void) inorder++; } BUG_ON(inorder != size); + + inorder = size - 1; + eytzinger0_for_each_prev(eytz, size) { + BUG_ON(eytz != eytzinger0_first(size) && + eytzinger0_next(eytzinger0_prev(eytz, size), size) != eytz); + + inorder--; + } + BUG_ON(inorder != -1); } }