summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruenba@redhat.com>2025-01-27 14:33:20 +0100
committerKent Overstreet <kent.overstreet@linux.dev>2025-03-07 16:16:26 -0500
commit9ca2f6641f09dc7589b2edc7651b634b75dc21ba (patch)
tree7ca17389c3925e214c0503c18513d596f3ca7050
parent7d3a96eb08ed815d4104237c7748d23146f11d12 (diff)
bcachefs: simplify eytzinger0_find_le
Replace the over-complicated implementation of eytzinger0_find_le() by an equivalent, simpler version. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/eytzinger.h26
1 files changed, 6 insertions, 20 deletions
diff --git a/fs/bcachefs/eytzinger.h b/fs/bcachefs/eytzinger.h
index 08256fcaeeb7..a530dbcde476 100644
--- a/fs/bcachefs/eytzinger.h
+++ b/fs/bcachefs/eytzinger.h
@@ -254,26 +254,12 @@ static inline int eytzinger0_find_le(void *base, size_t nr, size_t size,
cmp_func_t cmp, const void *search)
{
void *base1 = base - size;
- unsigned i, n = 1;
-
- if (!nr)
- return -1;
-
- do {
- i = n;
- n = eytzinger1_child(i, cmp(base1 + i * size, search) <= 0);
- } while (n <= nr);
-
- if (!(n & 1)) {
- /*
- * @i was greater than @search, return previous node:
- *
- * if @i was leftmost/smallest element,
- * eytzinger1_prev(eytzinger1_first())) returns 0, as expected
- */
- i = eytzinger1_prev(i, nr);
- }
- return i - 1;
+ unsigned n = 1;
+
+ while (n <= nr)
+ n = eytzinger1_child(n, cmp(base1 + n * size, search) <= 0);
+ n >>= __ffs(n) + 1;
+ return n - 1;
}
static inline int eytzinger0_find_gt(void *base, size_t nr, size_t size,