Commit a8e4da25 authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Linus Torvalds
Browse files

radix-tree: tidy up range_tag_if_tagged



Convert radix_tree_range_tag_if_tagged to name the nodes parent, node
and child instead of node & slot.

Use parent->offset instead of playing games with 'upindex'.

Signed-off-by: default avatarMatthew Wilcox <willy@linux.intel.com>
Cc: Konstantin Khlebnikov <koct9i@gmail.com>
Cc: Kirill Shutemov <kirill.shutemov@linux.intel.com>
Cc: Jan Kara <jack@suse.com>
Cc: Neil Brown <neilb@suse.de>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 8c1244de
Loading
Loading
Loading
Loading
+17 −22
Original line number Diff line number Diff line
@@ -1009,9 +1009,9 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
		unsigned long nr_to_tag,
		unsigned int iftag, unsigned int settag)
{
	struct radix_tree_node *slot, *node = NULL;
	struct radix_tree_node *parent, *node, *child;
	unsigned long maxindex;
	unsigned int shift = radix_tree_load_root(root, &slot, &maxindex);
	unsigned int shift = radix_tree_load_root(root, &child, &maxindex);
	unsigned long tagged = 0;
	unsigned long index = *first_indexp;

@@ -1024,28 +1024,25 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
		*first_indexp = last_index + 1;
		return 0;
	}
	if (!radix_tree_is_internal_node(slot)) {
	if (!radix_tree_is_internal_node(child)) {
		*first_indexp = last_index + 1;
		root_tag_set(root, settag);
		return 1;
	}

	node = entry_to_node(slot);
	node = entry_to_node(child);
	shift -= RADIX_TREE_MAP_SHIFT;

	for (;;) {
		unsigned long upindex;
		unsigned offset;

		offset = (index >> shift) & RADIX_TREE_MAP_MASK;
		offset = radix_tree_descend(node, &slot, offset);
		if (!slot)
		unsigned offset = (index >> shift) & RADIX_TREE_MAP_MASK;
		offset = radix_tree_descend(node, &child, offset);
		if (!child)
			goto next;
		if (!tag_get(node, iftag, offset))
			goto next;
		/* Sibling slots never have tags set on them */
		if (radix_tree_is_internal_node(slot)) {
			node = entry_to_node(slot);
		if (radix_tree_is_internal_node(child)) {
			node = entry_to_node(child);
			shift -= RADIX_TREE_MAP_SHIFT;
			continue;
		}
@@ -1054,20 +1051,18 @@ unsigned long radix_tree_range_tag_if_tagged(struct radix_tree_root *root,
		tagged++;
		tag_set(node, settag, offset);

		slot = node->parent;
		/* walk back up the path tagging interior nodes */
		upindex = index >> shift;
		while (slot) {
			upindex >>= RADIX_TREE_MAP_SHIFT;
			offset = upindex & RADIX_TREE_MAP_MASK;

		parent = node;
		for (;;) {
			offset = parent->offset;
			parent = parent->parent;
			if (!parent)
				break;
			/* stop if we find a node with the tag already set */
			if (tag_get(slot, settag, offset))
			if (tag_get(parent, settag, offset))
				break;
			tag_set(slot, settag, offset);
			slot = slot->parent;
			tag_set(parent, settag, offset);
		}

 next:
		/* Go to next item at level determined by 'shift' */
		index = ((index >> shift) + 1) << shift;