xas->xa_offset = (index >> shift) & XA_CHUNK_MASK;
}
+static inline void xas_adjust_order(struct xa_state *xas, unsigned int order)
+{
+ xas->xa_shift = order - (order % XA_CHUNK_SHIFT);
+ xas->xa_sibs = (1 << (order % XA_CHUNK_SHIFT)) - 1;
+}
+
/**
* xas_set_order() - Set up XArray operation state for a multislot entry.
* @xas: XArray operation state.
{
#ifdef CONFIG_XARRAY_MULTI
xas->xa_index = order < BITS_PER_LONG ? (index >> order) << order : 0;
- xas->xa_shift = order - (order % XA_CHUNK_SHIFT);
- xas->xa_sibs = (1 << (order % XA_CHUNK_SHIFT)) - 1;
+ xas_adjust_order(xas, order);
xas->xa_node = XAS_RESTART;
#else
BUG_ON(order > 0);
WARN_ON_ONCE(!folio_test_locked(folio));
+ if (!folio_test_hugetlb(folio))
+ xas_adjust_order(&xas, folio_order(folio));
+ xas_store(&xas, NULL);
folio->mapping = NULL;
/* Leave folio->index set: truncation lookup relies on it */
i++;
- xas_store(&xas, NULL);
total_pages += folio_nr_pages(folio);
}
mapping->nrpages -= total_pages;