diff --git a/fs/fuse/backing.c b/fs/fuse/backing.c index fd3831472a2e..2959a6944c1a 100644 --- a/fs/fuse/backing.c +++ b/fs/fuse/backing.c @@ -97,7 +97,7 @@ out: return bpf_prog; } -int fuse_open_initialize(struct fuse_args *fa, struct fuse_open_io *foio, +int fuse_open_initialize(struct fuse_bpf_args *fa, struct fuse_open_io *foio, struct inode *inode, struct file *file, bool isdir) { foio->foi = (struct fuse_open_in) { @@ -106,16 +106,16 @@ int fuse_open_initialize(struct fuse_args *fa, struct fuse_open_io *foio, foio->foo = (struct fuse_open_out) {0}; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(inode)->nodeid, .opcode = isdir ? FUSE_OPENDIR : FUSE_OPEN, .in_numargs = 1, .out_numargs = 1, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(foio->foi), .value = &foio->foi, }, - .out_args[0] = (struct fuse_arg) { + .out_args[0] = (struct fuse_bpf_arg) { .size = sizeof(foio->foo), .value = &foio->foo, }, @@ -124,7 +124,7 @@ int fuse_open_initialize(struct fuse_args *fa, struct fuse_open_io *foio, return 0; } -int fuse_open_backing(struct fuse_args *fa, +int fuse_open_backing(struct fuse_bpf_args *fa, struct inode *inode, struct file *file, bool isdir) { struct fuse_mount *fm = get_fuse_mount(inode); @@ -175,7 +175,7 @@ int fuse_open_backing(struct fuse_args *fa, return 0; } -void *fuse_open_finalize(struct fuse_args *fa, +void *fuse_open_finalize(struct fuse_bpf_args *fa, struct inode *inode, struct file *file, bool isdir) { struct fuse_file *ff = file->private_data; @@ -187,7 +187,7 @@ void *fuse_open_finalize(struct fuse_args *fa, } int fuse_create_open_initialize( - struct fuse_args *fa, struct fuse_create_open_io *fcoio, + struct fuse_bpf_args *fa, struct fuse_create_open_io *fcoio, struct inode *dir, struct dentry *entry, struct file *file, unsigned int flags, umode_t mode) { @@ -199,24 +199,24 @@ int fuse_create_open_initialize( fcoio->feo = (struct fuse_entry_out) {0}; fcoio->foo = (struct fuse_open_out) {0}; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(dir), .opcode = FUSE_CREATE, .in_numargs = 2, .out_numargs = 2, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(fcoio->fci), .value = &fcoio->fci, }, - .in_args[1] = (struct fuse_in_arg) { + .in_args[1] = (struct fuse_bpf_in_arg) { .size = entry->d_name.len + 1, .value = entry->d_name.name, }, - .out_args[0] = (struct fuse_arg) { + .out_args[0] = (struct fuse_bpf_arg) { .size = sizeof(fcoio->feo), .value = &fcoio->feo, }, - .out_args[1] = (struct fuse_arg) { + .out_args[1] = (struct fuse_bpf_arg) { .size = sizeof(fcoio->foo), .value = &fcoio->foo, }, @@ -251,7 +251,7 @@ static int fuse_open_file_backing(struct inode *inode, struct file *file) } int fuse_create_open_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, struct file *file, unsigned int flags, umode_t mode) { @@ -321,7 +321,7 @@ out: } void *fuse_create_open_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, struct file *file, unsigned int flags, umode_t mode) { @@ -337,7 +337,7 @@ void *fuse_create_open_finalize( return 0; } -int fuse_release_initialize(struct fuse_args *fa, struct fuse_release_in *fri, +int fuse_release_initialize(struct fuse_bpf_args *fa, struct fuse_release_in *fri, struct inode *inode, struct file *file) { struct fuse_file *fuse_file = file->private_data; @@ -349,7 +349,7 @@ int fuse_release_initialize(struct fuse_args *fa, struct fuse_release_in *fri, .fh = ((struct fuse_file *)(file->private_data))->fh, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(inode)->nodeid, .opcode = FUSE_RELEASE, .in_numargs = 1, @@ -360,7 +360,7 @@ int fuse_release_initialize(struct fuse_args *fa, struct fuse_release_in *fri, return 0; } -int fuse_releasedir_initialize(struct fuse_args *fa, +int fuse_releasedir_initialize(struct fuse_bpf_args *fa, struct fuse_release_in *fri, struct inode *inode, struct file *file) { @@ -373,7 +373,7 @@ int fuse_releasedir_initialize(struct fuse_args *fa, .fh = ((struct fuse_file *)(file->private_data))->fh, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(inode)->nodeid, .opcode = FUSE_RELEASEDIR, .in_numargs = 1, @@ -384,20 +384,20 @@ int fuse_releasedir_initialize(struct fuse_args *fa, return 0; } -int fuse_release_backing(struct fuse_args *fa, +int fuse_release_backing(struct fuse_bpf_args *fa, struct inode *inode, struct file *file) { return 0; } -void *fuse_release_finalize(struct fuse_args *fa, +void *fuse_release_finalize(struct fuse_bpf_args *fa, struct inode *inode, struct file *file) { fuse_file_free(file->private_data); return NULL; } -int fuse_flush_initialize(struct fuse_args *fa, struct fuse_flush_in *ffi, +int fuse_flush_initialize(struct fuse_bpf_args *fa, struct fuse_flush_in *ffi, struct file *file, fl_owner_t id) { struct fuse_file *fuse_file = file->private_data; @@ -406,19 +406,19 @@ int fuse_flush_initialize(struct fuse_args *fa, struct fuse_flush_in *ffi, .fh = fuse_file->fh, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(file->f_inode), .opcode = FUSE_FLUSH, .in_numargs = 1, .in_args[0].size = sizeof(*ffi), .in_args[0].value = ffi, - .force = true, + .flags = FUSE_BPF_FORCE, }; return 0; } -int fuse_flush_backing(struct fuse_args *fa, struct file *file, fl_owner_t id) +int fuse_flush_backing(struct fuse_bpf_args *fa, struct file *file, fl_owner_t id) { struct fuse_file *fuse_file = file->private_data; struct file *backing_file = fuse_file->backing_file; @@ -428,12 +428,12 @@ int fuse_flush_backing(struct fuse_args *fa, struct file *file, fl_owner_t id) return 0; } -void *fuse_flush_finalize(struct fuse_args *fa, struct file *file, fl_owner_t id) +void *fuse_flush_finalize(struct fuse_bpf_args *fa, struct file *file, fl_owner_t id) { return NULL; } -int fuse_lseek_initialize(struct fuse_args *fa, struct fuse_lseek_io *flio, +int fuse_lseek_initialize(struct fuse_bpf_args *fa, struct fuse_lseek_io *flio, struct file *file, loff_t offset, int whence) { struct fuse_file *fuse_file = file->private_data; @@ -444,7 +444,7 @@ int fuse_lseek_initialize(struct fuse_args *fa, struct fuse_lseek_io *flio, .whence = whence, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(file->f_inode), .opcode = FUSE_LSEEK, .in_numargs = 1, @@ -458,7 +458,7 @@ int fuse_lseek_initialize(struct fuse_args *fa, struct fuse_lseek_io *flio, return 0; } -int fuse_lseek_backing(struct fuse_args *fa, struct file *file, loff_t offset, int whence) +int fuse_lseek_backing(struct fuse_bpf_args *fa, struct file *file, loff_t offset, int whence) { const struct fuse_lseek_in *fli = fa->in_args[0].value; struct fuse_lseek_out *flo = fa->out_args[0].value; @@ -487,7 +487,7 @@ int fuse_lseek_backing(struct fuse_args *fa, struct file *file, loff_t offset, i return ret; } -void *fuse_lseek_finalize(struct fuse_args *fa, struct file *file, loff_t offset, int whence) +void *fuse_lseek_finalize(struct fuse_bpf_args *fa, struct file *file, loff_t offset, int whence) { struct fuse_lseek_out *flo = fa->out_args[0].value; @@ -496,7 +496,7 @@ void *fuse_lseek_finalize(struct fuse_args *fa, struct file *file, loff_t offset return ERR_PTR(flo->offset); } -int fuse_copy_file_range_initialize(struct fuse_args *fa, struct fuse_copy_file_range_io *fcf, +int fuse_copy_file_range_initialize(struct fuse_bpf_args *fa, struct fuse_copy_file_range_io *fcf, struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t len, unsigned int flags) { @@ -514,7 +514,7 @@ int fuse_copy_file_range_initialize(struct fuse_args *fa, struct fuse_copy_file_ .flags = flags, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(file_in->f_inode), .opcode = FUSE_COPY_FILE_RANGE, .in_numargs = 1, @@ -528,7 +528,7 @@ int fuse_copy_file_range_initialize(struct fuse_args *fa, struct fuse_copy_file_ return 0; } -int fuse_copy_file_range_backing(struct fuse_args *fa, struct file *file_in, loff_t pos_in, +int fuse_copy_file_range_backing(struct fuse_bpf_args *fa, struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t len, unsigned int flags) { @@ -547,14 +547,14 @@ int fuse_copy_file_range_backing(struct fuse_args *fa, struct file *file_in, lof flags); } -void *fuse_copy_file_range_finalize(struct fuse_args *fa, struct file *file_in, loff_t pos_in, +void *fuse_copy_file_range_finalize(struct fuse_bpf_args *fa, struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t len, unsigned int flags) { return NULL; } -int fuse_fsync_initialize(struct fuse_args *fa, struct fuse_fsync_in *ffi, +int fuse_fsync_initialize(struct fuse_bpf_args *fa, struct fuse_fsync_in *ffi, struct file *file, loff_t start, loff_t end, int datasync) { struct fuse_file *fuse_file = file->private_data; @@ -564,19 +564,19 @@ int fuse_fsync_initialize(struct fuse_args *fa, struct fuse_fsync_in *ffi, .fsync_flags = datasync ? FUSE_FSYNC_FDATASYNC : 0, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(file->f_inode)->nodeid, .opcode = FUSE_FSYNC, .in_numargs = 1, .in_args[0].size = sizeof(*ffi), .in_args[0].value = ffi, - .force = true, + .flags = FUSE_BPF_FORCE, }; return 0; } -int fuse_fsync_backing(struct fuse_args *fa, +int fuse_fsync_backing(struct fuse_bpf_args *fa, struct file *file, loff_t start, loff_t end, int datasync) { struct fuse_file *fuse_file = file->private_data; @@ -587,13 +587,13 @@ int fuse_fsync_backing(struct fuse_args *fa, return vfs_fsync(backing_file, new_datasync); } -void *fuse_fsync_finalize(struct fuse_args *fa, +void *fuse_fsync_finalize(struct fuse_bpf_args *fa, struct file *file, loff_t start, loff_t end, int datasync) { return NULL; } -int fuse_dir_fsync_initialize(struct fuse_args *fa, struct fuse_fsync_in *ffi, +int fuse_dir_fsync_initialize(struct fuse_bpf_args *fa, struct fuse_fsync_in *ffi, struct file *file, loff_t start, loff_t end, int datasync) { struct fuse_file *fuse_file = file->private_data; @@ -603,19 +603,19 @@ int fuse_dir_fsync_initialize(struct fuse_args *fa, struct fuse_fsync_in *ffi, .fsync_flags = datasync ? FUSE_FSYNC_FDATASYNC : 0, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(file->f_inode)->nodeid, .opcode = FUSE_FSYNCDIR, .in_numargs = 1, .in_args[0].size = sizeof(*ffi), .in_args[0].value = ffi, - .force = true, + .flags = FUSE_BPF_FORCE, }; return 0; } -int fuse_getxattr_initialize(struct fuse_args *fa, +int fuse_getxattr_initialize(struct fuse_bpf_args *fa, struct fuse_getxattr_io *fgio, struct dentry *dentry, const char *name, void *value, size_t size) @@ -624,35 +624,34 @@ int fuse_getxattr_initialize(struct fuse_args *fa, .fgi.size = size, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(dentry->d_inode)->nodeid, .opcode = FUSE_GETXATTR, .in_numargs = 2, .out_numargs = 1, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(fgio->fgi), .value = &fgio->fgi, }, - .in_args[1] = (struct fuse_in_arg) { + .in_args[1] = (struct fuse_bpf_in_arg) { .size = strlen(name) + 1, .value = name, }, - .out_argvar = size ? true : false, + .flags = size ? FUSE_BPF_OUT_ARGVAR : 0, .out_args[0].size = size ? size : sizeof(fgio->fgo), .out_args[0].value = size ? value : &fgio->fgo, }; - return 0; } -int fuse_getxattr_backing(struct fuse_args *fa, +int fuse_getxattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name, void *value, size_t size) { ssize_t ret = vfs_getxattr(get_fuse_dentry(dentry)->backing_path.dentry, fa->in_args[1].value, value, size); - if (fa->out_argvar) + if (fa->flags & FUSE_BPF_OUT_ARGVAR) fa->out_args[0].size = ret; else ((struct fuse_getxattr_out *)fa->out_args[0].value)->size = ret; @@ -660,13 +659,13 @@ int fuse_getxattr_backing(struct fuse_args *fa, return 0; } -void *fuse_getxattr_finalize(struct fuse_args *fa, +void *fuse_getxattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name, void *value, size_t size) { struct fuse_getxattr_out *fgo; - if (fa->out_argvar) + if (fa->flags & FUSE_BPF_OUT_ARGVAR) return ERR_PTR(fa->out_args[0].size); fgo = fa->out_args[0].value; @@ -675,7 +674,7 @@ void *fuse_getxattr_finalize(struct fuse_args *fa, } -int fuse_listxattr_initialize(struct fuse_args *fa, +int fuse_listxattr_initialize(struct fuse_bpf_args *fa, struct fuse_getxattr_io *fgio, struct dentry *dentry, char *list, size_t size) { @@ -683,17 +682,17 @@ int fuse_listxattr_initialize(struct fuse_args *fa, .fgi.size = size, }; - *fa = (struct fuse_args){ + *fa = (struct fuse_bpf_args){ .nodeid = get_fuse_inode(dentry->d_inode)->nodeid, .opcode = FUSE_LISTXATTR, .in_numargs = 1, .out_numargs = 1, .in_args[0] = - (struct fuse_in_arg){ + (struct fuse_bpf_in_arg){ .size = sizeof(fgio->fgi), .value = &fgio->fgi, }, - .out_argvar = size ? true : false, + .flags = size ? FUSE_BPF_OUT_ARGVAR : 0, .out_args[0].size = size ? size : sizeof(fgio->fgo), .out_args[0].value = size ? (void *)list : &fgio->fgo, }; @@ -701,7 +700,7 @@ int fuse_listxattr_initialize(struct fuse_args *fa, return 0; } -int fuse_listxattr_backing(struct fuse_args *fa, struct dentry *dentry, +int fuse_listxattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, char *list, size_t size) { ssize_t ret = @@ -711,7 +710,7 @@ int fuse_listxattr_backing(struct fuse_args *fa, struct dentry *dentry, if (ret < 0) return ret; - if (fa->out_argvar) + if (fa->flags & FUSE_BPF_OUT_ARGVAR) fa->out_args[0].size = ret; else ((struct fuse_getxattr_out *)fa->out_args[0].value)->size = ret; @@ -719,7 +718,7 @@ int fuse_listxattr_backing(struct fuse_args *fa, struct dentry *dentry, return ret; } -void *fuse_listxattr_finalize(struct fuse_args *fa, struct dentry *dentry, +void *fuse_listxattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, char *list, size_t size) { struct fuse_getxattr_out *fgo; @@ -727,14 +726,14 @@ void *fuse_listxattr_finalize(struct fuse_args *fa, struct dentry *dentry, if (fa->error_in) return NULL; - if (fa->out_argvar) + if (fa->flags & FUSE_BPF_OUT_ARGVAR) return ERR_PTR(fa->out_args[0].size); fgo = fa->out_args[0].value; return ERR_PTR(fgo->size); } -int fuse_setxattr_initialize(struct fuse_args *fa, +int fuse_setxattr_initialize(struct fuse_bpf_args *fa, struct fuse_setxattr_in *fsxi, struct dentry *dentry, const char *name, const void *value, size_t size, int flags) @@ -744,19 +743,19 @@ int fuse_setxattr_initialize(struct fuse_args *fa, .flags = flags, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(dentry->d_inode)->nodeid, .opcode = FUSE_SETXATTR, .in_numargs = 3, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(*fsxi), .value = fsxi, }, - .in_args[1] = (struct fuse_in_arg) { + .in_args[1] = (struct fuse_bpf_in_arg) { .size = strlen(name) + 1, .value = name, }, - .in_args[2] = (struct fuse_in_arg) { + .in_args[2] = (struct fuse_bpf_in_arg) { .size = size, .value = value, }, @@ -765,7 +764,7 @@ int fuse_setxattr_initialize(struct fuse_args *fa, return 0; } -int fuse_setxattr_backing(struct fuse_args *fa, struct dentry *dentry, +int fuse_setxattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name, const void *value, size_t size, int flags) { @@ -773,22 +772,22 @@ int fuse_setxattr_backing(struct fuse_args *fa, struct dentry *dentry, value, size, flags); } -void *fuse_setxattr_finalize(struct fuse_args *fa, struct dentry *dentry, +void *fuse_setxattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name, const void *value, size_t size, int flags) { return NULL; } -int fuse_removexattr_initialize(struct fuse_args *fa, +int fuse_removexattr_initialize(struct fuse_bpf_args *fa, struct fuse_dummy_io *unused, struct dentry *dentry, const char *name) { - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(dentry->d_inode)->nodeid, .opcode = FUSE_REMOVEXATTR, .in_numargs = 1, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = strlen(name) + 1, .value = name, }, @@ -797,7 +796,7 @@ int fuse_removexattr_initialize(struct fuse_args *fa, return 0; } -int fuse_removexattr_backing(struct fuse_args *fa, +int fuse_removexattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name) { struct path *backing_path = @@ -807,7 +806,7 @@ int fuse_removexattr_backing(struct fuse_args *fa, return vfs_removexattr(backing_path->dentry, name); } -void *fuse_removexattr_finalize(struct fuse_args *fa, +void *fuse_removexattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name) { return NULL; @@ -846,7 +845,7 @@ static void fuse_bpf_aio_rw_complete(struct kiocb *iocb, long res, long res2) int fuse_file_read_iter_initialize( - struct fuse_args *fa, struct fuse_file_read_iter_io *fri, + struct fuse_bpf_args *fa, struct fuse_file_read_iter_io *fri, struct kiocb *iocb, struct iov_iter *to) { struct file *file = iocb->ki_filp; @@ -864,7 +863,7 @@ int fuse_file_read_iter_initialize( /* TODO we can't assume 'to' is a kvec */ /* TODO we also can't assume the vector has only one component */ - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .opcode = FUSE_READ, .nodeid = ff->nodeid, .in_numargs = 1, @@ -885,7 +884,7 @@ int fuse_file_read_iter_initialize( return 0; } -int fuse_file_read_iter_backing(struct fuse_args *fa, +int fuse_file_read_iter_backing(struct fuse_bpf_args *fa, struct kiocb *iocb, struct iov_iter *to) { struct fuse_read_iter_out *frio = fa->out_args[0].value; @@ -933,7 +932,7 @@ out: return ret; } -void *fuse_file_read_iter_finalize(struct fuse_args *fa, +void *fuse_file_read_iter_finalize(struct fuse_bpf_args *fa, struct kiocb *iocb, struct iov_iter *to) { struct fuse_read_iter_out *frio = fa->out_args[0].value; @@ -942,7 +941,7 @@ void *fuse_file_read_iter_finalize(struct fuse_args *fa, } int fuse_file_write_iter_initialize( - struct fuse_args *fa, struct fuse_file_write_iter_io *fwio, + struct fuse_bpf_args *fa, struct fuse_file_write_iter_io *fwio, struct kiocb *iocb, struct iov_iter *from) { struct file *file = iocb->ki_filp; @@ -955,7 +954,7 @@ int fuse_file_write_iter_initialize( }; /* TODO we can't assume 'from' is a kvec */ - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .opcode = FUSE_WRITE, .nodeid = ff->nodeid, .in_numargs = 2, @@ -971,7 +970,7 @@ int fuse_file_write_iter_initialize( return 0; } -int fuse_file_write_iter_backing(struct fuse_args *fa, +int fuse_file_write_iter_backing(struct fuse_bpf_args *fa, struct kiocb *iocb, struct iov_iter *from) { struct file *file = iocb->ki_filp; @@ -1025,7 +1024,7 @@ out: return 0; } -void *fuse_file_write_iter_finalize(struct fuse_args *fa, +void *fuse_file_write_iter_finalize(struct fuse_bpf_args *fa, struct kiocb *iocb, struct iov_iter *from) { struct fuse_write_iter_out *fwio = fa->out_args[0].value; @@ -1071,7 +1070,7 @@ ssize_t fuse_backing_mmap(struct file *file, struct vm_area_struct *vma) return ret; } -int fuse_file_fallocate_initialize(struct fuse_args *fa, +int fuse_file_fallocate_initialize(struct fuse_bpf_args *fa, struct fuse_fallocate_in *ffi, struct file *file, int mode, loff_t offset, loff_t length) { @@ -1084,7 +1083,7 @@ int fuse_file_fallocate_initialize(struct fuse_args *fa, .mode = mode }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .opcode = FUSE_FALLOCATE, .nodeid = ff->nodeid, .in_numargs = 1, @@ -1095,7 +1094,7 @@ int fuse_file_fallocate_initialize(struct fuse_args *fa, return 0; } -int fuse_file_fallocate_backing(struct fuse_args *fa, +int fuse_file_fallocate_backing(struct fuse_bpf_args *fa, struct file *file, int mode, loff_t offset, loff_t length) { const struct fuse_fallocate_in *ffi = fa->in_args[0].value; @@ -1105,7 +1104,7 @@ int fuse_file_fallocate_backing(struct fuse_args *fa, ffi->length); } -void *fuse_file_fallocate_finalize(struct fuse_args *fa, +void *fuse_file_fallocate_finalize(struct fuse_bpf_args *fa, struct file *file, int mode, loff_t offset, loff_t length) { return NULL; @@ -1115,24 +1114,24 @@ void *fuse_file_fallocate_finalize(struct fuse_args *fa, * Directory operations after here * ******************************************************************************/ -int fuse_lookup_initialize(struct fuse_args *fa, struct fuse_lookup_io *fli, +int fuse_lookup_initialize(struct fuse_bpf_args *fa, struct fuse_lookup_io *fli, struct inode *dir, struct dentry *entry, unsigned int flags) { - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_fuse_inode(dir)->nodeid, .opcode = FUSE_LOOKUP, .in_numargs = 1, .out_numargs = 2, - .out_argvar = 1, - .in_args[0] = (struct fuse_in_arg) { + .flags = FUSE_BPF_OUT_ARGVAR, + .in_args[0] = (struct fuse_bpf_in_arg) { .size = entry->d_name.len + 1, .value = entry->d_name.name, }, - .out_args[0] = (struct fuse_arg) { + .out_args[0] = (struct fuse_bpf_arg) { .size = sizeof(fli->feo), .value = &fli->feo, }, - .out_args[1] = (struct fuse_arg) { + .out_args[1] = (struct fuse_bpf_arg) { .size = sizeof(fli->feb.out), .value = &fli->feb.out, }, @@ -1141,7 +1140,7 @@ int fuse_lookup_initialize(struct fuse_args *fa, struct fuse_lookup_io *fli, return 0; } -int fuse_lookup_backing(struct fuse_args *fa, struct inode *dir, +int fuse_lookup_backing(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags) { struct fuse_dentry *fuse_entry = get_fuse_dentry(entry); @@ -1168,7 +1167,7 @@ int fuse_lookup_backing(struct fuse_args *fa, struct inode *dir, return 0; } -struct dentry *fuse_lookup_finalize(struct fuse_args *fa, struct inode *dir, +struct dentry *fuse_lookup_finalize(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags) { struct fuse_dentry *fd; @@ -1271,7 +1270,7 @@ struct dentry *fuse_lookup_finalize(struct fuse_args *fa, struct inode *dir, return d_splice_alias(inode, entry); } -int fuse_revalidate_backing(struct fuse_args *fa, struct inode *dir, +int fuse_revalidate_backing(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags) { struct fuse_dentry *fuse_dentry = get_fuse_dentry(entry); @@ -1289,13 +1288,13 @@ int fuse_revalidate_backing(struct fuse_args *fa, struct inode *dir, return 1; } -void *fuse_revalidate_finalize(struct fuse_args *fa, struct inode *dir, +void *fuse_revalidate_finalize(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags) { return 0; } -int fuse_canonical_path_initialize(struct fuse_args *fa, +int fuse_canonical_path_initialize(struct fuse_bpf_args *fa, struct fuse_dummy_io *fdi, const struct path *path, struct path *canonical_path) @@ -1304,14 +1303,14 @@ int fuse_canonical_path_initialize(struct fuse_args *fa, return 0; } -int fuse_canonical_path_backing(struct fuse_args *fa, const struct path *path, +int fuse_canonical_path_backing(struct fuse_bpf_args *fa, const struct path *path, struct path *canonical_path) { get_fuse_backing_path(path->dentry, canonical_path); return 0; } -void *fuse_canonical_path_finalize(struct fuse_args *fa, +void *fuse_canonical_path_finalize(struct fuse_bpf_args *fa, const struct path *path, struct path *canonical_path) { @@ -1319,7 +1318,7 @@ void *fuse_canonical_path_finalize(struct fuse_args *fa, } int fuse_mknod_initialize( - struct fuse_args *fa, struct fuse_mknod_in *fmi, + struct fuse_bpf_args *fa, struct fuse_mknod_in *fmi, struct inode *dir, struct dentry *entry, umode_t mode, dev_t rdev) { *fmi = (struct fuse_mknod_in) { @@ -1327,15 +1326,15 @@ int fuse_mknod_initialize( .rdev = new_encode_dev(rdev), .umask = current_umask(), }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(dir), .opcode = FUSE_MKNOD, .in_numargs = 2, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(*fmi), .value = fmi, }, - .in_args[1] = (struct fuse_in_arg) { + .in_args[1] = (struct fuse_bpf_in_arg) { .size = entry->d_name.len + 1, .value = entry->d_name.name, }, @@ -1345,7 +1344,7 @@ int fuse_mknod_initialize( } int fuse_mknod_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, umode_t mode, dev_t rdev) { int err = 0; @@ -1389,29 +1388,29 @@ out: } void *fuse_mknod_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, umode_t mode, dev_t rdev) { return NULL; } int fuse_mkdir_initialize( - struct fuse_args *fa, struct fuse_mkdir_in *fmi, + struct fuse_bpf_args *fa, struct fuse_mkdir_in *fmi, struct inode *dir, struct dentry *entry, umode_t mode) { *fmi = (struct fuse_mkdir_in) { .mode = mode, .umask = current_umask(), }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(dir), .opcode = FUSE_MKDIR, .in_numargs = 2, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(*fmi), .value = fmi, }, - .in_args[1] = (struct fuse_in_arg) { + .in_args[1] = (struct fuse_bpf_in_arg) { .size = entry->d_name.len + 1, .value = entry->d_name.name, }, @@ -1421,7 +1420,7 @@ int fuse_mkdir_initialize( } int fuse_mkdir_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, umode_t mode) { int err = 0; @@ -1467,21 +1466,21 @@ out: } void *fuse_mkdir_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, umode_t mode) { return NULL; } int fuse_rmdir_initialize( - struct fuse_args *fa, struct fuse_dummy_io *dummy, + struct fuse_bpf_args *fa, struct fuse_dummy_io *dummy, struct inode *dir, struct dentry *entry) { - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(dir), .opcode = FUSE_RMDIR, .in_numargs = 1, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = entry->d_name.len + 1, .value = entry->d_name.name, }, @@ -1491,7 +1490,7 @@ int fuse_rmdir_initialize( } int fuse_rmdir_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry) { int err = 0; @@ -1520,7 +1519,7 @@ int fuse_rmdir_backing( } void *fuse_rmdir_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry) { return NULL; @@ -1596,7 +1595,7 @@ put_old_path: return err; } -int fuse_rename2_initialize(struct fuse_args *fa, struct fuse_rename2_in *fri, +int fuse_rename2_initialize(struct fuse_bpf_args *fa, struct fuse_rename2_in *fri, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent, unsigned int flags) @@ -1605,19 +1604,19 @@ int fuse_rename2_initialize(struct fuse_args *fa, struct fuse_rename2_in *fri, .newdir = get_node_id(newdir), .flags = flags, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(olddir), .opcode = FUSE_RENAME2, .in_numargs = 3, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(*fri), .value = fri, }, - .in_args[1] = (struct fuse_in_arg) { + .in_args[1] = (struct fuse_bpf_in_arg) { .size = oldent->d_name.len + 1, .value = oldent->d_name.name, }, - .in_args[2] = (struct fuse_in_arg) { + .in_args[2] = (struct fuse_bpf_in_arg) { .size = newent->d_name.len + 1, .value = newent->d_name.name, }, @@ -1626,7 +1625,7 @@ int fuse_rename2_initialize(struct fuse_args *fa, struct fuse_rename2_in *fri, return 0; } -int fuse_rename2_backing(struct fuse_args *fa, +int fuse_rename2_backing(struct fuse_bpf_args *fa, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent, unsigned int flags) @@ -1637,7 +1636,7 @@ int fuse_rename2_backing(struct fuse_args *fa, return fuse_rename_backing_common(olddir, oldent, newdir, newent, fri->flags); } -void *fuse_rename2_finalize(struct fuse_args *fa, +void *fuse_rename2_finalize(struct fuse_bpf_args *fa, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent, unsigned int flags) @@ -1645,26 +1644,26 @@ void *fuse_rename2_finalize(struct fuse_args *fa, return NULL; } -int fuse_rename_initialize(struct fuse_args *fa, struct fuse_rename_in *fri, +int fuse_rename_initialize(struct fuse_bpf_args *fa, struct fuse_rename_in *fri, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent) { *fri = (struct fuse_rename_in) { .newdir = get_node_id(newdir), }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(olddir), .opcode = FUSE_RENAME, .in_numargs = 3, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(*fri), .value = fri, }, - .in_args[1] = (struct fuse_in_arg) { + .in_args[1] = (struct fuse_bpf_in_arg) { .size = oldent->d_name.len + 1, .value = oldent->d_name.name, }, - .in_args[2] = (struct fuse_in_arg) { + .in_args[2] = (struct fuse_bpf_in_arg) { .size = newent->d_name.len + 1, .value = newent->d_name.name, }, @@ -1673,7 +1672,7 @@ int fuse_rename_initialize(struct fuse_args *fa, struct fuse_rename_in *fri, return 0; } -int fuse_rename_backing(struct fuse_args *fa, +int fuse_rename_backing(struct fuse_bpf_args *fa, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent) { @@ -1681,7 +1680,7 @@ int fuse_rename_backing(struct fuse_args *fa, return fuse_rename_backing_common(olddir, oldent, newdir, newent, 0); } -void *fuse_rename_finalize(struct fuse_args *fa, +void *fuse_rename_finalize(struct fuse_bpf_args *fa, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent) { @@ -1689,14 +1688,14 @@ void *fuse_rename_finalize(struct fuse_args *fa, } int fuse_unlink_initialize( - struct fuse_args *fa, struct fuse_dummy_io *dummy, + struct fuse_bpf_args *fa, struct fuse_dummy_io *dummy, struct inode *dir, struct dentry *entry) { - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(dir), .opcode = FUSE_UNLINK, .in_numargs = 1, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = entry->d_name.len + 1, .value = entry->d_name.name, }, @@ -1706,7 +1705,7 @@ int fuse_unlink_initialize( } int fuse_unlink_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry) { int err = 0; @@ -1735,13 +1734,13 @@ int fuse_unlink_backing( } void *fuse_unlink_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry) { return NULL; } -int fuse_link_initialize(struct fuse_args *fa, struct fuse_link_in *fli, +int fuse_link_initialize(struct fuse_bpf_args *fa, struct fuse_link_in *fli, struct dentry *entry, struct inode *dir, struct dentry *newent) { @@ -1761,7 +1760,7 @@ int fuse_link_initialize(struct fuse_args *fa, struct fuse_link_in *fli, return 0; } -int fuse_link_backing(struct fuse_args *fa, struct dentry *entry, +int fuse_link_backing(struct fuse_bpf_args *fa, struct dentry *entry, struct inode *dir, struct dentry *newent) { int err = 0; @@ -1815,13 +1814,13 @@ err_dst_path: return err; } -void *fuse_link_finalize(struct fuse_args *fa, struct dentry *entry, +void *fuse_link_finalize(struct fuse_bpf_args *fa, struct dentry *entry, struct inode *dir, struct dentry *newent) { return NULL; } -int fuse_getattr_initialize(struct fuse_args *fa, struct fuse_getattr_io *fgio, +int fuse_getattr_initialize(struct fuse_bpf_args *fa, struct fuse_getattr_io *fgio, const struct dentry *entry, struct kstat *stat, u32 request_mask, unsigned int flags) { @@ -1832,16 +1831,16 @@ int fuse_getattr_initialize(struct fuse_args *fa, struct fuse_getattr_io *fgio, fgio->fao = (struct fuse_attr_out) {0}; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(entry->d_inode), .opcode = FUSE_GETATTR, .in_numargs = 1, .out_numargs = 1, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(fgio->fgi), .value = &fgio->fgi, }, - .out_args[0] = (struct fuse_arg) { + .out_args[0] = (struct fuse_bpf_arg) { .size = sizeof(fgio->fao), .value = &fgio->fao, }, @@ -1886,7 +1885,7 @@ static void fuse_stat_to_attr(struct fuse_conn *fc, struct inode *inode, attr->blksize = 1 << blkbits; } -int fuse_getattr_backing(struct fuse_args *fa, +int fuse_getattr_backing(struct fuse_bpf_args *fa, const struct dentry *entry, struct kstat *stat, u32 request_mask, unsigned int flags) { @@ -1909,7 +1908,7 @@ int fuse_getattr_backing(struct fuse_args *fa, return err; } -void *fuse_getattr_finalize(struct fuse_args *fa, +void *fuse_getattr_finalize(struct fuse_bpf_args *fa, const struct dentry *entry, struct kstat *stat, u32 request_mask, unsigned int flags) { @@ -1964,7 +1963,7 @@ static void fattr_to_iattr(struct fuse_conn *fc, } } -int fuse_setattr_initialize(struct fuse_args *fa, struct fuse_setattr_io *fsio, +int fuse_setattr_initialize(struct fuse_bpf_args *fa, struct fuse_setattr_io *fsio, struct dentry *dentry, struct iattr *attr, struct file *file) { struct fuse_conn *fc = get_fuse_conn(dentry->d_inode); @@ -1972,7 +1971,7 @@ int fuse_setattr_initialize(struct fuse_args *fa, struct fuse_setattr_io *fsio, *fsio = (struct fuse_setattr_io) {0}; iattr_to_fattr(fc, attr, &fsio->fsi, true); - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .opcode = FUSE_SETATTR, .nodeid = get_node_id(dentry->d_inode), .in_numargs = 1, @@ -1986,7 +1985,7 @@ int fuse_setattr_initialize(struct fuse_args *fa, struct fuse_setattr_io *fsio, return 0; } -int fuse_setattr_backing(struct fuse_args *fa, +int fuse_setattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, struct iattr *attr, struct file *file) { struct fuse_conn *fc = get_fuse_conn(dentry->d_inode); @@ -2013,18 +2012,18 @@ int fuse_setattr_backing(struct fuse_args *fa, return res; } -void *fuse_setattr_finalize(struct fuse_args *fa, +void *fuse_setattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, struct iattr *attr, struct file *file) { return NULL; } int fuse_statfs_initialize( - struct fuse_args *fa, struct fuse_statfs_out *fso, + struct fuse_bpf_args *fa, struct fuse_statfs_out *fso, struct dentry *dentry, struct kstatfs *buf) { *fso = (struct fuse_statfs_out) {0}; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(d_inode(dentry)), .opcode = FUSE_STATFS, .out_numargs = 1, @@ -2037,7 +2036,7 @@ int fuse_statfs_initialize( } int fuse_statfs_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct dentry *dentry, struct kstatfs *buf) { int err = 0; @@ -2059,7 +2058,7 @@ int fuse_statfs_backing( } void *fuse_statfs_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct dentry *dentry, struct kstatfs *buf) { struct fuse_statfs_out *fso = fa->out_args[0].value; @@ -2069,7 +2068,7 @@ void *fuse_statfs_finalize( return NULL; } -int fuse_get_link_initialize(struct fuse_args *fa, struct fuse_dummy_io *unused, +int fuse_get_link_initialize(struct fuse_bpf_args *fa, struct fuse_dummy_io *unused, struct inode *inode, struct dentry *dentry, struct delayed_call *callback, const char **out) { @@ -2085,11 +2084,11 @@ int fuse_get_link_initialize(struct fuse_args *fa, struct fuse_dummy_io *unused, * We ought to only make that buffer if it's been requested, so leaving * this unimplemented for the moment */ - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .opcode = FUSE_READLINK, .nodeid = get_node_id(inode), .in_numargs = 1, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = dentry->d_name.len + 1, .value = dentry->d_name.name, }, @@ -2104,7 +2103,7 @@ int fuse_get_link_initialize(struct fuse_args *fa, struct fuse_dummy_io *unused, return 0; } -int fuse_get_link_backing(struct fuse_args *fa, +int fuse_get_link_backing(struct fuse_bpf_args *fa, struct inode *inode, struct dentry *dentry, struct delayed_call *callback, const char **out) { @@ -2131,7 +2130,7 @@ int fuse_get_link_backing(struct fuse_args *fa, return 0; } -void *fuse_get_link_finalize(struct fuse_args *fa, +void *fuse_get_link_finalize(struct fuse_bpf_args *fa, struct inode *inode, struct dentry *dentry, struct delayed_call *callback, const char **out) { @@ -2139,18 +2138,18 @@ void *fuse_get_link_finalize(struct fuse_args *fa, } int fuse_symlink_initialize( - struct fuse_args *fa, struct fuse_dummy_io *unused, + struct fuse_bpf_args *fa, struct fuse_dummy_io *unused, struct inode *dir, struct dentry *entry, const char *link, int len) { - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = get_node_id(dir), .opcode = FUSE_SYMLINK, .in_numargs = 2, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = entry->d_name.len + 1, .value = entry->d_name.name, }, - .in_args[1] = (struct fuse_in_arg) { + .in_args[1] = (struct fuse_bpf_in_arg) { .size = len, .value = link, }, @@ -2160,7 +2159,7 @@ int fuse_symlink_initialize( } int fuse_symlink_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, const char *link, int len) { int err = 0; @@ -2199,13 +2198,13 @@ out: } void *fuse_symlink_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, const char *link, int len) { return NULL; } -int fuse_readdir_initialize(struct fuse_args *fa, struct fuse_read_io *frio, +int fuse_readdir_initialize(struct fuse_bpf_args *fa, struct fuse_read_io *frio, struct file *file, struct dir_context *ctx, bool *force_again, bool *allow_force, bool is_continued) { @@ -2215,21 +2214,21 @@ int fuse_readdir_initialize(struct fuse_args *fa, struct fuse_read_io *frio, if (!page) return -ENOMEM; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .nodeid = ff->nodeid, .opcode = FUSE_READDIR, .in_numargs = 1, - .out_argvar = true, + .flags = FUSE_BPF_OUT_ARGVAR, .out_numargs = 2, - .in_args[0] = (struct fuse_in_arg) { + .in_args[0] = (struct fuse_bpf_in_arg) { .size = sizeof(frio->fri), .value = &frio->fri, }, - .out_args[0] = (struct fuse_arg) { + .out_args[0] = (struct fuse_bpf_arg) { .size = sizeof(frio->fro), .value = &frio->fro, }, - .out_args[1] = (struct fuse_arg) { + .out_args[1] = (struct fuse_bpf_arg) { .size = PAGE_SIZE, .value = page, }, @@ -2303,7 +2302,7 @@ static int parse_dirfile(char *buf, size_t nbytes, struct dir_context *ctx) } -int fuse_readdir_backing(struct fuse_args *fa, +int fuse_readdir_backing(struct fuse_bpf_args *fa, struct file *file, struct dir_context *ctx, bool *force_again, bool *allow_force, bool is_continued) { @@ -2335,7 +2334,7 @@ int fuse_readdir_backing(struct fuse_args *fa, return err; } -void *fuse_readdir_finalize(struct fuse_args *fa, +void *fuse_readdir_finalize(struct fuse_bpf_args *fa, struct file *file, struct dir_context *ctx, bool *force_again, bool *allow_force, bool is_continued) { @@ -2356,14 +2355,14 @@ void *fuse_readdir_finalize(struct fuse_args *fa, return ERR_PTR(err); } -int fuse_access_initialize(struct fuse_args *fa, struct fuse_access_in *fai, +int fuse_access_initialize(struct fuse_bpf_args *fa, struct fuse_access_in *fai, struct inode *inode, int mask) { *fai = (struct fuse_access_in) { .mask = mask, }; - *fa = (struct fuse_args) { + *fa = (struct fuse_bpf_args) { .opcode = FUSE_ACCESS, .nodeid = get_node_id(inode), .in_numargs = 1, @@ -2374,7 +2373,7 @@ int fuse_access_initialize(struct fuse_args *fa, struct fuse_access_in *fai, return 0; } -int fuse_access_backing(struct fuse_args *fa, struct inode *inode, int mask) +int fuse_access_backing(struct fuse_bpf_args *fa, struct inode *inode, int mask) { struct fuse_inode *fi = get_fuse_inode(inode); const struct fuse_access_in *fai = fa->in_args[0].value; @@ -2383,7 +2382,7 @@ int fuse_access_backing(struct fuse_args *fa, struct inode *inode, int mask) fi->backing_inode, fai->mask); } -void *fuse_access_finalize(struct fuse_args *fa, struct inode *inode, int mask) +void *fuse_access_finalize(struct fuse_bpf_args *fa, struct inode *inode, int mask) { return NULL; } @@ -2403,3 +2402,54 @@ void __exit fuse_bpf_cleanup(void) { kmem_cache_destroy(fuse_bpf_aio_request_cachep); } + +ssize_t fuse_bpf_simple_request(struct fuse_mount *fm, struct fuse_bpf_args *bpf_args) +{ + int i; + ssize_t res; + struct fuse_args args = { + .nodeid = bpf_args->nodeid, + .opcode = bpf_args->opcode, + .error_in = bpf_args->error_in, + .in_numargs = bpf_args->in_numargs, + .out_numargs = bpf_args->out_numargs, + .force = !!(bpf_args->flags & FUSE_BPF_FORCE), + .out_argvar = !!(bpf_args->flags & FUSE_BPF_OUT_ARGVAR), + }; + + for (i = 0; i < args.in_numargs; ++i) + args.in_args[i] = (struct fuse_in_arg) { + .size = bpf_args->in_args[i].size, + .value = bpf_args->in_args[i].value, + }; + for (i = 0; i < args.out_numargs; ++i) + args.out_args[i] = (struct fuse_arg) { + .size = bpf_args->out_args[i].size, + .value = bpf_args->out_args[i].value, + }; + + res = fuse_simple_request(fm, &args); + + *bpf_args = (struct fuse_bpf_args) { + .nodeid = args.nodeid, + .opcode = args.opcode, + .error_in = args.error_in, + .in_numargs = args.in_numargs, + .out_numargs = args.out_numargs, + }; + if (args.force) + bpf_args->flags |= FUSE_BPF_FORCE; + if (args.out_args) + bpf_args->flags |= FUSE_BPF_OUT_ARGVAR; + for (i = 0; i < args.in_numargs; ++i) + bpf_args->in_args[i] = (struct fuse_bpf_in_arg) { + .size = args.in_args[i].size, + .value = args.in_args[i].value, + }; + for (i = 0; i < args.out_numargs; ++i) + bpf_args->out_args[i] = (struct fuse_bpf_arg) { + .size = args.out_args[i].size, + .value = args.out_args[i].value, + }; + return res; +} diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index b1fb8d83117c..2f07d3a1ff28 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -308,12 +308,48 @@ struct fuse_file { bool flock:1; }; +/** One input argument of a request */ +struct fuse_in_arg { + unsigned size; + const void *value; +}; + +/** One output argument of a request */ +struct fuse_arg { + unsigned size; + void *value; +}; + /** FUSE page descriptor */ struct fuse_page_desc { unsigned int length; unsigned int offset; }; +struct fuse_args { + uint64_t nodeid; + uint32_t opcode; + uint32_t error_in; + unsigned short in_numargs; + unsigned short out_numargs; + bool force:1; + bool noreply:1; + bool nocreds:1; + bool in_pages:1; + bool out_pages:1; + bool user_pages:1; + bool out_argvar:1; + bool page_zeroing:1; + bool page_replace:1; + bool may_block:1; + struct fuse_in_arg in_args[FUSE_MAX_IN_ARGS]; + struct fuse_arg out_args[FUSE_MAX_OUT_ARGS]; + void (*end)(struct fuse_mount *fm, struct fuse_args *args, int error); + + /* Path used for completing d_canonical_path */ + struct path *canonical_path; +}; + struct fuse_args_pages { struct fuse_args args; struct page **pages; @@ -1314,11 +1350,11 @@ struct fuse_open_io { struct fuse_open_out foo; }; -int fuse_open_initialize(struct fuse_args *fa, struct fuse_open_io *foi, +int fuse_open_initialize(struct fuse_bpf_args *fa, struct fuse_open_io *foi, struct inode *inode, struct file *file, bool isdir); -int fuse_open_backing(struct fuse_args *fa, +int fuse_open_backing(struct fuse_bpf_args *fa, struct inode *inode, struct file *file, bool isdir); -void *fuse_open_finalize(struct fuse_args *fa, +void *fuse_open_finalize(struct fuse_bpf_args *fa, struct inode *inode, struct file *file, bool isdir); struct fuse_create_open_io { @@ -1328,103 +1364,103 @@ struct fuse_create_open_io { }; int fuse_create_open_initialize( - struct fuse_args *fa, struct fuse_create_open_io *fcoi, + struct fuse_bpf_args *fa, struct fuse_create_open_io *fcoi, struct inode *dir, struct dentry *entry, struct file *file, unsigned int flags, umode_t mode); int fuse_create_open_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, struct file *file, unsigned int flags, umode_t mode); void *fuse_create_open_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, struct file *file, unsigned int flags, umode_t mode); int fuse_mknod_initialize( - struct fuse_args *fa, struct fuse_mknod_in *fmi, + struct fuse_bpf_args *fa, struct fuse_mknod_in *fmi, struct inode *dir, struct dentry *entry, umode_t mode, dev_t rdev); int fuse_mknod_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, umode_t mode, dev_t rdev); void *fuse_mknod_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, umode_t mode, dev_t rdev); int fuse_mkdir_initialize( - struct fuse_args *fa, struct fuse_mkdir_in *fmi, + struct fuse_bpf_args *fa, struct fuse_mkdir_in *fmi, struct inode *dir, struct dentry *entry, umode_t mode); int fuse_mkdir_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, umode_t mode); void *fuse_mkdir_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, umode_t mode); int fuse_rmdir_initialize( - struct fuse_args *fa, struct fuse_dummy_io *fmi, + struct fuse_bpf_args *fa, struct fuse_dummy_io *fmi, struct inode *dir, struct dentry *entry); int fuse_rmdir_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry); void *fuse_rmdir_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry); -int fuse_rename2_initialize(struct fuse_args *fa, struct fuse_rename2_in *fri, +int fuse_rename2_initialize(struct fuse_bpf_args *fa, struct fuse_rename2_in *fri, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent, unsigned int flags); -int fuse_rename2_backing(struct fuse_args *fa, +int fuse_rename2_backing(struct fuse_bpf_args *fa, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent, unsigned int flags); -void *fuse_rename2_finalize(struct fuse_args *fa, +void *fuse_rename2_finalize(struct fuse_bpf_args *fa, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent, unsigned int flags); -int fuse_rename_initialize(struct fuse_args *fa, struct fuse_rename_in *fri, +int fuse_rename_initialize(struct fuse_bpf_args *fa, struct fuse_rename_in *fri, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent); -int fuse_rename_backing(struct fuse_args *fa, +int fuse_rename_backing(struct fuse_bpf_args *fa, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent); -void *fuse_rename_finalize(struct fuse_args *fa, +void *fuse_rename_finalize(struct fuse_bpf_args *fa, struct inode *olddir, struct dentry *oldent, struct inode *newdir, struct dentry *newent); int fuse_unlink_initialize( - struct fuse_args *fa, struct fuse_dummy_io *fmi, + struct fuse_bpf_args *fa, struct fuse_dummy_io *fmi, struct inode *dir, struct dentry *entry); int fuse_unlink_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry); void *fuse_unlink_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry); -int fuse_link_initialize(struct fuse_args *fa, struct fuse_link_in *fli, +int fuse_link_initialize(struct fuse_bpf_args *fa, struct fuse_link_in *fli, struct dentry *entry, struct inode *dir, struct dentry *newent); -int fuse_link_backing(struct fuse_args *fa, struct dentry *entry, +int fuse_link_backing(struct fuse_bpf_args *fa, struct dentry *entry, struct inode *dir, struct dentry *newent); -void *fuse_link_finalize(struct fuse_args *fa, struct dentry *entry, +void *fuse_link_finalize(struct fuse_bpf_args *fa, struct dentry *entry, struct inode *dir, struct dentry *newent); -int fuse_release_initialize(struct fuse_args *fa, struct fuse_release_in *fri, +int fuse_release_initialize(struct fuse_bpf_args *fa, struct fuse_release_in *fri, struct inode *inode, struct file *file); -int fuse_releasedir_initialize(struct fuse_args *fa, +int fuse_releasedir_initialize(struct fuse_bpf_args *fa, struct fuse_release_in *fri, struct inode *inode, struct file *file); -int fuse_release_backing(struct fuse_args *fa, +int fuse_release_backing(struct fuse_bpf_args *fa, struct inode *inode, struct file *file); -void *fuse_release_finalize(struct fuse_args *fa, +void *fuse_release_finalize(struct fuse_bpf_args *fa, struct inode *inode, struct file *file); -int fuse_flush_initialize(struct fuse_args *fa, struct fuse_flush_in *ffi, +int fuse_flush_initialize(struct fuse_bpf_args *fa, struct fuse_flush_in *ffi, struct file *file, fl_owner_t id); -int fuse_flush_backing(struct fuse_args *fa, struct file *file, fl_owner_t id); -void *fuse_flush_finalize(struct fuse_args *fa, +int fuse_flush_backing(struct fuse_bpf_args *fa, struct file *file, fl_owner_t id); +void *fuse_flush_finalize(struct fuse_bpf_args *fa, struct file *file, fl_owner_t id); struct fuse_lseek_io { @@ -1432,37 +1468,37 @@ struct fuse_lseek_io { struct fuse_lseek_out flo; }; -int fuse_lseek_initialize(struct fuse_args *fa, struct fuse_lseek_io *fli, +int fuse_lseek_initialize(struct fuse_bpf_args *fa, struct fuse_lseek_io *fli, struct file *file, loff_t offset, int whence); -int fuse_lseek_backing(struct fuse_args *fa, struct file *file, loff_t offset, int whence); -void *fuse_lseek_finalize(struct fuse_args *fa, struct file *file, loff_t offset, int whence); +int fuse_lseek_backing(struct fuse_bpf_args *fa, struct file *file, loff_t offset, int whence); +void *fuse_lseek_finalize(struct fuse_bpf_args *fa, struct file *file, loff_t offset, int whence); struct fuse_copy_file_range_io { struct fuse_copy_file_range_in fci; struct fuse_write_out fwo; }; -int fuse_copy_file_range_initialize(struct fuse_args *fa, +int fuse_copy_file_range_initialize(struct fuse_bpf_args *fa, struct fuse_copy_file_range_io *fcf, struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t len, unsigned int flags); -int fuse_copy_file_range_backing(struct fuse_args *fa, +int fuse_copy_file_range_backing(struct fuse_bpf_args *fa, struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t len, unsigned int flags); -void *fuse_copy_file_range_finalize(struct fuse_args *fa, +void *fuse_copy_file_range_finalize(struct fuse_bpf_args *fa, struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t len, unsigned int flags); -int fuse_fsync_initialize(struct fuse_args *fa, struct fuse_fsync_in *ffi, +int fuse_fsync_initialize(struct fuse_bpf_args *fa, struct fuse_fsync_in *ffi, struct file *file, loff_t start, loff_t end, int datasync); -int fuse_fsync_backing(struct fuse_args *fa, +int fuse_fsync_backing(struct fuse_bpf_args *fa, struct file *file, loff_t start, loff_t end, int datasync); -void *fuse_fsync_finalize(struct fuse_args *fa, +void *fuse_fsync_finalize(struct fuse_bpf_args *fa, struct file *file, loff_t start, loff_t end, int datasync); -int fuse_dir_fsync_initialize(struct fuse_args *fa, struct fuse_fsync_in *ffi, +int fuse_dir_fsync_initialize(struct fuse_bpf_args *fa, struct fuse_fsync_in *ffi, struct file *file, loff_t start, loff_t end, int datasync); struct fuse_getxattr_io { @@ -1471,43 +1507,43 @@ struct fuse_getxattr_io { }; int fuse_getxattr_initialize( - struct fuse_args *fa, struct fuse_getxattr_io *fgio, + struct fuse_bpf_args *fa, struct fuse_getxattr_io *fgio, struct dentry *dentry, const char *name, void *value, size_t size); int fuse_getxattr_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct dentry *dentry, const char *name, void *value, size_t size); void *fuse_getxattr_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct dentry *dentry, const char *name, void *value, size_t size); -int fuse_listxattr_initialize(struct fuse_args *fa, +int fuse_listxattr_initialize(struct fuse_bpf_args *fa, struct fuse_getxattr_io *fgio, struct dentry *dentry, char *list, size_t size); -int fuse_listxattr_backing(struct fuse_args *fa, struct dentry *dentry, +int fuse_listxattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, char *list, size_t size); -void *fuse_listxattr_finalize(struct fuse_args *fa, struct dentry *dentry, +void *fuse_listxattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, char *list, size_t size); -int fuse_setxattr_initialize(struct fuse_args *fa, +int fuse_setxattr_initialize(struct fuse_bpf_args *fa, struct fuse_setxattr_in *fsxi, struct dentry *dentry, const char *name, const void *value, size_t size, int flags); -int fuse_setxattr_backing(struct fuse_args *fa, struct dentry *dentry, +int fuse_setxattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name, const void *value, size_t size, int flags); -void *fuse_setxattr_finalize(struct fuse_args *fa, struct dentry *dentry, +void *fuse_setxattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name, const void *value, size_t size, int flags); -int fuse_removexattr_initialize(struct fuse_args *fa, +int fuse_removexattr_initialize(struct fuse_bpf_args *fa, struct fuse_dummy_io *unused, struct dentry *dentry, const char *name); -int fuse_removexattr_backing(struct fuse_args *fa, +int fuse_removexattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name); -void *fuse_removexattr_finalize(struct fuse_args *fa, +void *fuse_removexattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, const char *name); struct fuse_read_iter_out { @@ -1519,11 +1555,11 @@ struct fuse_file_read_iter_io { }; int fuse_file_read_iter_initialize( - struct fuse_args *fa, struct fuse_file_read_iter_io *fri, + struct fuse_bpf_args *fa, struct fuse_file_read_iter_io *fri, struct kiocb *iocb, struct iov_iter *to); -int fuse_file_read_iter_backing(struct fuse_args *fa, +int fuse_file_read_iter_backing(struct fuse_bpf_args *fa, struct kiocb *iocb, struct iov_iter *to); -void *fuse_file_read_iter_finalize(struct fuse_args *fa, +void *fuse_file_read_iter_finalize(struct fuse_bpf_args *fa, struct kiocb *iocb, struct iov_iter *to); struct fuse_write_iter_out { @@ -1536,21 +1572,21 @@ struct fuse_file_write_iter_io { }; int fuse_file_write_iter_initialize( - struct fuse_args *fa, struct fuse_file_write_iter_io *fwio, + struct fuse_bpf_args *fa, struct fuse_file_write_iter_io *fwio, struct kiocb *iocb, struct iov_iter *from); -int fuse_file_write_iter_backing(struct fuse_args *fa, +int fuse_file_write_iter_backing(struct fuse_bpf_args *fa, struct kiocb *iocb, struct iov_iter *from); -void *fuse_file_write_iter_finalize(struct fuse_args *fa, +void *fuse_file_write_iter_finalize(struct fuse_bpf_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, +int fuse_file_fallocate_initialize(struct fuse_bpf_args *fa, struct fuse_fallocate_in *ffi, struct file *file, int mode, loff_t offset, loff_t length); -int fuse_file_fallocate_backing(struct fuse_args *fa, +int fuse_file_fallocate_backing(struct fuse_bpf_args *fa, struct file *file, int mode, loff_t offset, loff_t length); -void *fuse_file_fallocate_finalize(struct fuse_args *fa, +void *fuse_file_fallocate_finalize(struct fuse_bpf_args *fa, struct file *file, int mode, loff_t offset, loff_t length); struct fuse_lookup_io { @@ -1558,24 +1594,24 @@ struct fuse_lookup_io { struct fuse_entry_bpf feb; }; -int fuse_lookup_initialize(struct fuse_args *fa, struct fuse_lookup_io *feo, +int fuse_lookup_initialize(struct fuse_bpf_args *fa, struct fuse_lookup_io *feo, struct inode *dir, struct dentry *entry, unsigned int flags); -int fuse_lookup_backing(struct fuse_args *fa, struct inode *dir, +int fuse_lookup_backing(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags); -struct dentry *fuse_lookup_finalize(struct fuse_args *fa, struct inode *dir, +struct dentry *fuse_lookup_finalize(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags); -int fuse_revalidate_backing(struct fuse_args *fa, struct inode *dir, +int fuse_revalidate_backing(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags); -void *fuse_revalidate_finalize(struct fuse_args *fa, struct inode *dir, +void *fuse_revalidate_finalize(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, unsigned int flags); -int fuse_canonical_path_initialize(struct fuse_args *fa, +int fuse_canonical_path_initialize(struct fuse_bpf_args *fa, struct fuse_dummy_io *fdi, const struct path *path, struct path *canonical_path); -int fuse_canonical_path_backing(struct fuse_args *fa, const struct path *path, +int fuse_canonical_path_backing(struct fuse_bpf_args *fa, const struct path *path, struct path *canonical_path); -void *fuse_canonical_path_finalize(struct fuse_args *fa, +void *fuse_canonical_path_finalize(struct fuse_bpf_args *fa, const struct path *path, struct path *canonical_path); @@ -1583,13 +1619,13 @@ struct fuse_getattr_io { struct fuse_getattr_in fgi; struct fuse_attr_out fao; }; -int fuse_getattr_initialize(struct fuse_args *fa, struct fuse_getattr_io *fgio, +int fuse_getattr_initialize(struct fuse_bpf_args *fa, struct fuse_getattr_io *fgio, const struct dentry *entry, struct kstat *stat, u32 request_mask, unsigned int flags); -int fuse_getattr_backing(struct fuse_args *fa, +int fuse_getattr_backing(struct fuse_bpf_args *fa, const struct dentry *entry, struct kstat *stat, u32 request_mask, unsigned int flags); -void *fuse_getattr_finalize(struct fuse_args *fa, +void *fuse_getattr_finalize(struct fuse_bpf_args *fa, const struct dentry *entry, struct kstat *stat, u32 request_mask, unsigned int flags); @@ -1598,38 +1634,38 @@ struct fuse_setattr_io { struct fuse_attr_out fao; }; -int fuse_setattr_initialize(struct fuse_args *fa, struct fuse_setattr_io *fsi, +int fuse_setattr_initialize(struct fuse_bpf_args *fa, struct fuse_setattr_io *fsi, struct dentry *dentry, struct iattr *attr, struct file *file); -int fuse_setattr_backing(struct fuse_args *fa, +int fuse_setattr_backing(struct fuse_bpf_args *fa, struct dentry *dentry, struct iattr *attr, struct file *file); -void *fuse_setattr_finalize(struct fuse_args *fa, +void *fuse_setattr_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, struct iattr *attr, struct file *file); -int fuse_statfs_initialize(struct fuse_args *fa, struct fuse_statfs_out *fso, +int fuse_statfs_initialize(struct fuse_bpf_args *fa, struct fuse_statfs_out *fso, struct dentry *dentry, struct kstatfs *buf); -int fuse_statfs_backing(struct fuse_args *fa, +int fuse_statfs_backing(struct fuse_bpf_args *fa, struct dentry *dentry, struct kstatfs *buf); -void *fuse_statfs_finalize(struct fuse_args *fa, +void *fuse_statfs_finalize(struct fuse_bpf_args *fa, struct dentry *dentry, struct kstatfs *buf); -int fuse_get_link_initialize(struct fuse_args *fa, struct fuse_dummy_io *dummy, +int fuse_get_link_initialize(struct fuse_bpf_args *fa, struct fuse_dummy_io *dummy, struct inode *inode, struct dentry *dentry, struct delayed_call *callback, const char **out); -int fuse_get_link_backing(struct fuse_args *fa, +int fuse_get_link_backing(struct fuse_bpf_args *fa, struct inode *inode, struct dentry *dentry, struct delayed_call *callback, const char **out); -void *fuse_get_link_finalize(struct fuse_args *fa, +void *fuse_get_link_finalize(struct fuse_bpf_args *fa, struct inode *inode, struct dentry *dentry, struct delayed_call *callback, const char **out); int fuse_symlink_initialize( - struct fuse_args *fa, struct fuse_dummy_io *unused, + struct fuse_bpf_args *fa, struct fuse_dummy_io *unused, struct inode *dir, struct dentry *entry, const char *link, int len); int fuse_symlink_backing( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, const char *link, int len); void *fuse_symlink_finalize( - struct fuse_args *fa, + struct fuse_bpf_args *fa, struct inode *dir, struct dentry *entry, const char *link, int len); struct fuse_read_io { @@ -1637,20 +1673,20 @@ struct fuse_read_io { struct fuse_read_out fro; }; -int fuse_readdir_initialize(struct fuse_args *fa, struct fuse_read_io *frio, +int fuse_readdir_initialize(struct fuse_bpf_args *fa, struct fuse_read_io *frio, struct file *file, struct dir_context *ctx, bool *force_again, bool *allow_force, bool is_continued); -int fuse_readdir_backing(struct fuse_args *fa, +int fuse_readdir_backing(struct fuse_bpf_args *fa, struct file *file, struct dir_context *ctx, bool *force_again, bool *allow_force, bool is_continued); -void *fuse_readdir_finalize(struct fuse_args *fa, +void *fuse_readdir_finalize(struct fuse_bpf_args *fa, struct file *file, struct dir_context *ctx, bool *force_again, bool *allow_force, bool is_continued); -int fuse_access_initialize(struct fuse_args *fa, struct fuse_access_in *fai, +int fuse_access_initialize(struct fuse_bpf_args *fa, struct fuse_access_in *fai, struct inode *inode, int mask); -int fuse_access_backing(struct fuse_args *fa, struct inode *inode, int mask); -void *fuse_access_finalize(struct fuse_args *fa, struct inode *inode, int mask); +int fuse_access_backing(struct fuse_bpf_args *fa, struct inode *inode, int mask); +void *fuse_access_finalize(struct fuse_bpf_args *fa, struct inode *inode, int mask); /* * FUSE caches dentries and attributes with separate timeout. The @@ -1789,16 +1825,18 @@ struct fuse_err_ret { int __init fuse_bpf_init(void); void __exit fuse_bpf_cleanup(void); +ssize_t fuse_bpf_simple_request(struct fuse_mount *fm, struct fuse_bpf_args *args); + /* * expression statement to wrap the backing filter logic * struct inode *inode: inode with bpf and backing inode * typedef io: (typically complex) type whose components fuse_args can point to. * An instance of this type is created locally and passed to initialize - * void initialize(struct fuse_args *fa, io *in_out, args...): function that sets + * void initialize(struct fuse_bpf_args *fa, io *in_out, args...): function that sets * up fa and io based on args - * int backing(struct fuse_args *fa, args...): function that actually performs + * int backing(struct fuse_bpf_args *fa, args...): function that actually performs * the backing io operation - * void *finalize(struct fuse_args *, args...): function that performs any final + * void *finalize(struct fuse_bpf_args *, args...): function that performs any final * work needed to commit the backing io */ #define fuse_bpf_backing(inode, io, initialize, backing, finalize, \ @@ -1809,7 +1847,7 @@ void __exit fuse_bpf_cleanup(void); struct fuse_inode *fuse_inode = get_fuse_inode(inode); \ struct fuse_mount *fm = get_fuse_mount(inode); \ io feo = {0}; \ - struct fuse_args fa = {0}, fa_backup = {0}; \ + struct fuse_bpf_args fa = {0}, fa_backup = {0}; \ bool locked; \ ssize_t res; \ void *err; \ @@ -1833,7 +1871,7 @@ void __exit fuse_bpf_cleanup(void); fa_backup = fa; \ fa.opcode |= FUSE_PREFILTER; \ for (i = 0; i < fa.in_numargs; ++i) \ - fa.out_args[i] = (struct fuse_arg) { \ + fa.out_args[i] = (struct fuse_bpf_arg) { \ .size = fa.in_args[i].size, \ .value = (void *)fa.in_args[i].value, \ }; \ @@ -1852,7 +1890,7 @@ void __exit fuse_bpf_cleanup(void); \ if (ext_flags & FUSE_BPF_USER_FILTER) { \ locked = fuse_lock_inode(inode); \ - res = fuse_simple_request(fm, &fa); \ + res = fuse_bpf_simple_request(fm, &fa); \ fuse_unlock_inode(inode, locked); \ if (res < 0) { \ fer = (struct fuse_err_ret) { \ @@ -1868,12 +1906,12 @@ void __exit fuse_bpf_cleanup(void); \ fa.opcode &= ~FUSE_PREFILTER; \ for (i = 0; i < fa.in_numargs; ++i) \ - fa.in_args[i] = (struct fuse_in_arg) { \ + fa.in_args[i] = (struct fuse_bpf_in_arg) { \ .size = fa.out_args[i].size, \ .value = fa.out_args[i].value, \ }; \ - for (i = 0; i < fa.out_numargs; ++i) \ - fa.out_args[i] = (struct fuse_arg) { \ + for (i = 0; i < fa_backup.out_numargs; ++i) \ + fa.out_args[i] = (struct fuse_bpf_arg) { \ .size = fa_backup.out_args[i].size, \ .value = fa_backup.out_args[i].value, \ }; \ @@ -1891,7 +1929,7 @@ void __exit fuse_bpf_cleanup(void); fa.opcode |= FUSE_POSTFILTER; \ for (i = 0; i < fa.out_numargs; ++i) \ fa.in_args[fa.in_numargs++] = \ - (struct fuse_in_arg) { \ + (struct fuse_bpf_in_arg) { \ .size = fa.out_args[i].size, \ .value = fa.out_args[i].value, \ }; \ @@ -1910,7 +1948,7 @@ void __exit fuse_bpf_cleanup(void); fa.out_args[1].size = fa_backup.out_args[1].size; \ fa.out_numargs = fa_backup.out_numargs; \ locked = fuse_lock_inode(inode); \ - res = fuse_simple_request(fm, &fa); \ + res = fuse_bpf_simple_request(fm, &fa); \ fuse_unlock_inode(inode, locked); \ if (res < 0) { \ fer.result = ERR_PTR(res); \ diff --git a/include/linux/bpf_types.h b/include/linux/bpf_types.h index eaddb8d8365b..2d8b63574aa8 100644 --- a/include/linux/bpf_types.h +++ b/include/linux/bpf_types.h @@ -78,7 +78,7 @@ BPF_PROG_TYPE(BPF_PROG_TYPE_LSM, lsm, #endif /* CONFIG_BPF_LSM */ #endif #ifdef CONFIG_FUSE_BPF -BPF_PROG_TYPE(BPF_PROG_TYPE_FUSE, fuse, struct fuse_args, struct fuse_args) +BPF_PROG_TYPE(BPF_PROG_TYPE_FUSE, fuse, struct fuse_bpf_args, struct fuse_bpf_args) #endif BPF_MAP_TYPE(BPF_MAP_TYPE_ARRAY, array_map_ops) diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h index a0c34ffc97fe..f0521a39a586 100644 --- a/include/uapi/linux/fuse.h +++ b/include/uapi/linux/fuse.h @@ -965,42 +965,44 @@ struct fuse_removemapping_one { #define FUSE_REMOVEMAPPING_MAX_ENTRY \ (PAGE_SIZE / sizeof(struct fuse_removemapping_one)) -struct fuse_mount; +/* + * Fuse BPF Args + * + * Used to communicate with bpf programs to allow checking or altering certain values. + * The end_offset allows the bpf verifier to check boundaries statically. This reflects + * the ends of the buffer. size shows the length that was actually used. + * + */ /** One input argument of a request */ -struct fuse_in_arg { - unsigned size; +struct fuse_bpf_in_arg { + uint32_t size; const void *value; + const void *end_offset; }; /** One output argument of a request */ -struct fuse_arg { - unsigned size; +struct fuse_bpf_arg { + uint32_t size; void *value; + void *end_offset; }; -struct fuse_args { +#define FUSE_MAX_IN_ARGS 5 +#define FUSE_MAX_OUT_ARGS 3 + +#define FUSE_BPF_FORCE (1 << 0) +#define FUSE_BPF_OUT_ARGVAR (1 << 6) + +struct fuse_bpf_args { uint64_t nodeid; uint32_t opcode; uint32_t error_in; - unsigned short in_numargs; - unsigned short out_numargs; - bool force:1; - bool noreply:1; - bool nocreds:1; - bool in_pages:1; - bool out_pages:1; - bool user_pages:1; - bool out_argvar:1; - bool page_zeroing:1; - bool page_replace:1; - bool may_block:1; - struct fuse_in_arg in_args[5]; - struct fuse_arg out_args[3]; - void (*end)(struct fuse_mount *fm, struct fuse_args *args, int error); - - /* Path used for completing d_canonical_path */ - struct path *canonical_path; + uint32_t in_numargs; + uint32_t out_numargs; + uint32_t flags; + struct fuse_bpf_in_arg in_args[FUSE_MAX_IN_ARGS]; + struct fuse_bpf_arg out_args[FUSE_MAX_OUT_ARGS]; }; #define FUSE_BPF_USER_FILTER 1 diff --git a/kernel/bpf/bpf_fuse.c b/kernel/bpf/bpf_fuse.c index 2a4db5ce06b4..00738c84b76e 100644 --- a/kernel/bpf/bpf_fuse.c +++ b/kernel/bpf/bpf_fuse.c @@ -36,12 +36,12 @@ static bool fuse_prog_is_valid_access(int off, int size, { int i; - if (off < 0 || off > offsetofend(struct fuse_args, out_args)) + if (off < 0 || off > offsetofend(struct fuse_bpf_args, out_args)) return false; /* TODO This is garbage. Do it properly */ for (i = 0; i < 5; i++) { - if (off == offsetof(struct fuse_args, in_args[i].value)) { + if (off == offsetof(struct fuse_bpf_args, in_args[i].value)) { info->reg_type = PTR_TO_RDONLY_BUF; info->ctx_field_size = 256; if (type != BPF_READ) @@ -50,7 +50,7 @@ static bool fuse_prog_is_valid_access(int off, int size, } } for (i = 0; i < 3; i++) { - if (off == offsetof(struct fuse_args, out_args[i].value)) { + if (off == offsetof(struct fuse_bpf_args, out_args[i].value)) { info->reg_type = PTR_TO_RDWR_BUF; info->ctx_field_size = 256; return true;