summaryrefslogtreecommitdiffstats
path: root/fs/dax.c
diff options
context:
space:
mode:
authorMatthew Wilcox <willy@infradead.org>2018-03-28 15:40:41 -0400
committerMatthew Wilcox <willy@infradead.org>2018-10-21 10:46:43 -0400
commit07f2d89cc270936ac314e7cc4ac57077d7f08aef (patch)
treed87ef7401085bddd3bd76248738faf7f9da16843 /fs/dax.c
parent084a899008cec6db91dbf06453b2e3a36ceed02d (diff)
downloadlinux-07f2d89cc270936ac314e7cc4ac57077d7f08aef.tar.gz
linux-07f2d89cc270936ac314e7cc4ac57077d7f08aef.tar.bz2
linux-07f2d89cc270936ac314e7cc4ac57077d7f08aef.zip
dax: Convert __dax_invalidate_entry to XArray
Avoids walking the radix tree multiple times looking for tags. Signed-off-by: Matthew Wilcox <willy@infradead.org>
Diffstat (limited to 'fs/dax.c')
-rw-r--r--fs/dax.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/fs/dax.c b/fs/dax.c
index 28a51f2e8e50..83a510068b95 100644
--- 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.