blob: 9f531e9c62b34fc1c6c07a0a5b6a8471a2b08d8e [file] [log] [blame]
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)
_