|
@@ -1537,10 +1537,15 @@ static vm_fault_t insert_pfn(struct vm_area_struct *vma, unsigned long addr,
|
|
|
* in may not match the PFN we have mapped if the
|
|
|
* mapped PFN is a writeable COW page. In the mkwrite
|
|
|
* case we are creating a writable PTE for a shared
|
|
|
- * mapping and we expect the PFNs to match.
|
|
|
+ * mapping and we expect the PFNs to match. If they
|
|
|
+ * don't match, we are likely racing with block
|
|
|
+ * allocation and mapping invalidation so just skip the
|
|
|
+ * update.
|
|
|
*/
|
|
|
- if (WARN_ON_ONCE(pte_pfn(*pte) != pfn_t_to_pfn(pfn)))
|
|
|
+ if (pte_pfn(*pte) != pfn_t_to_pfn(pfn)) {
|
|
|
+ WARN_ON_ONCE(!is_zero_pfn(pte_pfn(*pte)));
|
|
|
goto out_unlock;
|
|
|
+ }
|
|
|
entry = *pte;
|
|
|
goto out_mkwrite;
|
|
|
} else
|