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

fs: convert most other generic_file_*mmap() users to .mmap_prepare()

Update nearly all generic_file_mmap() and generic_file_readonly_mmap()
callers to use generic_file_mmap_prepare() and
generic_file_readonly_mmap_prepare() respectively.

We update blkdev, 9p, afs, erofs, ext2, nfs, ntfs3, smb, ubifs and vboxsf
file systems this way.

Remaining users we cannot yet update are ecryptfs, fuse and cramfs. The
former two are nested file systems that must support any underlying file
ssytem, and cramfs inserts a mixed mapping which currently requires a VMA.

Once all file systems have been converted to mmap_prepare(), we can then
update nested file systems.

Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Link: https://lore.kernel.org/08db85970d89b17a995d2cffae96fb4cc462377f.1750099179.git.lorenzo.stoakes@oracle.com
Signed-off-by: Christian Brauner <brauner@kernel.org>

authored by

Lorenzo Stoakes and committed by
Christian Brauner
9d5403b1 951ea2f4

+75 -70
+6 -6
block/fops.c
··· 911 911 return error; 912 912 } 913 913 914 - static int blkdev_mmap(struct file *file, struct vm_area_struct *vma) 914 + static int blkdev_mmap_prepare(struct vm_area_desc *desc) 915 915 { 916 - struct inode *bd_inode = bdev_file_inode(file); 916 + struct file *file = desc->file; 917 917 918 - if (bdev_read_only(I_BDEV(bd_inode))) 919 - return generic_file_readonly_mmap(file, vma); 918 + if (bdev_read_only(I_BDEV(bdev_file_inode(file)))) 919 + return generic_file_readonly_mmap_prepare(desc); 920 920 921 - return generic_file_mmap(file, vma); 921 + return generic_file_mmap_prepare(desc); 922 922 } 923 923 924 924 const struct file_operations def_blk_fops = { ··· 928 928 .read_iter = blkdev_read_iter, 929 929 .write_iter = blkdev_write_iter, 930 930 .iopoll = iocb_bio_iopoll, 931 - .mmap = blkdev_mmap, 931 + .mmap_prepare = blkdev_mmap_prepare, 932 932 .fsync = blkdev_fsync, 933 933 .unlocked_ioctl = blkdev_ioctl, 934 934 #ifdef CONFIG_COMPAT
+6 -5
fs/9p/vfs_file.c
··· 454 454 } 455 455 456 456 static int 457 - v9fs_file_mmap(struct file *filp, struct vm_area_struct *vma) 457 + v9fs_file_mmap_prepare(struct vm_area_desc *desc) 458 458 { 459 459 int retval; 460 + struct file *filp = desc->file; 460 461 struct inode *inode = file_inode(filp); 461 462 struct v9fs_session_info *v9ses = v9fs_inode2v9ses(inode); 462 463 ··· 465 464 466 465 if (!(v9ses->cache & CACHE_WRITEBACK)) { 467 466 p9_debug(P9_DEBUG_CACHE, "(read-only mmap mode)"); 468 - return generic_file_readonly_mmap(filp, vma); 467 + return generic_file_readonly_mmap_prepare(desc); 469 468 } 470 469 471 - retval = generic_file_mmap(filp, vma); 470 + retval = generic_file_mmap_prepare(desc); 472 471 if (!retval) 473 - vma->vm_ops = &v9fs_mmap_file_vm_ops; 472 + desc->vm_ops = &v9fs_mmap_file_vm_ops; 474 473 475 474 return retval; 476 475 } ··· 532 531 .release = v9fs_dir_release, 533 532 .lock = v9fs_file_lock_dotl, 534 533 .flock = v9fs_file_flock_dotl, 535 - .mmap = v9fs_file_mmap, 534 + .mmap_prepare = v9fs_file_mmap_prepare, 536 535 .splice_read = v9fs_file_splice_read, 537 536 .splice_write = iter_file_splice_write, 538 537 .fsync = v9fs_file_fsync_dotl,
+6 -6
fs/afs/file.c
··· 19 19 #include <trace/events/netfs.h> 20 20 #include "internal.h" 21 21 22 - static int afs_file_mmap(struct file *file, struct vm_area_struct *vma); 22 + static int afs_file_mmap_prepare(struct vm_area_desc *desc); 23 23 24 24 static ssize_t afs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter); 25 25 static ssize_t afs_file_splice_read(struct file *in, loff_t *ppos, ··· 35 35 .llseek = generic_file_llseek, 36 36 .read_iter = afs_file_read_iter, 37 37 .write_iter = netfs_file_write_iter, 38 - .mmap = afs_file_mmap, 38 + .mmap_prepare = afs_file_mmap_prepare, 39 39 .splice_read = afs_file_splice_read, 40 40 .splice_write = iter_file_splice_write, 41 41 .fsync = afs_fsync, ··· 492 492 /* 493 493 * Handle setting up a memory mapping on an AFS file. 494 494 */ 495 - static int afs_file_mmap(struct file *file, struct vm_area_struct *vma) 495 + static int afs_file_mmap_prepare(struct vm_area_desc *desc) 496 496 { 497 - struct afs_vnode *vnode = AFS_FS_I(file_inode(file)); 497 + struct afs_vnode *vnode = AFS_FS_I(file_inode(desc->file)); 498 498 int ret; 499 499 500 500 afs_add_open_mmap(vnode); 501 501 502 - ret = generic_file_mmap(file, vma); 502 + ret = generic_file_mmap_prepare(desc); 503 503 if (ret == 0) 504 - vma->vm_ops = &afs_vm_ops; 504 + desc->vm_ops = &afs_vm_ops; 505 505 else 506 506 afs_drop_open_mmap(vnode); 507 507 return ret;
+8 -8
fs/erofs/data.c
··· 409 409 .huge_fault = erofs_dax_huge_fault, 410 410 }; 411 411 412 - static int erofs_file_mmap(struct file *file, struct vm_area_struct *vma) 412 + static int erofs_file_mmap_prepare(struct vm_area_desc *desc) 413 413 { 414 - if (!IS_DAX(file_inode(file))) 415 - return generic_file_readonly_mmap(file, vma); 414 + if (!IS_DAX(file_inode(desc->file))) 415 + return generic_file_readonly_mmap_prepare(desc); 416 416 417 - if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE)) 417 + if ((desc->vm_flags & VM_SHARED) && (desc->vm_flags & VM_MAYWRITE)) 418 418 return -EINVAL; 419 419 420 - vma->vm_ops = &erofs_dax_vm_ops; 421 - vm_flags_set(vma, VM_HUGEPAGE); 420 + desc->vm_ops = &erofs_dax_vm_ops; 421 + desc->vm_flags |= VM_HUGEPAGE; 422 422 return 0; 423 423 } 424 424 #else 425 - #define erofs_file_mmap generic_file_readonly_mmap 425 + #define erofs_file_mmap_prepare generic_file_readonly_mmap_prepare 426 426 #endif 427 427 428 428 static loff_t erofs_file_llseek(struct file *file, loff_t offset, int whence) ··· 452 452 const struct file_operations erofs_file_fops = { 453 453 .llseek = erofs_file_llseek, 454 454 .read_iter = erofs_file_read_iter, 455 - .mmap = erofs_file_mmap, 455 + .mmap_prepare = erofs_file_mmap_prepare, 456 456 .get_unmapped_area = thp_get_unmapped_area, 457 457 .splice_read = filemap_splice_read, 458 458 };
+7 -5
fs/ext2/file.c
··· 122 122 .pfn_mkwrite = ext2_dax_fault, 123 123 }; 124 124 125 - static int ext2_file_mmap(struct file *file, struct vm_area_struct *vma) 125 + static int ext2_file_mmap_prepare(struct vm_area_desc *desc) 126 126 { 127 + struct file *file = desc->file; 128 + 127 129 if (!IS_DAX(file_inode(file))) 128 - return generic_file_mmap(file, vma); 130 + return generic_file_mmap_prepare(desc); 129 131 130 132 file_accessed(file); 131 - vma->vm_ops = &ext2_dax_vm_ops; 133 + desc->vm_ops = &ext2_dax_vm_ops; 132 134 return 0; 133 135 } 134 136 #else 135 - #define ext2_file_mmap generic_file_mmap 137 + #define ext2_file_mmap_prepare generic_file_mmap_prepare 136 138 #endif 137 139 138 140 /* ··· 318 316 #ifdef CONFIG_COMPAT 319 317 .compat_ioctl = ext2_compat_ioctl, 320 318 #endif 321 - .mmap = ext2_file_mmap, 319 + .mmap_prepare = ext2_file_mmap_prepare, 322 320 .open = ext2_file_open, 323 321 .release = ext2_release_file, 324 322 .fsync = ext2_fsync,
+7 -6
fs/nfs/file.c
··· 207 207 EXPORT_SYMBOL_GPL(nfs_file_splice_read); 208 208 209 209 int 210 - nfs_file_mmap(struct file *file, struct vm_area_struct *vma) 210 + nfs_file_mmap_prepare(struct vm_area_desc *desc) 211 211 { 212 + struct file *file = desc->file; 212 213 struct inode *inode = file_inode(file); 213 214 int status; 214 215 215 216 dprintk("NFS: mmap(%pD2)\n", file); 216 217 217 - /* Note: generic_file_mmap() returns ENOSYS on nommu systems 218 + /* Note: generic_file_mmap_prepare() returns ENOSYS on nommu systems 218 219 * so we call that before revalidating the mapping 219 220 */ 220 - status = generic_file_mmap(file, vma); 221 + status = generic_file_mmap_prepare(desc); 221 222 if (!status) { 222 - vma->vm_ops = &nfs_file_vm_ops; 223 + desc->vm_ops = &nfs_file_vm_ops; 223 224 status = nfs_revalidate_mapping(inode, file->f_mapping); 224 225 } 225 226 return status; 226 227 } 227 - EXPORT_SYMBOL_GPL(nfs_file_mmap); 228 + EXPORT_SYMBOL_GPL(nfs_file_mmap_prepare); 228 229 229 230 /* 230 231 * Flush any dirty pages for this process, and check for write errors. ··· 900 899 .llseek = nfs_file_llseek, 901 900 .read_iter = nfs_file_read, 902 901 .write_iter = nfs_file_write, 903 - .mmap = nfs_file_mmap, 902 + .mmap_prepare = nfs_file_mmap_prepare, 904 903 .open = nfs_file_open, 905 904 .flush = nfs_file_flush, 906 905 .release = nfs_file_release,
+1 -1
fs/nfs/internal.h
··· 432 432 ssize_t nfs_file_read(struct kiocb *, struct iov_iter *); 433 433 ssize_t nfs_file_splice_read(struct file *in, loff_t *ppos, struct pipe_inode_info *pipe, 434 434 size_t len, unsigned int flags); 435 - int nfs_file_mmap(struct file *, struct vm_area_struct *); 435 + int nfs_file_mmap_prepare(struct vm_area_desc *); 436 436 ssize_t nfs_file_write(struct kiocb *, struct iov_iter *); 437 437 int nfs_file_release(struct inode *, struct file *); 438 438 int nfs_lock(struct file *, int, struct file_lock *);
+1 -1
fs/nfs/nfs4file.c
··· 456 456 const struct file_operations nfs4_file_operations = { 457 457 .read_iter = nfs_file_read, 458 458 .write_iter = nfs_file_write, 459 - .mmap = nfs_file_mmap, 459 + .mmap_prepare = nfs_file_mmap_prepare, 460 460 .open = nfs4_file_open, 461 461 .flush = nfs4_file_flush, 462 462 .release = nfs_file_release,
+8 -7
fs/ntfs3/file.c
··· 261 261 } 262 262 263 263 /* 264 - * ntfs_file_mmap - file_operations::mmap 264 + * ntfs_file_mmap_prepare - file_operations::mmap_prepare 265 265 */ 266 - static int ntfs_file_mmap(struct file *file, struct vm_area_struct *vma) 266 + static int ntfs_file_mmap_prepare(struct vm_area_desc *desc) 267 267 { 268 + struct file *file = desc->file; 268 269 struct inode *inode = file_inode(file); 269 270 struct ntfs_inode *ni = ntfs_i(inode); 270 - u64 from = ((u64)vma->vm_pgoff << PAGE_SHIFT); 271 - bool rw = vma->vm_flags & VM_WRITE; 271 + u64 from = ((u64)desc->pgoff << PAGE_SHIFT); 272 + bool rw = desc->vm_flags & VM_WRITE; 272 273 int err; 273 274 274 275 if (unlikely(ntfs3_forced_shutdown(inode->i_sb))) ··· 292 291 293 292 if (rw) { 294 293 u64 to = min_t(loff_t, i_size_read(inode), 295 - from + vma->vm_end - vma->vm_start); 294 + from + desc->end - desc->start); 296 295 297 296 if (is_sparsed(ni)) { 298 297 /* Allocate clusters for rw map. */ ··· 320 319 } 321 320 } 322 321 323 - err = generic_file_mmap(file, vma); 322 + err = generic_file_mmap_prepare(desc); 324 323 out: 325 324 return err; 326 325 } ··· 1332 1331 #endif 1333 1332 .splice_read = ntfs_file_splice_read, 1334 1333 .splice_write = ntfs_file_splice_write, 1335 - .mmap = ntfs_file_mmap, 1334 + .mmap_prepare = ntfs_file_mmap_prepare, 1336 1335 .open = ntfs_file_open, 1337 1336 .fsync = generic_file_fsync, 1338 1337 .fallocate = ntfs_fallocate,
+6 -6
fs/smb/client/cifsfs.c
··· 1525 1525 .flock = cifs_flock, 1526 1526 .fsync = cifs_fsync, 1527 1527 .flush = cifs_flush, 1528 - .mmap = cifs_file_mmap, 1528 + .mmap_prepare = cifs_file_mmap_prepare, 1529 1529 .splice_read = filemap_splice_read, 1530 1530 .splice_write = iter_file_splice_write, 1531 1531 .llseek = cifs_llseek, ··· 1545 1545 .flock = cifs_flock, 1546 1546 .fsync = cifs_strict_fsync, 1547 1547 .flush = cifs_flush, 1548 - .mmap = cifs_file_strict_mmap, 1548 + .mmap_prepare = cifs_file_strict_mmap_prepare, 1549 1549 .splice_read = filemap_splice_read, 1550 1550 .splice_write = iter_file_splice_write, 1551 1551 .llseek = cifs_llseek, ··· 1565 1565 .flock = cifs_flock, 1566 1566 .fsync = cifs_fsync, 1567 1567 .flush = cifs_flush, 1568 - .mmap = cifs_file_mmap, 1568 + .mmap_prepare = cifs_file_mmap_prepare, 1569 1569 .splice_read = copy_splice_read, 1570 1570 .splice_write = iter_file_splice_write, 1571 1571 .unlocked_ioctl = cifs_ioctl, ··· 1583 1583 .release = cifs_close, 1584 1584 .fsync = cifs_fsync, 1585 1585 .flush = cifs_flush, 1586 - .mmap = cifs_file_mmap, 1586 + .mmap_prepare = cifs_file_mmap_prepare, 1587 1587 .splice_read = filemap_splice_read, 1588 1588 .splice_write = iter_file_splice_write, 1589 1589 .llseek = cifs_llseek, ··· 1601 1601 .release = cifs_close, 1602 1602 .fsync = cifs_strict_fsync, 1603 1603 .flush = cifs_flush, 1604 - .mmap = cifs_file_strict_mmap, 1604 + .mmap_prepare = cifs_file_strict_mmap_prepare, 1605 1605 .splice_read = filemap_splice_read, 1606 1606 .splice_write = iter_file_splice_write, 1607 1607 .llseek = cifs_llseek, ··· 1619 1619 .release = cifs_close, 1620 1620 .fsync = cifs_fsync, 1621 1621 .flush = cifs_flush, 1622 - .mmap = cifs_file_mmap, 1622 + .mmap_prepare = cifs_file_mmap_prepare, 1623 1623 .splice_read = copy_splice_read, 1624 1624 .splice_write = iter_file_splice_write, 1625 1625 .unlocked_ioctl = cifs_ioctl,
+2 -2
fs/smb/client/cifsfs.h
··· 103 103 extern int cifs_fsync(struct file *, loff_t, loff_t, int); 104 104 extern int cifs_strict_fsync(struct file *, loff_t, loff_t, int); 105 105 extern int cifs_flush(struct file *, fl_owner_t id); 106 - extern int cifs_file_mmap(struct file *file, struct vm_area_struct *vma); 107 - extern int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma); 106 + int cifs_file_mmap_prepare(struct vm_area_desc *desc); 107 + int cifs_file_strict_mmap_prepare(struct vm_area_desc *desc); 108 108 extern const struct file_operations cifs_dir_ops; 109 109 extern int cifs_readdir(struct file *file, struct dir_context *ctx); 110 110
+8 -8
fs/smb/client/file.c
··· 2995 2995 .page_mkwrite = cifs_page_mkwrite, 2996 2996 }; 2997 2997 2998 - int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma) 2998 + int cifs_file_strict_mmap_prepare(struct vm_area_desc *desc) 2999 2999 { 3000 3000 int xid, rc = 0; 3001 - struct inode *inode = file_inode(file); 3001 + struct inode *inode = file_inode(desc->file); 3002 3002 3003 3003 xid = get_xid(); 3004 3004 3005 3005 if (!CIFS_CACHE_READ(CIFS_I(inode))) 3006 3006 rc = cifs_zap_mapping(inode); 3007 3007 if (!rc) 3008 - rc = generic_file_mmap(file, vma); 3008 + rc = generic_file_mmap_prepare(desc); 3009 3009 if (!rc) 3010 - vma->vm_ops = &cifs_file_vm_ops; 3010 + desc->vm_ops = &cifs_file_vm_ops; 3011 3011 3012 3012 free_xid(xid); 3013 3013 return rc; 3014 3014 } 3015 3015 3016 - int cifs_file_mmap(struct file *file, struct vm_area_struct *vma) 3016 + int cifs_file_mmap_prepare(struct vm_area_desc *desc) 3017 3017 { 3018 3018 int rc, xid; 3019 3019 3020 3020 xid = get_xid(); 3021 3021 3022 - rc = cifs_revalidate_file(file); 3022 + rc = cifs_revalidate_file(desc->file); 3023 3023 if (rc) 3024 3024 cifs_dbg(FYI, "Validation prior to mmap failed, error=%d\n", 3025 3025 rc); 3026 3026 if (!rc) 3027 - rc = generic_file_mmap(file, vma); 3027 + rc = generic_file_mmap_prepare(desc); 3028 3028 if (!rc) 3029 - vma->vm_ops = &cifs_file_vm_ops; 3029 + desc->vm_ops = &cifs_file_vm_ops; 3030 3030 3031 3031 free_xid(xid); 3032 3032 return rc;
+5 -5
fs/ubifs/file.c
··· 1579 1579 .page_mkwrite = ubifs_vm_page_mkwrite, 1580 1580 }; 1581 1581 1582 - static int ubifs_file_mmap(struct file *file, struct vm_area_struct *vma) 1582 + static int ubifs_file_mmap_prepare(struct vm_area_desc *desc) 1583 1583 { 1584 1584 int err; 1585 1585 1586 - err = generic_file_mmap(file, vma); 1586 + err = generic_file_mmap_prepare(desc); 1587 1587 if (err) 1588 1588 return err; 1589 - vma->vm_ops = &ubifs_file_vm_ops; 1589 + desc->vm_ops = &ubifs_file_vm_ops; 1590 1590 1591 1591 if (IS_ENABLED(CONFIG_UBIFS_ATIME_SUPPORT)) 1592 - file_accessed(file); 1592 + file_accessed(desc->file); 1593 1593 1594 1594 return 0; 1595 1595 } ··· 1652 1652 .llseek = generic_file_llseek, 1653 1653 .read_iter = generic_file_read_iter, 1654 1654 .write_iter = ubifs_write_iter, 1655 - .mmap = ubifs_file_mmap, 1655 + .mmap_prepare = ubifs_file_mmap_prepare, 1656 1656 .fsync = ubifs_fsync, 1657 1657 .unlocked_ioctl = ubifs_ioctl, 1658 1658 .splice_read = filemap_splice_read,
+4 -4
fs/vboxsf/file.c
··· 165 165 .map_pages = filemap_map_pages, 166 166 }; 167 167 168 - static int vboxsf_file_mmap(struct file *file, struct vm_area_struct *vma) 168 + static int vboxsf_file_mmap_prepare(struct vm_area_desc *desc) 169 169 { 170 170 int err; 171 171 172 - err = generic_file_mmap(file, vma); 172 + err = generic_file_mmap_prepare(desc); 173 173 if (!err) 174 - vma->vm_ops = &vboxsf_file_vm_ops; 174 + desc->vm_ops = &vboxsf_file_vm_ops; 175 175 176 176 return err; 177 177 } ··· 213 213 .llseek = generic_file_llseek, 214 214 .read_iter = generic_file_read_iter, 215 215 .write_iter = generic_file_write_iter, 216 - .mmap = vboxsf_file_mmap, 216 + .mmap_prepare = vboxsf_file_mmap_prepare, 217 217 .open = vboxsf_file_open, 218 218 .release = vboxsf_file_release, 219 219 .fsync = noop_fsync,