return NULL;
 }
 
+/**
+ * radix_tree_iter_next - resume iterating when the chunk may be invalid
+ * @iter:      iterator state
+ *
+ * If the iterator needs to release then reacquire a lock, the chunk may
+ * have been invalidated by an insertion or deletion.  Call this function
+ * to continue the iteration from the next index.
+ */
+static inline __must_check
+void **radix_tree_iter_next(struct radix_tree_iter *iter)
+{
+       iter->next_index = iter->index + 1;
+       iter->tags = 0;
+       return NULL;
+}
+
 /**
  * radix_tree_chunk_size - get current chunk size
  *
 
 
        rcu_read_lock();
 
-restart:
        radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
                if (iter.index >= end)
                        break;
 
                if (need_resched()) {
                        cond_resched_rcu();
-                       start = iter.index + 1;
-                       goto restart;
+                       slot = radix_tree_iter_next(&iter);
                }
        }
 
        start = 0;
        rcu_read_lock();
 
-restart:
        radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
                page = radix_tree_deref_slot(slot);
                if (!page || radix_tree_exception(page)) {
 
                if (need_resched()) {
                        cond_resched_rcu();
-                       start = iter.index + 1;
-                       goto restart;
+                       slot = radix_tree_iter_next(&iter);
                }
        }
        rcu_read_unlock();
 
                start = 0;
                rcu_read_lock();
-restart:
                radix_tree_for_each_tagged(slot, &mapping->page_tree, &iter,
                                           start, SHMEM_TAG_PINNED) {
 
 continue_resched:
                        if (need_resched()) {
                                cond_resched_rcu();
-                               start = iter.index + 1;
-                               goto restart;
+                               slot = radix_tree_iter_next(&iter);
                        }
                }
                rcu_read_unlock();