On Wed 10-09-25 21:21:57, Lorenzo Stoakes wrote: > The devdax driver does nothing special in its f_op->mmap hook, so > straightforwardly update it to use the mmap_prepare hook instead. > > Acked-by: David Hildenbrand <david@xxxxxxxxxx> > Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@xxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > drivers/dax/device.c | 32 +++++++++++++++++++++----------- > 1 file changed, 21 insertions(+), 11 deletions(-) > > diff --git a/drivers/dax/device.c b/drivers/dax/device.c > index 2bb40a6060af..c2181439f925 100644 > --- a/drivers/dax/device.c > +++ b/drivers/dax/device.c > @@ -13,8 +13,9 @@ > #include "dax-private.h" > #include "bus.h" > > -static int check_vma(struct dev_dax *dev_dax, struct vm_area_struct *vma, > - const char *func) > +static int __check_vma(struct dev_dax *dev_dax, vm_flags_t vm_flags, > + unsigned long start, unsigned long end, struct file *file, > + const char *func) > { > struct device *dev = &dev_dax->dev; > unsigned long mask; > @@ -23,7 +24,7 @@ static int check_vma(struct dev_dax *dev_dax, struct vm_area_struct *vma, > return -ENXIO; > > /* prevent private mappings from being established */ > - if ((vma->vm_flags & VM_MAYSHARE) != VM_MAYSHARE) { > + if ((vm_flags & VM_MAYSHARE) != VM_MAYSHARE) { > dev_info_ratelimited(dev, > "%s: %s: fail, attempted private mapping\n", > current->comm, func); > @@ -31,15 +32,15 @@ static int check_vma(struct dev_dax *dev_dax, struct vm_area_struct *vma, > } > > mask = dev_dax->align - 1; > - if (vma->vm_start & mask || vma->vm_end & mask) { > + if (start & mask || end & mask) { > dev_info_ratelimited(dev, > "%s: %s: fail, unaligned vma (%#lx - %#lx, %#lx)\n", > - current->comm, func, vma->vm_start, vma->vm_end, > + current->comm, func, start, end, > mask); > return -EINVAL; > } > > - if (!vma_is_dax(vma)) { > + if (!file_is_dax(file)) { > dev_info_ratelimited(dev, > "%s: %s: fail, vma is not DAX capable\n", > current->comm, func); > @@ -49,6 +50,13 @@ static int check_vma(struct dev_dax *dev_dax, struct vm_area_struct *vma, > return 0; > } > > +static int check_vma(struct dev_dax *dev_dax, struct vm_area_struct *vma, > + const char *func) > +{ > + return __check_vma(dev_dax, vma->vm_flags, vma->vm_start, vma->vm_end, > + vma->vm_file, func); > +} > + > /* see "strong" declaration in tools/testing/nvdimm/dax-dev.c */ > __weak phys_addr_t dax_pgoff_to_phys(struct dev_dax *dev_dax, pgoff_t pgoff, > unsigned long size) > @@ -285,8 +293,9 @@ static const struct vm_operations_struct dax_vm_ops = { > .pagesize = dev_dax_pagesize, > }; > > -static int dax_mmap(struct file *filp, struct vm_area_struct *vma) > +static int dax_mmap_prepare(struct vm_area_desc *desc) > { > + struct file *filp = desc->file; > struct dev_dax *dev_dax = filp->private_data; > int rc, id; > > @@ -297,13 +306,14 @@ static int dax_mmap(struct file *filp, struct vm_area_struct *vma) > * fault time. > */ > id = dax_read_lock(); > - rc = check_vma(dev_dax, vma, __func__); > + rc = __check_vma(dev_dax, desc->vm_flags, desc->start, desc->end, filp, > + __func__); > dax_read_unlock(id); > if (rc) > return rc; > > - vma->vm_ops = &dax_vm_ops; > - vm_flags_set(vma, VM_HUGEPAGE); > + desc->vm_ops = &dax_vm_ops; > + desc->vm_flags |= VM_HUGEPAGE; > return 0; > } > > @@ -377,7 +387,7 @@ static const struct file_operations dax_fops = { > .open = dax_open, > .release = dax_release, > .get_unmapped_area = dax_get_unmapped_area, > - .mmap = dax_mmap, > + .mmap_prepare = dax_mmap_prepare, > .fop_flags = FOP_MMAP_SYNC, > }; > > -- > 2.51.0 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR