| From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> |
| Subject: fs/dax: make it possible to check dev dax support without a VMA |
| Date: Mon, 16 Jun 2025 20:33:23 +0100 |
| |
| 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). |
| |
| Link: https://lkml.kernel.org/r/b09de1e8544384074165d92d048e80058d971286.1750099179.git.lorenzo.stoakes@oracle.com |
| Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| fs/ext4/file.c | 2 +- |
| fs/xfs/xfs_file.c | 3 ++- |
| include/linux/dax.h | 16 +++++++++------- |
| 3 files changed, 12 insertions(+), 9 deletions(-) |
| |
| --- a/fs/ext4/file.c~fs-dax-make-it-possible-to-check-dev-dax-support-without-a-vma |
| +++ a/fs/ext4/file.c |
| @@ -821,7 +821,7 @@ static int ext4_file_mmap(struct file *f |
| * 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); |
| --- a/fs/xfs/xfs_file.c~fs-dax-make-it-possible-to-check-dev-dax-support-without-a-vma |
| +++ a/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); |
| --- a/include/linux/dax.h~fs-dax-make-it-possible-to-check-dev-dax-support-without-a-vma |
| +++ a/include/linux/dax.h |
| @@ -65,12 +65,13 @@ size_t dax_recovery_write(struct dax_dev |
| /* |
| * 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 d |
| 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) |
| _ |