/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause WITH Linux-syscall-note */ /* Copyright (c) 2022 Google LLC */ #ifndef _LINUX_ANDROID_FUSE_H #define _LINUX_ANDROID_FUSE_H #ifdef __KERNEL__ #include #else #include #endif #define FUSE_ACTION_KEEP 0 #define FUSE_ACTION_REMOVE 1 #define FUSE_ACTION_REPLACE 2 struct fuse_entry_bpf_out { uint64_t backing_action; uint64_t backing_fd; uint64_t bpf_action; uint64_t bpf_fd; }; struct fuse_entry_bpf { struct fuse_entry_bpf_out out; struct file *backing_file; struct file *bpf_file; }; struct fuse_read_out { uint64_t offset; uint32_t again; uint32_t padding; }; struct fuse_in_postfilter_header { uint32_t len; uint32_t opcode; uint64_t unique; uint64_t nodeid; uint32_t uid; uint32_t gid; uint32_t pid; uint32_t error_in; }; /* * 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_bpf_in_arg { uint32_t size; uint32_t padding; union { const void *value; uint64_t padding2; }; union { const void *end_offset; uint64_t padding3; }; }; /** One output argument of a request */ struct fuse_bpf_arg { uint32_t size; uint32_t padding; union { void *value; uint64_t padding2; }; union { void *end_offset; uint64_t padding3; }; }; #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; uint32_t in_numargs; uint32_t out_numargs; uint32_t flags; uint32_t padding; 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 #define FUSE_BPF_BACKING 2 #define FUSE_BPF_POST_FILTER 4 #define FUSE_OPCODE_FILTER 0x0ffff #define FUSE_PREFILTER 0x10000 #define FUSE_POSTFILTER 0x20000 struct bpf_prog *fuse_get_bpf_prog(struct file *file); #endif /* _LINUX_ANDROID_FUSE_H */