Message ID | b09de1e8544384074165d92d048e80058d971286.1750099179.git.lorenzo.stoakes@oracle.com |
---|---|
State | New |
Headers | show |
Series | convert the majority of file systems to mmap_prepare | expand |
On Mon, Jun 16, 2025 at 08:33:23PM +0100, Lorenzo Stoakes wrote: > fs/ext4/file.c | 2 +- > fs/xfs/xfs_file.c | 3 ++- Both of these already have the inode from the file ... > +static inline bool daxdev_mapping_supported(vm_flags_t vm_flags, > + struct file *file, > + struct dax_device *dax_dev) > { > - if (!(vma->vm_flags & VM_SYNC)) > + if (!(vm_flags & VM_SYNC)) > return true; > - if (!IS_DAX(file_inode(vma->vm_file))) > + if (!IS_DAX(file_inode(file))) > return false; > return dax_synchronous(dax_dev); ... and the only thing this function uses from the file is the inode. So maybe pass in the inode rather than the file?
On Mon, Jun 16, 2025 at 09:26:54PM +0100, Matthew Wilcox wrote: > On Mon, Jun 16, 2025 at 08:33:23PM +0100, Lorenzo Stoakes wrote: > > fs/ext4/file.c | 2 +- > > fs/xfs/xfs_file.c | 3 ++- > > Both of these already have the inode from the file ... > > > +static inline bool daxdev_mapping_supported(vm_flags_t vm_flags, > > + struct file *file, > > + struct dax_device *dax_dev) > > { > > - if (!(vma->vm_flags & VM_SYNC)) > > + if (!(vm_flags & VM_SYNC)) > > return true; > > - if (!IS_DAX(file_inode(vma->vm_file))) > > + if (!IS_DAX(file_inode(file))) > > return false; > > return dax_synchronous(dax_dev); > > ... and the only thing this function uses from the file is the inode. > So maybe pass in the inode rather than the file? Agreed. I've converted this to take const struct inode *.
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 21df81347147..08a814fcd956 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -821,7 +821,7 @@ static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma) * We don't support synchronous mappings for non-DAX files and * for DAX files if underneath dax_device is not synchronous. */ - if (!daxdev_mapping_supported(vma, dax_dev)) + if (!daxdev_mapping_supported(vma->vm_flags, vma->vm_file, dax_dev)) return -EOPNOTSUPP; file_accessed(file); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 48254a72071b..ab97ce1f9087 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1924,7 +1924,8 @@ xfs_file_mmap( * We don't support synchronous mappings for non-DAX files and * for DAX files if underneath dax_device is not synchronous. */ - if (!daxdev_mapping_supported(vma, target->bt_daxdev)) + if (!daxdev_mapping_supported(vma->vm_flags, vma->vm_file, + target->bt_daxdev)) return -EOPNOTSUPP; file_accessed(file); diff --git a/include/linux/dax.h b/include/linux/dax.h index dcc9fcdf14e4..d0092cefb963 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -65,12 +65,13 @@ size_t dax_recovery_write(struct dax_device *dax_dev, pgoff_t pgoff, /* * Check if given mapping is supported by the file / underlying device. */ -static inline bool daxdev_mapping_supported(struct vm_area_struct *vma, - struct dax_device *dax_dev) +static inline bool daxdev_mapping_supported(vm_flags_t vm_flags, + struct file *file, + struct dax_device *dax_dev) { - if (!(vma->vm_flags & VM_SYNC)) + if (!(vm_flags & VM_SYNC)) return true; - if (!IS_DAX(file_inode(vma->vm_file))) + if (!IS_DAX(file_inode(file))) return false; return dax_synchronous(dax_dev); } @@ -110,10 +111,11 @@ static inline void set_dax_nomc(struct dax_device *dax_dev) static inline void set_dax_synchronous(struct dax_device *dax_dev) { } -static inline bool daxdev_mapping_supported(struct vm_area_struct *vma, - struct dax_device *dax_dev) +static inline bool daxdev_mapping_supported(vm_flags_t vm_flags, + struct file *file, + struct dax_device *dax_dev) { - return !(vma->vm_flags & VM_SYNC); + return !(vm_flags & VM_SYNC); } static inline size_t dax_recovery_write(struct dax_device *dax_dev, pgoff_t pgoff, void *addr, size_t bytes, struct iov_iter *i)
This is a prerequisite for adapting those filesystems to use the .mmap_prepare() hook for mmap()'ing which invoke this check as this hook does not have access to a VMA pointer. To effect this, change the signature of daxdev_mapping_supported() and update its callers (ext4 and xfs mmap()'ing hook code). Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> --- fs/ext4/file.c | 2 +- fs/xfs/xfs_file.c | 3 ++- include/linux/dax.h | 16 +++++++++------- 3 files changed, 12 insertions(+), 9 deletions(-)