radix-tree: 'slot' can be NULL in radix_tree_next_slot()
[cascardo/linux.git] / include / linux / radix-tree.h
index 4c45105..af3581b 100644 (file)
@@ -280,9 +280,9 @@ bool __radix_tree_delete_node(struct radix_tree_root *root,
                              struct radix_tree_node *node);
 void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *);
 void *radix_tree_delete(struct radix_tree_root *, unsigned long);
-struct radix_tree_node *radix_tree_replace_clear_tags(
-                               struct radix_tree_root *root,
-                               unsigned long index, void *entry);
+void radix_tree_clear_tags(struct radix_tree_root *root,
+                          struct radix_tree_node *node,
+                          void **slot);
 unsigned int radix_tree_gang_lookup(struct radix_tree_root *root,
                        void **results, unsigned long first_index,
                        unsigned int max_items);
@@ -461,6 +461,14 @@ static inline struct radix_tree_node *entry_to_node(void *ptr)
  *
  * This function updates @iter->index in the case of a successful lookup.
  * For tagged lookup it also eats @iter->tags.
+ *
+ * There are several cases where 'slot' can be passed in as NULL to this
+ * function.  These cases result from the use of radix_tree_iter_next() or
+ * radix_tree_iter_retry().  In these cases we don't end up dereferencing
+ * 'slot' because either:
+ * a) we are doing tagged iteration and iter->tags has been set to 0, or
+ * b) we are doing non-tagged iteration, and iter->index and iter->next_index
+ *    have been set up so that radix_tree_chunk_size() returns 1 or 0.
  */
 static __always_inline void **
 radix_tree_next_slot(void **slot, struct radix_tree_iter *iter, unsigned flags)