mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-05 19:31:57 -04:00
UPSTREAM: ANDROID: fuse-bpf: Partial fix for mmap'd files
This will simply pass all mapping operations to the backing file if it exists. This is sufficient for our needs in Android13, but must be extended in the future. Signed-off-by: Paul Lawrence <paullawrence@google.com> Bug: 202785178 Test: fuse_test passes Change-Id: I3c51ef62415633ff0db039f25bfed1adf14e1e80
This commit is contained in:
parent
b3fbcd3ca5
commit
595da2719e
3 changed files with 46 additions and 0 deletions
|
|
@ -750,6 +750,44 @@ void *fuse_file_write_iter_finalize(struct fuse_args *fa,
|
|||
return ERR_PTR(fwo->size);
|
||||
}
|
||||
|
||||
ssize_t fuse_backing_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
int ret;
|
||||
struct fuse_file *ff = file->private_data;
|
||||
struct inode *fuse_inode = file_inode(file);
|
||||
struct file *backing_file = ff->backing_file;
|
||||
struct inode *backing_inode = file_inode(backing_file);
|
||||
|
||||
if (!backing_file->f_op->mmap)
|
||||
return -ENODEV;
|
||||
|
||||
if (WARN_ON(file != vma->vm_file))
|
||||
return -EIO;
|
||||
|
||||
vma->vm_file = get_file(backing_file);
|
||||
|
||||
ret = call_mmap(vma->vm_file, vma);
|
||||
|
||||
if (ret)
|
||||
fput(backing_file);
|
||||
else
|
||||
fput(file);
|
||||
|
||||
if (file->f_flags & O_NOATIME)
|
||||
return ret;
|
||||
|
||||
if ((!timespec64_equal(&fuse_inode->i_mtime,
|
||||
&backing_inode->i_mtime) ||
|
||||
!timespec64_equal(&fuse_inode->i_ctime,
|
||||
&backing_inode->i_ctime))) {
|
||||
fuse_inode->i_mtime = backing_inode->i_mtime;
|
||||
fuse_inode->i_ctime = backing_inode->i_ctime;
|
||||
}
|
||||
touch_atime(&file->f_path);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int fuse_file_fallocate_initialize(struct fuse_args *fa,
|
||||
struct fuse_fallocate_in *ffi,
|
||||
struct file *file, int mode, loff_t offset, loff_t length)
|
||||
|
|
|
|||
|
|
@ -2525,6 +2525,12 @@ static int fuse_file_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
if (FUSE_IS_DAX(file_inode(file)))
|
||||
return fuse_dax_mmap(file, vma);
|
||||
|
||||
#ifdef CONFIG_FUSE_BPF
|
||||
/* TODO - this is simply passthrough, not a proper BPF filter */
|
||||
if (ff->backing_file)
|
||||
return fuse_backing_mmap(file, vma);
|
||||
#endif
|
||||
|
||||
if (ff->passthrough.filp)
|
||||
return fuse_passthrough_mmap(file, vma);
|
||||
|
||||
|
|
|
|||
|
|
@ -1495,6 +1495,8 @@ int fuse_file_write_iter_backing(struct fuse_args *fa,
|
|||
void *fuse_file_write_iter_finalize(struct fuse_args *fa,
|
||||
struct kiocb *iocb, struct iov_iter *from);
|
||||
|
||||
ssize_t fuse_backing_mmap(struct file *file, struct vm_area_struct *vma);
|
||||
|
||||
int fuse_file_fallocate_initialize(struct fuse_args *fa,
|
||||
struct fuse_fallocate_in *ffi,
|
||||
struct file *file, int mode, loff_t offset, loff_t length);
|
||||
|
|
|
|||
Loading…
Reference in a new issue