|
@@ -1326,86 +1326,76 @@ int __lock_page_or_retry(struct page *page, struct mm_struct *mm,
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * page_cache_next_hole - find the next hole (not-present entry)
|
|
|
|
- * @mapping: mapping
|
|
|
|
- * @index: index
|
|
|
|
- * @max_scan: maximum range to search
|
|
|
|
- *
|
|
|
|
- * Search the set [index, min(index+max_scan-1, MAX_INDEX)] for the
|
|
|
|
- * lowest indexed hole.
|
|
|
|
- *
|
|
|
|
- * Returns: the index of the hole if found, otherwise returns an index
|
|
|
|
- * outside of the set specified (in which case 'return - index >=
|
|
|
|
- * max_scan' will be true). In rare cases of index wrap-around, 0 will
|
|
|
|
- * be returned.
|
|
|
|
- *
|
|
|
|
- * page_cache_next_hole may be called under rcu_read_lock. However,
|
|
|
|
- * like radix_tree_gang_lookup, this will not atomically search a
|
|
|
|
- * snapshot of the tree at a single point in time. For example, if a
|
|
|
|
- * hole is created at index 5, then subsequently a hole is created at
|
|
|
|
- * index 10, page_cache_next_hole covering both indexes may return 10
|
|
|
|
- * if called under rcu_read_lock.
|
|
|
|
|
|
+ * page_cache_next_miss() - Find the next gap in the page cache.
|
|
|
|
+ * @mapping: Mapping.
|
|
|
|
+ * @index: Index.
|
|
|
|
+ * @max_scan: Maximum range to search.
|
|
|
|
+ *
|
|
|
|
+ * Search the range [index, min(index + max_scan - 1, ULONG_MAX)] for the
|
|
|
|
+ * gap with the lowest index.
|
|
|
|
+ *
|
|
|
|
+ * This function may be called under the rcu_read_lock. However, this will
|
|
|
|
+ * not atomically search a snapshot of the cache at a single point in time.
|
|
|
|
+ * For example, if a gap is created at index 5, then subsequently a gap is
|
|
|
|
+ * created at index 10, page_cache_next_miss covering both indices may
|
|
|
|
+ * return 10 if called under the rcu_read_lock.
|
|
|
|
+ *
|
|
|
|
+ * Return: The index of the gap if found, otherwise an index outside the
|
|
|
|
+ * range specified (in which case 'return - index >= max_scan' will be true).
|
|
|
|
+ * In the rare case of index wrap-around, 0 will be returned.
|
|
*/
|
|
*/
|
|
-pgoff_t page_cache_next_hole(struct address_space *mapping,
|
|
|
|
|
|
+pgoff_t page_cache_next_miss(struct address_space *mapping,
|
|
pgoff_t index, unsigned long max_scan)
|
|
pgoff_t index, unsigned long max_scan)
|
|
{
|
|
{
|
|
- unsigned long i;
|
|
|
|
|
|
+ XA_STATE(xas, &mapping->i_pages, index);
|
|
|
|
|
|
- for (i = 0; i < max_scan; i++) {
|
|
|
|
- struct page *page;
|
|
|
|
-
|
|
|
|
- page = radix_tree_lookup(&mapping->i_pages, index);
|
|
|
|
- if (!page || xa_is_value(page))
|
|
|
|
|
|
+ while (max_scan--) {
|
|
|
|
+ void *entry = xas_next(&xas);
|
|
|
|
+ if (!entry || xa_is_value(entry))
|
|
break;
|
|
break;
|
|
- index++;
|
|
|
|
- if (index == 0)
|
|
|
|
|
|
+ if (xas.xa_index == 0)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- return index;
|
|
|
|
|
|
+ return xas.xa_index;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL(page_cache_next_hole);
|
|
|
|
|
|
+EXPORT_SYMBOL(page_cache_next_miss);
|
|
|
|
|
|
/**
|
|
/**
|
|
- * page_cache_prev_hole - find the prev hole (not-present entry)
|
|
|
|
- * @mapping: mapping
|
|
|
|
- * @index: index
|
|
|
|
- * @max_scan: maximum range to search
|
|
|
|
- *
|
|
|
|
- * Search backwards in the range [max(index-max_scan+1, 0), index] for
|
|
|
|
- * the first hole.
|
|
|
|
- *
|
|
|
|
- * Returns: the index of the hole if found, otherwise returns an index
|
|
|
|
- * outside of the set specified (in which case 'index - return >=
|
|
|
|
- * max_scan' will be true). In rare cases of wrap-around, ULONG_MAX
|
|
|
|
- * will be returned.
|
|
|
|
- *
|
|
|
|
- * page_cache_prev_hole may be called under rcu_read_lock. However,
|
|
|
|
- * like radix_tree_gang_lookup, this will not atomically search a
|
|
|
|
- * snapshot of the tree at a single point in time. For example, if a
|
|
|
|
- * hole is created at index 10, then subsequently a hole is created at
|
|
|
|
- * index 5, page_cache_prev_hole covering both indexes may return 5 if
|
|
|
|
- * called under rcu_read_lock.
|
|
|
|
|
|
+ * page_cache_prev_miss() - Find the next gap in the page cache.
|
|
|
|
+ * @mapping: Mapping.
|
|
|
|
+ * @index: Index.
|
|
|
|
+ * @max_scan: Maximum range to search.
|
|
|
|
+ *
|
|
|
|
+ * Search the range [max(index - max_scan + 1, 0), index] for the
|
|
|
|
+ * gap with the highest index.
|
|
|
|
+ *
|
|
|
|
+ * This function may be called under the rcu_read_lock. However, this will
|
|
|
|
+ * not atomically search a snapshot of the cache at a single point in time.
|
|
|
|
+ * For example, if a gap is created at index 10, then subsequently a gap is
|
|
|
|
+ * created at index 5, page_cache_prev_miss() covering both indices may
|
|
|
|
+ * return 5 if called under the rcu_read_lock.
|
|
|
|
+ *
|
|
|
|
+ * Return: The index of the gap if found, otherwise an index outside the
|
|
|
|
+ * range specified (in which case 'index - return >= max_scan' will be true).
|
|
|
|
+ * In the rare case of wrap-around, ULONG_MAX will be returned.
|
|
*/
|
|
*/
|
|
-pgoff_t page_cache_prev_hole(struct address_space *mapping,
|
|
|
|
|
|
+pgoff_t page_cache_prev_miss(struct address_space *mapping,
|
|
pgoff_t index, unsigned long max_scan)
|
|
pgoff_t index, unsigned long max_scan)
|
|
{
|
|
{
|
|
- unsigned long i;
|
|
|
|
-
|
|
|
|
- for (i = 0; i < max_scan; i++) {
|
|
|
|
- struct page *page;
|
|
|
|
|
|
+ XA_STATE(xas, &mapping->i_pages, index);
|
|
|
|
|
|
- page = radix_tree_lookup(&mapping->i_pages, index);
|
|
|
|
- if (!page || xa_is_value(page))
|
|
|
|
|
|
+ while (max_scan--) {
|
|
|
|
+ void *entry = xas_prev(&xas);
|
|
|
|
+ if (!entry || xa_is_value(entry))
|
|
break;
|
|
break;
|
|
- index--;
|
|
|
|
- if (index == ULONG_MAX)
|
|
|
|
|
|
+ if (xas.xa_index == ULONG_MAX)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- return index;
|
|
|
|
|
|
+ return xas.xa_index;
|
|
}
|
|
}
|
|
-EXPORT_SYMBOL(page_cache_prev_hole);
|
|
|
|
|
|
+EXPORT_SYMBOL(page_cache_prev_miss);
|
|
|
|
|
|
/**
|
|
/**
|
|
* find_get_entry - find and get a page cache entry
|
|
* find_get_entry - find and get a page cache entry
|