Skip to content

Commit 5b44297

Browse files
ljskernelbrauner
authored andcommitted
mm/filemap: introduce generic_file_*_mmap_prepare() helpers
Since commit c84bf6d ("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>
1 parent 6528d29 commit 5b44297

2 files changed

Lines changed: 33 additions & 2 deletions

File tree

include/linux/fs.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3393,8 +3393,10 @@ extern void inode_add_lru(struct inode *inode);
33933393
extern int sb_set_blocksize(struct super_block *, int);
33943394
extern int sb_min_blocksize(struct super_block *, int);
33953395

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);
33983400
extern ssize_t generic_write_checks(struct kiocb *, struct iov_iter *);
33993401
int generic_write_checks_count(struct kiocb *iocb, loff_t *count);
34003402
extern int generic_write_check_limits(struct file *file, loff_t pos,

mm/filemap.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3814,6 +3814,18 @@ int generic_file_mmap(struct file *file, struct vm_area_struct *vma)
38143814
return 0;
38153815
}
38163816

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+
38173829
/*
38183830
* This is for filesystems which do not implement ->writepage.
38193831
*/
@@ -3823,6 +3835,13 @@ int generic_file_readonly_mmap(struct file *file, struct vm_area_struct *vma)
38233835
return -EINVAL;
38243836
return generic_file_mmap(file, vma);
38253837
}
3838+
3839+
int generic_file_readonly_mmap_prepare(struct vm_area_desc *desc)
3840+
{
3841+
if (is_shared_maywrite(desc->vm_flags))
3842+
return -EINVAL;
3843+
return generic_file_mmap_prepare(desc);
3844+
}
38263845
#else
38273846
vm_fault_t filemap_page_mkwrite(struct vm_fault *vmf)
38283847
{
@@ -3832,15 +3851,25 @@ int generic_file_mmap(struct file *file, struct vm_area_struct *vma)
38323851
{
38333852
return -ENOSYS;
38343853
}
3854+
int generic_file_mmap_prepare(struct vm_area_desc *desc)
3855+
{
3856+
return -ENOSYS;
3857+
}
38353858
int generic_file_readonly_mmap(struct file *file, struct vm_area_struct *vma)
38363859
{
38373860
return -ENOSYS;
38383861
}
3862+
int generic_file_readonly_mmap_prepare(struct vm_area_desc *desc)
3863+
{
3864+
return -ENOSYS;
3865+
}
38393866
#endif /* CONFIG_MMU */
38403867

38413868
EXPORT_SYMBOL(filemap_page_mkwrite);
38423869
EXPORT_SYMBOL(generic_file_mmap);
3870+
EXPORT_SYMBOL(generic_file_mmap_prepare);
38433871
EXPORT_SYMBOL(generic_file_readonly_mmap);
3872+
EXPORT_SYMBOL(generic_file_readonly_mmap_prepare);
38443873

38453874
static struct folio *do_read_cache_folio(struct address_space *mapping,
38463875
pgoff_t index, filler_t filler, struct file *file, gfp_t gfp)

0 commit comments

Comments
 (0)