|
@@ -597,14 +597,21 @@ static int page_cache_tree_insert(struct address_space *mapping,
|
|
|
if (!radix_tree_exceptional_entry(p))
|
|
|
return -EEXIST;
|
|
|
|
|
|
- if (WARN_ON(dax_mapping(mapping)))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- if (shadowp)
|
|
|
- *shadowp = p;
|
|
|
mapping->nrexceptional--;
|
|
|
- if (node)
|
|
|
- workingset_node_shadows_dec(node);
|
|
|
+ if (!dax_mapping(mapping)) {
|
|
|
+ if (shadowp)
|
|
|
+ *shadowp = p;
|
|
|
+ if (node)
|
|
|
+ workingset_node_shadows_dec(node);
|
|
|
+ } else {
|
|
|
+ /* DAX can replace empty locked entry with a hole */
|
|
|
+ WARN_ON_ONCE(p !=
|
|
|
+ (void *)(RADIX_TREE_EXCEPTIONAL_ENTRY |
|
|
|
+ RADIX_DAX_ENTRY_LOCK));
|
|
|
+ /* DAX accounts exceptional entries as normal pages */
|
|
|
+ if (node)
|
|
|
+ workingset_node_pages_dec(node);
|
|
|
+ }
|
|
|
}
|
|
|
radix_tree_replace_slot(slot, page);
|
|
|
mapping->nrpages++;
|