|
@@ -23,72 +23,7 @@
|
|
|
I know it's not the cleaner way, but in C (not in C++) to get
|
|
|
performances and genericity...
|
|
|
|
|
|
- Some example of insert and search follows here. The search is a plain
|
|
|
- normal search over an ordered tree. The insert instead must be implemented
|
|
|
- in two steps: First, the code must insert the element in order as a red leaf
|
|
|
- in the tree, and then the support library function rb_insert_color() must
|
|
|
- be called. Such function will do the not trivial work to rebalance the
|
|
|
- rbtree, if necessary.
|
|
|
-
|
|
|
------------------------------------------------------------------------
|
|
|
-static inline struct page * rb_search_page_cache(struct inode * inode,
|
|
|
- unsigned long offset)
|
|
|
-{
|
|
|
- struct rb_node * n = inode->i_rb_page_cache.rb_node;
|
|
|
- struct page * page;
|
|
|
-
|
|
|
- while (n)
|
|
|
- {
|
|
|
- page = rb_entry(n, struct page, rb_page_cache);
|
|
|
-
|
|
|
- if (offset < page->offset)
|
|
|
- n = n->rb_left;
|
|
|
- else if (offset > page->offset)
|
|
|
- n = n->rb_right;
|
|
|
- else
|
|
|
- return page;
|
|
|
- }
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-static inline struct page * __rb_insert_page_cache(struct inode * inode,
|
|
|
- unsigned long offset,
|
|
|
- struct rb_node * node)
|
|
|
-{
|
|
|
- struct rb_node ** p = &inode->i_rb_page_cache.rb_node;
|
|
|
- struct rb_node * parent = NULL;
|
|
|
- struct page * page;
|
|
|
-
|
|
|
- while (*p)
|
|
|
- {
|
|
|
- parent = *p;
|
|
|
- page = rb_entry(parent, struct page, rb_page_cache);
|
|
|
-
|
|
|
- if (offset < page->offset)
|
|
|
- p = &(*p)->rb_left;
|
|
|
- else if (offset > page->offset)
|
|
|
- p = &(*p)->rb_right;
|
|
|
- else
|
|
|
- return page;
|
|
|
- }
|
|
|
-
|
|
|
- rb_link_node(node, parent, p);
|
|
|
-
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-static inline struct page * rb_insert_page_cache(struct inode * inode,
|
|
|
- unsigned long offset,
|
|
|
- struct rb_node * node)
|
|
|
-{
|
|
|
- struct page * ret;
|
|
|
- if ((ret = __rb_insert_page_cache(inode, offset, node)))
|
|
|
- goto out;
|
|
|
- rb_insert_color(node, &inode->i_rb_page_cache);
|
|
|
- out:
|
|
|
- return ret;
|
|
|
-}
|
|
|
------------------------------------------------------------------------
|
|
|
+ See Documentation/rbtree.txt for documentation and samples.
|
|
|
*/
|
|
|
|
|
|
#ifndef _LINUX_RBTREE_H
|