if (IS_ERR(handle))
                result = VM_FAULT_SIGBUS;
        else
-               result = dax_fault(vma, vmf, ext4_dax_get_block);
+               result = dax_iomap_fault(vma, vmf, &ext4_iomap_ops);
 
        if (write) {
                if (!IS_ERR(handle))
 
        if (IS_ERR(handle))
                result = VM_FAULT_SIGBUS;
-       else
-               result = dax_pmd_fault(vma, addr, pmd, flags,
-                                        ext4_dax_get_block);
+       else {
+               result = dax_iomap_pmd_fault(vma, addr, pmd, flags,
+                                            &ext4_iomap_ops);
+       }
 
        if (write) {
                if (!IS_ERR(handle))
 
                }
 
                /*
-                * If we added blocks beyond i_size we need to make sure they
+                * If we added blocks beyond i_size, we need to make sure they
                 * will get truncated if we crash before updating i_size in
-                * ext4_iomap_end().
+                * ext4_iomap_end(). For faults we don't need to do that (and
+                * even cannot because for orphan list operations inode_lock is
+                * required) - if we happen to instantiate block beyond i_size,
+                * it is because we race with truncate which has already added
+                * the inode to the orphan list.
                 */
-               if (first_block + map.m_len >
-                   (inode->i_size + (1 << blkbits) - 1) >> blkbits) {
+               if (!(flags & IOMAP_FAULT) && first_block + map.m_len >
+                   (i_size_read(inode) + (1 << blkbits) - 1) >> blkbits) {
                        int err;
 
                        err = ext4_orphan_add(handle, inode);
        int blkbits = inode->i_blkbits;
        bool truncate = false;
 
-       if (!(flags & IOMAP_WRITE))
+       if (!(flags & IOMAP_WRITE) || (flags & IOMAP_FAULT))
                return 0;
 
        handle = ext4_journal_start(inode, EXT4_HT_INODE, 2);