> switch (iomap.type) { > case IOMAP_MAPPED: > +cow: > if (iomap.flags & IOMAP_F_NEW) { > count_vm_event(PGMAJFAULT); > count_memcg_event_mm(vma->vm_mm, PGMAJFAULT); > major = VM_FAULT_MAJOR; > } > error = dax_iomap_direct_access(&iomap, pos, PAGE_SIZE, > - NULL, &pfn); > + &kaddr, &pfn); Any chance you could look into factoring out this code into a helper to avoid the goto magic, which is a little too convoluted? > switch (iomap.type) { > case IOMAP_MAPPED: > +cow: > error = dax_iomap_direct_access(&iomap, pos, PMD_SIZE, > - NULL, &pfn); > + &kaddr, &pfn); > if (error < 0) > goto finish_iomap; > > entry = dax_insert_entry(&xas, mapping, vmf, entry, pfn, > DAX_PMD, write && !sync); > > + if (srcmap.type != IOMAP_HOLE) { Same here.