|
@@ -373,6 +373,22 @@ restart:
|
|
|
}
|
|
|
spin_lock_irq(&mapping->tree_lock);
|
|
|
|
|
|
+ if (!entry) {
|
|
|
+ /*
|
|
|
+ * We needed to drop the page_tree lock while calling
|
|
|
+ * radix_tree_preload() and we didn't have an entry to
|
|
|
+ * lock. See if another thread inserted an entry at
|
|
|
+ * our index during this time.
|
|
|
+ */
|
|
|
+ entry = __radix_tree_lookup(&mapping->page_tree, index,
|
|
|
+ NULL, &slot);
|
|
|
+ if (entry) {
|
|
|
+ radix_tree_preload_end();
|
|
|
+ spin_unlock_irq(&mapping->tree_lock);
|
|
|
+ goto restart;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (pmd_downgrade) {
|
|
|
radix_tree_delete(&mapping->page_tree, index);
|
|
|
mapping->nrexceptional--;
|
|
@@ -388,19 +404,12 @@ restart:
|
|
|
if (err) {
|
|
|
spin_unlock_irq(&mapping->tree_lock);
|
|
|
/*
|
|
|
- * Someone already created the entry? This is a
|
|
|
- * normal failure when inserting PMDs in a range
|
|
|
- * that already contains PTEs. In that case we want
|
|
|
- * to return -EEXIST immediately.
|
|
|
- */
|
|
|
- if (err == -EEXIST && !(size_flag & RADIX_DAX_PMD))
|
|
|
- goto restart;
|
|
|
- /*
|
|
|
- * Our insertion of a DAX PMD entry failed, most
|
|
|
- * likely because it collided with a PTE sized entry
|
|
|
- * at a different index in the PMD range. We haven't
|
|
|
- * inserted anything into the radix tree and have no
|
|
|
- * waiters to wake.
|
|
|
+ * Our insertion of a DAX entry failed, most likely
|
|
|
+ * because we were inserting a PMD entry and it
|
|
|
+ * collided with a PTE sized entry at a different
|
|
|
+ * index in the PMD range. We haven't inserted
|
|
|
+ * anything into the radix tree and have no waiters to
|
|
|
+ * wake.
|
|
|
*/
|
|
|
return ERR_PTR(err);
|
|
|
}
|