On Wed, Apr 07, 2021 at 02:32:05PM +0800, Shiyang Ruan wrote: > +static int dax_fault_cow_page(struct vm_fault *vmf, struct iomap *iomap, > + loff_t pos, vm_fault_t *ret) > +{ > + int error = 0; > + unsigned long vaddr = vmf->address; > + sector_t sector = dax_iomap_sector(iomap, pos); > + > + switch (iomap->type) { > + case IOMAP_HOLE: > + case IOMAP_UNWRITTEN: > + clear_user_highpage(vmf->cow_page, vaddr); > + break; > + case IOMAP_MAPPED: > + error = copy_cow_page_dax(iomap->bdev, iomap->dax_dev, > + sector, vmf->cow_page, vaddr); > + break; > + default: > + WARN_ON_ONCE(1); > + error = -EIO; > + break; > + } > + > + if (error) > + return error; > + > + __SetPageUptodate(vmf->cow_page); > + *ret = finish_fault(vmf); > + if (!*ret) > + *ret = VM_FAULT_DONE_COW; > + return 0; > +} ... > + error = dax_fault_cow_page(vmf, &iomap, pos, &ret); > if (error) > + ret = dax_fault_return(error); > goto finish_iomap; This seems unnecessarily complex. Why not return the vm_fault_t instead of returning the errno and then converting it?