aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/lustre/lustre/ldlm/interval_tree.c
diff options
context:
space:
mode:
authorJames Simmons <jsimmons@infradead.org>2017-07-26 11:22:26 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-07-30 08:08:31 -0700
commitec57d6e63c070ddba1d00ca91fd852e947e4ff5d (patch)
tree157fd0cb78672db7af6c25268c91301c22a9b793 /drivers/staging/lustre/lustre/ldlm/interval_tree.c
parentstaging: lustre: ptlrpc: no need to reassign mbits for replay (diff)
downloadlinux-dev-ec57d6e63c070ddba1d00ca91fd852e947e4ff5d.tar.xz
linux-dev-ec57d6e63c070ddba1d00ca91fd852e947e4ff5d.zip
staging: lustre: ldlm: restore interval_iterate_reverse function
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>
Diffstat (limited to 'drivers/staging/lustre/lustre/ldlm/interval_tree.c')
-rw-r--r--drivers/staging/lustre/lustre/ldlm/interval_tree.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/staging/lustre/lustre/ldlm/interval_tree.c b/drivers/staging/lustre/lustre/ldlm/interval_tree.c
index e1069021420d..5bebd9a361ee 100644
--- a/drivers/staging/lustre/lustre/ldlm/interval_tree.c
+++ b/drivers/staging/lustre/lustre/ldlm/interval_tree.c
@@ -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)
{