|
@@ -666,6 +666,8 @@ struct page *dax_layout_busy_page(struct address_space *mapping)
|
|
|
while (index < end && pagevec_lookup_entries(&pvec, mapping, index,
|
|
|
min(end - index, (pgoff_t)PAGEVEC_SIZE),
|
|
|
indices)) {
|
|
|
+ pgoff_t nr_pages = 1;
|
|
|
+
|
|
|
for (i = 0; i < pagevec_count(&pvec); i++) {
|
|
|
struct page *pvec_ent = pvec.pages[i];
|
|
|
void *entry;
|
|
@@ -680,8 +682,15 @@ struct page *dax_layout_busy_page(struct address_space *mapping)
|
|
|
|
|
|
xa_lock_irq(&mapping->i_pages);
|
|
|
entry = get_unlocked_mapping_entry(mapping, index, NULL);
|
|
|
- if (entry)
|
|
|
+ if (entry) {
|
|
|
page = dax_busy_page(entry);
|
|
|
+ /*
|
|
|
+ * Account for multi-order entries at
|
|
|
+ * the end of the pagevec.
|
|
|
+ */
|
|
|
+ if (i + 1 >= pagevec_count(&pvec))
|
|
|
+ nr_pages = 1UL << dax_radix_order(entry);
|
|
|
+ }
|
|
|
put_unlocked_mapping_entry(mapping, index, entry);
|
|
|
xa_unlock_irq(&mapping->i_pages);
|
|
|
if (page)
|
|
@@ -696,7 +705,7 @@ struct page *dax_layout_busy_page(struct address_space *mapping)
|
|
|
*/
|
|
|
pagevec_remove_exceptionals(&pvec);
|
|
|
pagevec_release(&pvec);
|
|
|
- index++;
|
|
|
+ index += nr_pages;
|
|
|
|
|
|
if (page)
|
|
|
break;
|