Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mm/filemap: introduce generic_file_*_mmap_prepare() helpers

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().

The generic mmap handlers are very simple, so we can very easily convert
these in advance of converting file systems which use them.

This patch does so.

Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Link: https://lore.kernel.org/30622c1f0b98c66840bc8c02668bda276a810b70.1750099179.git.lorenzo.stoakes@oracle.com
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Lorenzo Stoakes and committed by
Christian Brauner
5b44297b 6528d29b

+33 -2
+4 -2
include/linux/fs.h
··· 3393 3393 extern int sb_set_blocksize(struct super_block *, int); 3394 3394 extern int sb_min_blocksize(struct super_block *, int); 3395 3395 3396 - extern int generic_file_mmap(struct file *, struct vm_area_struct *); 3397 - extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); 3396 + int generic_file_mmap(struct file *, struct vm_area_struct *); 3397 + int generic_file_mmap_prepare(struct vm_area_desc *desc); 3398 + int generic_file_readonly_mmap(struct file *, struct vm_area_struct *); 3399 + int generic_file_readonly_mmap_prepare(struct vm_area_desc *desc); 3398 3400 extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *); 3399 3401 int generic_write_checks_count(struct kiocb *iocb, loff_t *count); 3400 3402 extern int generic_write_check_limits(struct file *file, loff_t pos,
+29
mm/filemap.c
··· 3814 3814 return 0; 3815 3815 } 3816 3816 3817 + int generic_file_mmap_prepare(struct vm_area_desc *desc) 3818 + { 3819 + struct file *file = desc->file; 3820 + struct address_space *mapping = file->f_mapping; 3821 + 3822 + if (!mapping->a_ops->read_folio) 3823 + return -ENOEXEC; 3824 + file_accessed(file); 3825 + desc->vm_ops = &generic_file_vm_ops; 3826 + return 0; 3827 + } 3828 + 3817 3829 /* 3818 3830 * This is for filesystems which do not implement ->writepage. 3819 3831 */ ··· 3834 3822 if (vma_is_shared_maywrite(vma)) 3835 3823 return -EINVAL; 3836 3824 return generic_file_mmap(file, vma); 3825 + } 3826 + 3827 + int generic_file_readonly_mmap_prepare(struct vm_area_desc *desc) 3828 + { 3829 + if (is_shared_maywrite(desc->vm_flags)) 3830 + return -EINVAL; 3831 + return generic_file_mmap_prepare(desc); 3837 3832 } 3838 3833 #else 3839 3834 vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf) ··· 3851 3832 { 3852 3833 return -ENOSYS; 3853 3834 } 3835 + int generic_file_mmap_prepare(struct vm_area_desc *desc) 3836 + { 3837 + return -ENOSYS; 3838 + } 3854 3839 int generic_file_readonly_mmap(struct file *file, struct vm_area_struct *vma) 3840 + { 3841 + return -ENOSYS; 3842 + } 3843 + int generic_file_readonly_mmap_prepare(struct vm_area_desc *desc) 3855 3844 { 3856 3845 return -ENOSYS; 3857 3846 } ··· 3867 3840 3868 3841 EXPORT_SYMBOL(filemap_page_mkwrite); 3869 3842 EXPORT_SYMBOL(generic_file_mmap); 3843 + EXPORT_SYMBOL(generic_file_mmap_prepare); 3870 3844 EXPORT_SYMBOL(generic_file_readonly_mmap); 3845 + EXPORT_SYMBOL(generic_file_readonly_mmap_prepare); 3871 3846 3872 3847 static struct folio *do_read_cache_folio(struct address_space *mapping, 3873 3848 pgoff_t index, filler_t filler, struct file *file, gfp_t gfp)