diff options
Diffstat (limited to 'lib/radix-tree.c')
-rw-r--r-- | lib/radix-tree.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index 8b1feca1230a..c8d55565fafa 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
@@ -677,8 +677,7 @@ out: | |||
677 | * @root radix tree root | 677 | * @root radix tree root |
678 | */ | 678 | */ |
679 | static inline bool radix_tree_shrink(struct radix_tree_root *root, | 679 | static inline bool radix_tree_shrink(struct radix_tree_root *root, |
680 | radix_tree_update_node_t update_node, | 680 | radix_tree_update_node_t update_node) |
681 | void *private) | ||
682 | { | 681 | { |
683 | bool shrunk = false; | 682 | bool shrunk = false; |
684 | 683 | ||
@@ -739,7 +738,7 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root, | |||
739 | if (!radix_tree_is_internal_node(child)) { | 738 | if (!radix_tree_is_internal_node(child)) { |
740 | node->slots[0] = (void __rcu *)RADIX_TREE_RETRY; | 739 | node->slots[0] = (void __rcu *)RADIX_TREE_RETRY; |
741 | if (update_node) | 740 | if (update_node) |
742 | update_node(node, private); | 741 | update_node(node); |
743 | } | 742 | } |
744 | 743 | ||
745 | WARN_ON_ONCE(!list_empty(&node->private_list)); | 744 | WARN_ON_ONCE(!list_empty(&node->private_list)); |
@@ -752,7 +751,7 @@ static inline bool radix_tree_shrink(struct radix_tree_root *root, | |||
752 | 751 | ||
753 | static bool delete_node(struct radix_tree_root *root, | 752 | static bool delete_node(struct radix_tree_root *root, |
754 | struct radix_tree_node *node, | 753 | struct radix_tree_node *node, |
755 | radix_tree_update_node_t update_node, void *private) | 754 | radix_tree_update_node_t update_node) |
756 | { | 755 | { |
757 | bool deleted = false; | 756 | bool deleted = false; |
758 | 757 | ||
@@ -762,8 +761,8 @@ static bool delete_node(struct radix_tree_root *root, | |||
762 | if (node->count) { | 761 | if (node->count) { |
763 | if (node_to_entry(node) == | 762 | if (node_to_entry(node) == |
764 | rcu_dereference_raw(root->rnode)) | 763 | rcu_dereference_raw(root->rnode)) |
765 | deleted |= radix_tree_shrink(root, update_node, | 764 | deleted |= radix_tree_shrink(root, |
766 | private); | 765 | update_node); |
767 | return deleted; | 766 | return deleted; |
768 | } | 767 | } |
769 | 768 | ||
@@ -1173,7 +1172,6 @@ static int calculate_count(struct radix_tree_root *root, | |||
1173 | * @slot: pointer to slot in @node | 1172 | * @slot: pointer to slot in @node |
1174 | * @item: new item to store in the slot. | 1173 | * @item: new item to store in the slot. |
1175 | * @update_node: callback for changing leaf nodes | 1174 | * @update_node: callback for changing leaf nodes |
1176 | * @private: private data to pass to @update_node | ||
1177 | * | 1175 | * |
1178 | * For use with __radix_tree_lookup(). Caller must hold tree write locked | 1176 | * For use with __radix_tree_lookup(). Caller must hold tree write locked |
1179 | * across slot lookup and replacement. | 1177 | * across slot lookup and replacement. |
@@ -1181,7 +1179,7 @@ static int calculate_count(struct radix_tree_root *root, | |||
1181 | void __radix_tree_replace(struct radix_tree_root *root, | 1179 | void __radix_tree_replace(struct radix_tree_root *root, |
1182 | struct radix_tree_node *node, | 1180 | struct radix_tree_node *node, |
1183 | void __rcu **slot, void *item, | 1181 | void __rcu **slot, void *item, |
1184 | radix_tree_update_node_t update_node, void *private) | 1182 | radix_tree_update_node_t update_node) |
1185 | { | 1183 | { |
1186 | void *old = rcu_dereference_raw(*slot); | 1184 | void *old = rcu_dereference_raw(*slot); |
1187 | int exceptional = !!radix_tree_exceptional_entry(item) - | 1185 | int exceptional = !!radix_tree_exceptional_entry(item) - |
@@ -1201,9 +1199,9 @@ void __radix_tree_replace(struct radix_tree_root *root, | |||
1201 | return; | 1199 | return; |
1202 | 1200 | ||
1203 | if (update_node) | 1201 | if (update_node) |
1204 | update_node(node, private); | 1202 | update_node(node); |
1205 | 1203 | ||
1206 | delete_node(root, node, update_node, private); | 1204 | delete_node(root, node, update_node); |
1207 | } | 1205 | } |
1208 | 1206 | ||
1209 | /** | 1207 | /** |
@@ -1225,7 +1223,7 @@ void __radix_tree_replace(struct radix_tree_root *root, | |||
1225 | void radix_tree_replace_slot(struct radix_tree_root *root, | 1223 | void radix_tree_replace_slot(struct radix_tree_root *root, |
1226 | void __rcu **slot, void *item) | 1224 | void __rcu **slot, void *item) |
1227 | { | 1225 | { |
1228 | __radix_tree_replace(root, NULL, slot, item, NULL, NULL); | 1226 | __radix_tree_replace(root, NULL, slot, item, NULL); |
1229 | } | 1227 | } |
1230 | EXPORT_SYMBOL(radix_tree_replace_slot); | 1228 | EXPORT_SYMBOL(radix_tree_replace_slot); |
1231 | 1229 | ||
@@ -1242,7 +1240,7 @@ void radix_tree_iter_replace(struct radix_tree_root *root, | |||
1242 | const struct radix_tree_iter *iter, | 1240 | const struct radix_tree_iter *iter, |
1243 | void __rcu **slot, void *item) | 1241 | void __rcu **slot, void *item) |
1244 | { | 1242 | { |
1245 | __radix_tree_replace(root, iter->node, slot, item, NULL, NULL); | 1243 | __radix_tree_replace(root, iter->node, slot, item, NULL); |
1246 | } | 1244 | } |
1247 | 1245 | ||
1248 | #ifdef CONFIG_RADIX_TREE_MULTIORDER | 1246 | #ifdef CONFIG_RADIX_TREE_MULTIORDER |
@@ -1972,7 +1970,6 @@ EXPORT_SYMBOL(radix_tree_gang_lookup_tag_slot); | |||
1972 | * @root: radix tree root | 1970 | * @root: radix tree root |
1973 | * @node: node containing @index | 1971 | * @node: node containing @index |
1974 | * @update_node: callback for changing leaf nodes | 1972 | * @update_node: callback for changing leaf nodes |
1975 | * @private: private data to pass to @update_node | ||
1976 | * | 1973 | * |
1977 | * After clearing the slot at @index in @node from radix tree | 1974 | * After clearing the slot at @index in @node from radix tree |
1978 | * rooted at @root, call this function to attempt freeing the | 1975 | * rooted at @root, call this function to attempt freeing the |
@@ -1980,10 +1977,9 @@ EXPORT_SYMBOL(radix_tree_gang_lookup_tag_slot); | |||
1980 | */ | 1977 | */ |
1981 | void __radix_tree_delete_node(struct radix_tree_root *root, | 1978 | void __radix_tree_delete_node(struct radix_tree_root *root, |
1982 | struct radix_tree_node *node, | 1979 | struct radix_tree_node *node, |
1983 | radix_tree_update_node_t update_node, | 1980 | radix_tree_update_node_t update_node) |
1984 | void *private) | ||
1985 | { | 1981 | { |
1986 | delete_node(root, node, update_node, private); | 1982 | delete_node(root, node, update_node); |
1987 | } | 1983 | } |
1988 | 1984 | ||
1989 | static bool __radix_tree_delete(struct radix_tree_root *root, | 1985 | static bool __radix_tree_delete(struct radix_tree_root *root, |
@@ -2001,7 +1997,7 @@ static bool __radix_tree_delete(struct radix_tree_root *root, | |||
2001 | node_tag_clear(root, node, tag, offset); | 1997 | node_tag_clear(root, node, tag, offset); |
2002 | 1998 | ||
2003 | replace_slot(slot, NULL, node, -1, exceptional); | 1999 | replace_slot(slot, NULL, node, -1, exceptional); |
2004 | return node && delete_node(root, node, NULL, NULL); | 2000 | return node && delete_node(root, node, NULL); |
2005 | } | 2001 | } |
2006 | 2002 | ||
2007 | /** | 2003 | /** |