OSDN Git Service

Merge tag 'mtd/fixes-for-5.2-final' of git://git.kernel.org/pub/scm/linux/kernel...
[tomoyo/tomoyo-test1.git] / lib / idr.c
index c34e256..66a3748 100644 (file)
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -228,11 +228,21 @@ void *idr_get_next(struct idr *idr, int *nextid)
 {
        struct radix_tree_iter iter;
        void __rcu **slot;
+       void *entry = NULL;
        unsigned long base = idr->idr_base;
        unsigned long id = *nextid;
 
        id = (id < base) ? 0 : id - base;
-       slot = radix_tree_iter_find(&idr->idr_rt, &iter, id);
+       radix_tree_for_each_slot(slot, &idr->idr_rt, &iter, id) {
+               entry = rcu_dereference_raw(*slot);
+               if (!entry)
+                       continue;
+               if (!xa_is_internal(entry))
+                       break;
+               if (slot != &idr->idr_rt.xa_head && !xa_is_retry(entry))
+                       break;
+               slot = radix_tree_iter_retry(&iter);
+       }
        if (!slot)
                return NULL;
        id = iter.index + base;
@@ -241,7 +251,7 @@ void *idr_get_next(struct idr *idr, int *nextid)
                return NULL;
 
        *nextid = id;
-       return rcu_dereference_raw(*slot);
+       return entry;
 }
 EXPORT_SYMBOL(idr_get_next);