}
 
 #ifdef CONFIG_FS_DAX_PMD
-static int dax_pmd_insert_mapping(struct vm_fault *vmf, struct iomap *iomap,
-               loff_t pos, void *entry)
-{
-       struct address_space *mapping = vmf->vma->vm_file->f_mapping;
-       const sector_t sector = dax_iomap_sector(iomap, pos);
-       struct inode *inode = mapping->host;
-       void *ret = NULL;
-       pfn_t pfn = {};
-       int rc;
-
-       rc = dax_iomap_pfn(iomap, pos, PMD_SIZE, &pfn);
-       if (rc < 0)
-               goto fallback;
-
-       ret = dax_insert_mapping_entry(mapping, vmf, entry, sector,
-                       RADIX_DAX_PMD);
-       if (IS_ERR(ret))
-               goto fallback;
-
-       trace_dax_pmd_insert_mapping(inode, vmf, PMD_SIZE, pfn, ret);
-       return vmf_insert_pfn_pmd(vmf->vma, vmf->address, vmf->pmd,
-                       pfn, vmf->flags & FAULT_FLAG_WRITE);
-
-fallback:
-       trace_dax_pmd_insert_mapping_fallback(inode, vmf, PMD_SIZE, pfn, ret);
-       return VM_FAULT_FALLBACK;
-}
+/*
+ * The 'colour' (ie low bits) within a PMD of a page offset.  This comes up
+ * more often than one might expect in the below functions.
+ */
+#define PG_PMD_COLOUR  ((PMD_SIZE >> PAGE_SHIFT) - 1)
 
 static int dax_pmd_load_hole(struct vm_fault *vmf, struct iomap *iomap,
                void *entry)
        void *entry;
        loff_t pos;
        int error;
+       pfn_t pfn;
 
        /*
         * Check whether offset isn't beyond end of file now. Caller is
 
        switch (iomap.type) {
        case IOMAP_MAPPED:
-               result = dax_pmd_insert_mapping(vmf, &iomap, pos, entry);
+               error = dax_iomap_pfn(&iomap, pos, PMD_SIZE, &pfn);
+               if (error < 0)
+                       goto finish_iomap;
+
+               entry = dax_insert_mapping_entry(mapping, vmf, entry,
+                                               dax_iomap_sector(&iomap, pos),
+                                               RADIX_DAX_PMD);
+               if (IS_ERR(entry))
+                       goto finish_iomap;
+
+               trace_dax_pmd_insert_mapping(inode, vmf, PMD_SIZE, pfn, entry);
+               result = vmf_insert_pfn_pmd(vma, vmf->address, vmf->pmd, pfn,
+                                           write);
                break;
        case IOMAP_UNWRITTEN:
        case IOMAP_HOLE:
 
        TP_ARGS(inode, vmf, length, pfn, radix_entry))
 
 DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping);
-DEFINE_PMD_INSERT_MAPPING_EVENT(dax_pmd_insert_mapping_fallback);
 
 DECLARE_EVENT_CLASS(dax_pte_fault_class,
        TP_PROTO(struct inode *inode, struct vm_fault *vmf, int result),