| From: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> |
| Subject: fs/xfs: transition from deprecated .mmap hook to .mmap_prepare |
| Date: Mon, 16 Jun 2025 20:33:25 +0100 |
| |
| Since commit c84bf6dd2b83 ("mm: introduce new .mmap_prepare() file |
| callback"), the f_op->mmap() hook has been deprecated in favour of |
| f_op->mmap_prepare(). |
| |
| This callback is invoked in the mmap() logic far earlier, so error |
| handling can be performed more safely without complicated and bug-prone |
| state unwinding required should an error arise. |
| |
| This hook also avoids passing a pointer to a not-yet-correctly-established |
| VMA avoiding any issues with referencing this data structure. |
| |
| It rather provides a pointer to the new struct vm_area_desc descriptor |
| type which contains all required state and allows easy setting of required |
| parameters without any consideration needing to be paid to locking or |
| reference counts. |
| |
| Note that nested filesystems like overlayfs are compatible with an |
| .mmap_prepare() callback since commit bb666b7c2707 ("mm: add |
| mmap_prepare() compatibility layer for nested file systems"). |
| |
| Link: https://lkml.kernel.org/r/cba8b29ba5f225df8f63f50182d5f6e0fcf94456.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/xfs/xfs_file.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| --- a/fs/xfs/xfs_file.c~fs-xfs-transition-from-deprecated-mmap-hook-to-mmap_prepare |
| +++ a/fs/xfs/xfs_file.c |
| @@ -1913,10 +1913,10 @@ static const struct vm_operations_struct |
| }; |
| |
| STATIC int |
| -xfs_file_mmap( |
| - struct file *file, |
| - struct vm_area_struct *vma) |
| +xfs_file_mmap_prepare( |
| + struct vm_area_desc *desc) |
| { |
| + struct file *file = desc->file; |
| struct inode *inode = file_inode(file); |
| struct xfs_buftarg *target = xfs_inode_buftarg(XFS_I(inode)); |
| |
| @@ -1924,14 +1924,14 @@ 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->vm_flags, vma->vm_file, |
| + if (!daxdev_mapping_supported(desc->vm_flags, file, |
| target->bt_daxdev)) |
| return -EOPNOTSUPP; |
| |
| file_accessed(file); |
| - vma->vm_ops = &xfs_file_vm_ops; |
| + desc->vm_ops = &xfs_file_vm_ops; |
| if (IS_DAX(inode)) |
| - vm_flags_set(vma, VM_HUGEPAGE); |
| + desc->vm_flags |= VM_HUGEPAGE; |
| return 0; |
| } |
| |
| @@ -1946,7 +1946,7 @@ const struct file_operations xfs_file_op |
| #ifdef CONFIG_COMPAT |
| .compat_ioctl = xfs_file_compat_ioctl, |
| #endif |
| - .mmap = xfs_file_mmap, |
| + .mmap_prepare = xfs_file_mmap_prepare, |
| .open = xfs_file_open, |
| .release = xfs_file_release, |
| .fsync = xfs_file_fsync, |
| _ |