From: Matthew Wilcox <[email protected]>

Avoids walking the radix tree multiple times looking for tags.

Signed-off-by: Matthew Wilcox <[email protected]>
---
 fs/dax.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/fs/dax.c b/fs/dax.c
index b8ed7bf32ba1..0566a150c458 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -676,27 +676,28 @@ EXPORT_SYMBOL_GPL(dax_layout_busy_page);
 static int __dax_invalidate_entry(struct address_space *mapping,
                                          pgoff_t index, bool trunc)
 {
+       XA_STATE(xas, &mapping->i_pages, index);
        int ret = 0;
        void *entry;
-       struct radix_tree_root *pages = &mapping->i_pages;
 
-       xa_lock_irq(pages);
-       entry = get_unlocked_mapping_entry(mapping, index, NULL);
+       xas_lock_irq(&xas);
+       entry = get_unlocked_entry(&xas);
        if (!entry || WARN_ON_ONCE(!xa_is_value(entry)))
                goto out;
        if (!trunc &&
-           (radix_tree_tag_get(pages, index, PAGECACHE_TAG_DIRTY) ||
-            radix_tree_tag_get(pages, index, PAGECACHE_TAG_TOWRITE)))
+           (xas_get_tag(&xas, PAGECACHE_TAG_DIRTY) ||
+            xas_get_tag(&xas, PAGECACHE_TAG_TOWRITE)))
                goto out;
        dax_disassociate_entry(entry, mapping, trunc);
-       radix_tree_delete(pages, index);
+       xas_store(&xas, NULL);
        mapping->nrexceptional--;
        ret = 1;
 out:
-       put_unlocked_mapping_entry(mapping, index, entry);
-       xa_unlock_irq(pages);
+       put_unlocked_entry(&xas, entry);
+       xas_unlock_irq(&xas);
        return ret;
 }
+
 /*
  * Delete DAX entry at @index from @mapping.  Wait for it
  * to be unlocked before deleting it.
-- 
2.17.1

Reply via email to