staging: lustre: ldlm: restore interval_iterate_reverse function
authorJames Simmons <jsimmons@infradead.org>
Wed, 26 Jul 2017 15:22:26 +0000 (11:22 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 30 Jul 2017 15:08:31 +0000 (08:08 -0700)
Earlier the function interval_iterate_reverse function was
removed since it wasn't used by anyone. Now it is being
restored since it will be used by a future patch.

Signed-off-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/include/interval_tree.h
drivers/staging/lustre/lustre/ldlm/interval_tree.c

index 0d4f92ec8334e43e226a6823e5f9aa2d5672112a..a4d7280e1fa4b3e0b9b6f03d45a24433353a7727 100644 (file)
@@ -111,4 +111,8 @@ enum interval_iter interval_search(struct interval_node *root,
                                   struct interval_node_extent *ex,
                                   interval_callback_t func, void *data);
 
+enum interval_iter interval_iterate_reverse(struct interval_node *root,
+                                           interval_callback_t func,
+                                           void *data);
+
 #endif
index e1069021420db50df3445919036eebf10f1d6a87..5bebd9a361ee081f6940f2bfeaa5e5c0b4be3adb 100644 (file)
@@ -110,6 +110,15 @@ static struct interval_node *interval_first(struct interval_node *node)
        return node;
 }
 
+static struct interval_node *interval_last(struct interval_node *node)
+{
+       if (!node)
+               return NULL;
+       while (node->in_right)
+               node = node->in_right;
+       return node;
+}
+
 static struct interval_node *interval_next(struct interval_node *node)
 {
        if (!node)
@@ -121,6 +130,37 @@ static struct interval_node *interval_next(struct interval_node *node)
        return node->in_parent;
 }
 
+static struct interval_node *interval_prev(struct interval_node *node)
+{
+       if (!node)
+               return NULL;
+
+       if (node->in_left)
+               return interval_last(node->in_left);
+
+       while (node->in_parent && node_is_left_child(node))
+               node = node->in_parent;
+
+       return node->in_parent;
+}
+
+enum interval_iter interval_iterate_reverse(struct interval_node *root,
+                                           interval_callback_t func,
+                                           void *data)
+{
+       enum interval_iter rc = INTERVAL_ITER_CONT;
+       struct interval_node *node;
+
+       for (node = interval_last(root); node; node = interval_prev(node)) {
+               rc = func(node, data);
+               if (rc == INTERVAL_ITER_STOP)
+                       break;
+       }
+
+       return rc;
+}
+EXPORT_SYMBOL(interval_iterate_reverse);
+
 static void __rotate_change_maxhigh(struct interval_node *node,
                                    struct interval_node *rotate)
 {