]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
dax: Convert __dax_invalidate_entry to XArray
authorMatthew Wilcox <willy@infradead.org>
Wed, 28 Mar 2018 19:40:41 +0000 (15:40 -0400)
committerMatthew Wilcox <willy@infradead.org>
Sun, 21 Oct 2018 14:46:43 +0000 (10:46 -0400)
Avoids walking the radix tree multiple times looking for tags.

Signed-off-by: Matthew Wilcox <willy@infradead.org>
fs/dax.c

index 28a51f2e8e50e03021c2815ed5cb3944859fb76a..83a510068b95f2ed5d5e0c7ff7b83e1a2d97f70b 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -777,27 +777,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_mark(&xas, PAGECACHE_TAG_DIRTY) ||
+            xas_get_mark(&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.