All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nick Piggin <nickpiggin@yahoo.com.au>
To: linux-kernel <linux-kernel@vger.kernel.org>
Subject: [patch 1/5] radix tree: lookup_slot
Date: Sun, 30 Oct 2005 12:04:51 +1100	[thread overview]
Message-ID: <43641C33.1080205@yahoo.com.au> (raw)
In-Reply-To: <436416AD.3050709@yahoo.com.au>

[-- Attachment #1: Type: text/plain, Size: 178 bytes --]

1/5

Resending because I previously sent with a garbled subject line
so it looks like the list server has eaten it. Sorry if it comes
through twice.

-- 
SUSE Labs, Novell Inc.


[-- Attachment #2: radix-tree-lookup_slot.patch --]
[-- Type: text/plain, Size: 3113 bytes --]

From: Hans Reiser <reiser@namesys.com>

Reiser4 uses radix trees to solve a trouble reiser4_readdir has serving nfs
requests.

Unfortunately, radix tree api lacks an operation suitable for modifying
existing entry.  This patch adds radix_tree_lookup_slot which returns pointer
to found item within the tree.  That location can be then updated.

Signed-off-by: Nick Piggin <npiggin@suse.de>

Index: linux-2.6/include/linux/radix-tree.h
===================================================================
--- linux-2.6.orig/include/linux/radix-tree.h
+++ linux-2.6/include/linux/radix-tree.h
@@ -46,6 +46,7 @@ do {									\
 
 int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
 void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
+void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long);
 void *radix_tree_delete(struct radix_tree_root *, unsigned long);
 unsigned int
 radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
Index: linux-2.6/lib/radix-tree.c
===================================================================
--- linux-2.6.orig/lib/radix-tree.c
+++ linux-2.6/lib/radix-tree.c
@@ -281,35 +281,60 @@ int radix_tree_insert(struct radix_tree_
 }
 EXPORT_SYMBOL(radix_tree_insert);
 
-/**
- *	radix_tree_lookup    -    perform lookup operation on a radix tree
- *	@root:		radix tree root
- *	@index:		index key
- *
- *	Lookup the item at the position @index in the radix tree @root.
- */
-void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
+static inline void **__lookup_slot(struct radix_tree_root *root,
+				   unsigned long index)
 {
 	unsigned int height, shift;
-	struct radix_tree_node *slot;
+	struct radix_tree_node **slot;
 
 	height = root->height;
 	if (index > radix_tree_maxindex(height))
 		return NULL;
 
 	shift = (height-1) * RADIX_TREE_MAP_SHIFT;
-	slot = root->rnode;
+	slot = &root->rnode;
 
 	while (height > 0) {
-		if (slot == NULL)
+		if (*slot == NULL)
 			return NULL;
 
-		slot = slot->slots[(index >> shift) & RADIX_TREE_MAP_MASK];
+		slot = (struct radix_tree_node **)
+			((*slot)->slots +
+				((index >> shift) & RADIX_TREE_MAP_MASK));
 		shift -= RADIX_TREE_MAP_SHIFT;
 		height--;
 	}
 
-	return slot;
+	return (void **)slot;
+}
+
+/**
+ *	radix_tree_lookup_slot    -    lookup a slot in a radix tree
+ *	@root:		radix tree root
+ *	@index:		index key
+ *
+ *	Lookup the slot corresponding to the position @index in the radix tree
+ *	@root. This is useful for update-if-exists operations.
+ */
+void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index)
+{
+	return __lookup_slot(root, index);
+}
+EXPORT_SYMBOL(radix_tree_lookup_slot);
+
+/**
+ *	radix_tree_lookup    -    perform lookup operation on a radix tree
+ *	@root:		radix tree root
+ *	@index:		index key
+ *
+ *	Lookup the item at the position @index in the radix tree @root.
+ */
+void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
+{
+	void **slot;
+
+	slot = __lookup_slot(root, index);
+	return slot != NULL ? *slot : NULL;
 }
 EXPORT_SYMBOL(radix_tree_lookup);
 

      parent reply	other threads:[~2005-10-30  1:04 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-30  0:41 [patches] lockless pagecache prep round 1 Nick Piggin
2005-10-30  0:43 ` [patch 1/5] i386 generic cmpxchg Nick Piggin
2005-10-30  0:44   ` [patch 2/5] atomic: atomic_cmpxchg Nick Piggin
2005-10-30  0:45     ` [patch 3/5] atomic: atomic_inc_not_zero Nick Piggin
2005-10-30  0:45       ` [patch 4/5] rcu file: use atomic primitives Nick Piggin
2005-10-30  0:47         ` [patch 5/5] atomic: dec_and_lock " Nick Piggin
2005-10-31 19:05       ` [patch 3/5] atomic: atomic_inc_not_zero Christoph Lameter
2005-11-01  4:34         ` Nick Piggin
2005-11-14 16:29       ` Paul Jackson
2005-11-14 21:48         ` Andrew Morton
2005-11-14 22:02           ` Paul Jackson
2005-11-14 23:09             ` Andrew Morton
2005-11-15  8:57               ` Nick Piggin
2005-10-30 20:12   ` [patch 1/5] i386 generic cmpxchg Zwane Mwaikambo
2005-10-31  1:29     ` Nick Piggin
2005-10-31  6:06       ` Zwane Mwaikambo
2005-10-31 19:09       ` Christoph Lameter
2005-10-30  0:48 ` [patche 1/5] radix tree: lookup_slot Nick Piggin
2005-10-30  0:49   ` [patch 2/5] radix tree: use prealloc Nick Piggin
2005-10-30  0:50     ` [patch 3/5] radix tree: cleanup Nick Piggin
2005-10-30  0:51       ` [patch 4/5] radix tree: clear_tags bail Nick Piggin
2005-10-30  0:57         ` [patch 5/5] radix tree: shrink Nick Piggin
2005-10-30  1:04 ` Nick Piggin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=43641C33.1080205@yahoo.com.au \
    --to=nickpiggin@yahoo.com.au \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.