summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/common/avl/avl.c
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2014-08-12 00:53:03 +0000
committerdelphij <delphij@FreeBSD.org>2014-08-12 00:53:03 +0000
commit63a479a6fbfba8b52dc7d41d8cf7bf3e13048dc5 (patch)
tree67bace82f10217b9fefcf35a7d14f3f213f2a533 /sys/cddl/contrib/opensolaris/common/avl/avl.c
parent2a07fd9787d8e4590d16e794e7b9dbbf8f0bfaf2 (diff)
downloadFreeBSD-src-63a479a6fbfba8b52dc7d41d8cf7bf3e13048dc5.zip
FreeBSD-src-63a479a6fbfba8b52dc7d41d8cf7bf3e13048dc5.tar.gz
MFC r269229,269404,269466: MFV r269223:
Change dn->dn_dbufs from linked list to AVL tree. Illumos issues: 4873 zvol unmap calls can take a very long time for larger datasets
Diffstat (limited to 'sys/cddl/contrib/opensolaris/common/avl/avl.c')
-rw-r--r--sys/cddl/contrib/opensolaris/common/avl/avl.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sys/cddl/contrib/opensolaris/common/avl/avl.c b/sys/cddl/contrib/opensolaris/common/avl/avl.c
index 7f54c33..9d86242 100644
--- a/sys/cddl/contrib/opensolaris/common/avl/avl.c
+++ b/sys/cddl/contrib/opensolaris/common/avl/avl.c
@@ -24,6 +24,10 @@
*/
/*
+ * Copyright (c) 2014 by Delphix. All rights reserved.
+ */
+
+/*
* AVL - generic AVL tree implementation for kernel use
*
* A complete description of AVL trees can be found in many CS textbooks.
@@ -85,6 +89,12 @@
* is a modified "avl_node_t *". The bottom bit (normally 0 for a
* pointer) is set to indicate if that the new node has a value greater
* than the value of the indicated "avl_node_t *".
+ *
+ * Note - in addition to userland (e.g. libavl and libutil) and the kernel
+ * (e.g. genunix), avl.c is compiled into ld.so and kmdb's genunix module,
+ * which each have their own compilation environments and subsequent
+ * requirements. Each of these environments must be considered when adding
+ * dependencies from avl.c.
*/
#include <sys/types.h>
@@ -864,6 +874,24 @@ avl_update(avl_tree_t *t, void *obj)
return (B_FALSE);
}
+void
+avl_swap(avl_tree_t *tree1, avl_tree_t *tree2)
+{
+ avl_node_t *temp_node;
+ ulong_t temp_numnodes;
+
+ ASSERT3P(tree1->avl_compar, ==, tree2->avl_compar);
+ ASSERT3U(tree1->avl_offset, ==, tree2->avl_offset);
+ ASSERT3U(tree1->avl_size, ==, tree2->avl_size);
+
+ temp_node = tree1->avl_root;
+ temp_numnodes = tree1->avl_numnodes;
+ tree1->avl_root = tree2->avl_root;
+ tree1->avl_numnodes = tree2->avl_numnodes;
+ tree2->avl_root = temp_node;
+ tree2->avl_numnodes = temp_numnodes;
+}
+
/*
* initialize a new AVL tree
*/
OpenPOWER on IntegriCloud