]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: add eytzinger0_for_each_prev
authorAndreas Gruenbacher <agruenba@redhat.com>
Mon, 27 Jan 2025 16:26:05 +0000 (17:26 +0100)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 15 Mar 2025 01:02:13 +0000 (21:02 -0400)
Add an eytzinger0_for_each_prev() macro for iterating through an
eytzinger array in reverse.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/eytzinger.h
fs/bcachefs/util.c

index 5f2f96b1295ef0a5fd09fce909ad94c89be91805..99edae4bb9950b49df875e3d4fc49b1dbf97642c 100644 (file)
@@ -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)
index 4114e5264965bbfdf0bbfbe5410c42aa63607c15..ebe3b5b1e615b4e0ff6b3841590654b77fe53909 100644 (file)
@@ -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);
        }
 }