blob: 0ebb3915dfae62a82e9a6d56a4372120dd169d89 [file] [log] [blame]
Paul Lawrence5bb6bb92021-11-09 16:33:29 +00001/*
2 * fuse_media eBPF program
3 *
4 * Copyright (C) 2021 Google
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version
8 * 2 as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 */
16
17#include <bpf_helpers.h>
18
19#include <stdint.h>
20
21#define __KERNEL__
22#include <fuse_kernel.h>
23
24#define bpf_printk(fmt, ...) \
25 ({ \
26 char ____fmt[] = fmt; \
27 bpf_trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__); \
28 })
29
30DEFINE_BPF_PROG("fuse/media", AID_ROOT, AID_MEDIA_RW, fuse_media)
31(struct fuse_args* fa) {
32 switch (fa->opcode) {
Alessio Balsini41fe8012022-03-15 11:06:45 +000033 case FUSE_LOOKUP | FUSE_PREFILTER: {
34 const char* name = fa->in_args[0].value;
35
Alessio Balsini3f3c5c92022-03-15 11:14:34 +000036 bpf_printk("LOOKUP: %lx %s", fa->nodeid, name);
Alessio Balsini41fe8012022-03-15 11:06:45 +000037 if (fa->nodeid == 1)
38 return FUSE_BPF_USER_FILTER | FUSE_BPF_BACKING;
39 else
40 return FUSE_BPF_BACKING;
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000041 }
42
Alessio Balsini41fe8012022-03-15 11:06:45 +000043 /* FUSE_FORGET */
44
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000045 case FUSE_GETATTR | FUSE_PREFILTER: {
46 const struct fuse_getattr_in* fgi = fa->in_args[0].value;
47
Alessio Balsini3f3c5c92022-03-15 11:14:34 +000048 bpf_printk("GETATTR: %d", fgi->fh);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000049 return FUSE_BPF_BACKING;
50 }
51
52 case FUSE_SETATTR | FUSE_PREFILTER: {
53 const struct fuse_setattr_in* fsi = fa->in_args[0].value;
54
Alessio Balsini3f3c5c92022-03-15 11:14:34 +000055 bpf_printk("SETATTR: %d", fsi->fh);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000056 return FUSE_BPF_BACKING;
57 }
58
Alessio Balsini41fe8012022-03-15 11:06:45 +000059 /* FUSE_READLINK */
60 /* FUSE_SYMLINK */
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000061
62 case FUSE_MKNOD | FUSE_PREFILTER: {
63 const struct fuse_mknod_in* fmi = fa->in_args[0].value;
64 const char* name = fa->in_args[1].value;
65
Alessio Balsini3f3c5c92022-03-15 11:14:34 +000066 bpf_printk("MKNOD: %s %x %x", name, fmi->rdev | fmi->mode, fmi->umask);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000067 return FUSE_BPF_BACKING;
68 }
69
70 case FUSE_MKDIR | FUSE_PREFILTER: {
71 const struct fuse_mkdir_in* fmi = fa->in_args[0].value;
72 const char* name = fa->in_args[1].value;
73
Alessio Balsini3f3c5c92022-03-15 11:14:34 +000074 bpf_printk("MKDIR: %s %x %x", name, fmi->mode, fmi->umask);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000075 return FUSE_BPF_BACKING;
76 }
77
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000078 case FUSE_UNLINK | FUSE_PREFILTER: {
79 const char* name = fa->in_args[0].value;
80
Alessio Balsini3f3c5c92022-03-15 11:14:34 +000081 bpf_printk("UNLINK: %s", name);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +000082 return FUSE_BPF_BACKING;
83 }
84
Alessio Balsini41fe8012022-03-15 11:06:45 +000085 case FUSE_RMDIR | FUSE_PREFILTER: {
86 const char* name = fa->in_args[0].value;
87
Alessio Balsini3f3c5c92022-03-15 11:14:34 +000088 bpf_printk("RMDIR: %s", name);
Alessio Balsini41fe8012022-03-15 11:06:45 +000089 return FUSE_BPF_BACKING;
90 }
91
Alessio Balsini6def1942022-03-15 10:44:09 +000092 case FUSE_RENAME | FUSE_PREFILTER: {
93 const char* name_old = fa->in_args[1].value;
94 const char* name_new = fa->in_args[2].value;
95
96 bpf_printk("RENAME: %s to %s", name_old, name_new);
97 return FUSE_BPF_BACKING;
98 }
Alessio Balsini41fe8012022-03-15 11:06:45 +000099
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000100 case FUSE_LINK | FUSE_PREFILTER: {
101 const struct fuse_link_in* fli = fa->in_args[0].value;
102 const char* dst_name = fa->in_args[1].value;
103
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000104 bpf_printk("LINK: %d %s", fli->oldnodeid, dst_name);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000105 return FUSE_BPF_BACKING;
106 }
107
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000108 case FUSE_OPEN | FUSE_PREFILTER: {
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000109 bpf_printk("OPEN: %d", fa->nodeid);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000110 return FUSE_BPF_BACKING;
111 }
112
113 case FUSE_READ | FUSE_PREFILTER: {
114 const struct fuse_read_in* fri = fa->in_args[0].value;
115
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000116 bpf_printk("READ: fh: %lu, offset %lu, size %lu", fri->fh, fri->offset, fri->size);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000117 return FUSE_BPF_BACKING;
118 }
119
120 case FUSE_WRITE | FUSE_PREFILTER: {
121 const struct fuse_write_in* fwi = fa->in_args[0].value;
122
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000123 bpf_printk("WRITE: fh: %lu, offset %lu, size %lu", fwi->fh, fwi->offset, fwi->size);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000124 return FUSE_BPF_BACKING;
125 }
126
Alessio Balsini41fe8012022-03-15 11:06:45 +0000127 /* FUSE_STATFS */
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000128
Alessio Balsini41fe8012022-03-15 11:06:45 +0000129 case FUSE_RELEASE | FUSE_PREFILTER: {
130 const struct fuse_release_in* fri = fa->in_args[0].value;
131
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000132 bpf_printk("RELEASE: %d", fri->fh);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000133 return FUSE_BPF_BACKING;
134 }
135
Alessio Balsini41fe8012022-03-15 11:06:45 +0000136 /* FUSE_FSYNC */
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000137
Alessio Balsini41fe8012022-03-15 11:06:45 +0000138 case FUSE_SETXATTR | FUSE_PREFILTER: {
139 const char* name = fa->in_args[1].value;
140
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000141 bpf_printk("SETXATTR: %d %s", fa->nodeid, name);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000142 return FUSE_BPF_BACKING;
143 }
144
145 case FUSE_GETXATTR | FUSE_PREFILTER: {
146 const char* name = fa->in_args[1].value;
147
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000148 bpf_printk("GETXATTR: %d %s", fa->nodeid, name);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000149 return FUSE_BPF_BACKING;
150 }
151
152 case FUSE_LISTXATTR | FUSE_PREFILTER: {
153 const char* name = fa->in_args[1].value;
154
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000155 bpf_printk("LISTXATTR: %d %s", fa->nodeid, name);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000156 return FUSE_BPF_BACKING;
157 }
158
Alessio Balsini41fe8012022-03-15 11:06:45 +0000159 /* FUSE_REMOVEXATTR */
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000160
Alessio Balsini41fe8012022-03-15 11:06:45 +0000161 case FUSE_FLUSH | FUSE_PREFILTER: {
162 const struct fuse_flush_in* ffi = fa->in_args[0].value;
163
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000164 bpf_printk("FLUSH: %d", ffi->fh);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000165 return FUSE_BPF_BACKING;
166 }
167
Alessio Balsini41fe8012022-03-15 11:06:45 +0000168 /* FUSE_INIT */
169
170 case FUSE_OPENDIR | FUSE_PREFILTER: {
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000171 bpf_printk("OPENDIR: %d", fa->nodeid);
Alessio Balsini41fe8012022-03-15 11:06:45 +0000172 return FUSE_BPF_BACKING;
173 }
174
175 case FUSE_READDIR | FUSE_PREFILTER: {
176 const struct fuse_read_in* fri = fa->in_args[0].value;
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000177 bpf_printk("READDIR: fh: %lu", fri->fh, fri->offset);
Alessio Balsini41fe8012022-03-15 11:06:45 +0000178 return FUSE_BPF_BACKING;
179 }
180
181 case FUSE_RELEASEDIR | FUSE_PREFILTER: {
182 const struct fuse_release_in* fri = fa->in_args[0].value;
183
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000184 bpf_printk("RELEASEDIR: %d", fri->fh);
Alessio Balsini41fe8012022-03-15 11:06:45 +0000185 return FUSE_BPF_BACKING;
186 }
187
188 /* FUSE_FSYNCDIR */
189 /* FUSE_GETLK */
190 /* FUSE_SETLK */
191 /* FUSE_SETLKW */
192
193 case FUSE_ACCESS | FUSE_PREFILTER: {
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000194 bpf_printk("ACCESS: %d", fa->nodeid);
Alessio Balsini41fe8012022-03-15 11:06:45 +0000195 return FUSE_BPF_BACKING;
196 }
197
198 case FUSE_CREATE | FUSE_PREFILTER: {
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000199 bpf_printk("CREATE: %s", fa->in_args[1].value);
Alessio Balsini41fe8012022-03-15 11:06:45 +0000200 return FUSE_BPF_BACKING;
201 }
202
203 /* FUSE_INTERRUPT */
204 /* FUSE_BMAP */
205 /* FUSE_DESTROY */
206 /* FUSE_IOCTL */
207 /* FUSE_POLL */
208 /* FUSE_NOTIFY_REPLY */
209 /* FUSE_BATCH_FORGET */
210
211 case FUSE_FALLOCATE | FUSE_PREFILTER: {
212 const struct fuse_fallocate_in* ffa = fa->in_args[0].value;
213
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000214 bpf_printk("FALLOCATE: %d %lu", ffa->fh, ffa->length);
Alessio Balsini41fe8012022-03-15 11:06:45 +0000215 return FUSE_BPF_BACKING;
216 }
217
218 /* FUSE_READDIRPLUS */
219 /* FUSE_RENAME2 */
220 /* FUSE_LSEEK */
221 /* FUSE_COPY_FILE_RANGE */
222 /* CUSE_INIT */
223
Alessio Balsinib7d120d2022-01-22 12:31:32 +0000224 case FUSE_CANONICAL_PATH | FUSE_PREFILTER: {
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000225 bpf_printk("CANONICAL_PATH: %d", fa->nodeid);
Alessio Balsinib7d120d2022-01-22 12:31:32 +0000226 return FUSE_BPF_BACKING;
227 }
228
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000229 default:
230 if (fa->opcode & FUSE_PREFILTER)
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000231 bpf_printk("Prefilter *** UNKNOWN *** opcode: %d", fa->opcode & FUSE_OPCODE_FILTER);
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000232 else if (fa->opcode & FUSE_POSTFILTER)
Alessio Balsini3f3c5c92022-03-15 11:14:34 +0000233 bpf_printk("Postfilter *** UNKNOWN *** opcode: %d",
Paul Lawrence5bb6bb92021-11-09 16:33:29 +0000234 fa->opcode & FUSE_OPCODE_FILTER);
235 else
236 bpf_printk("*** UNKNOWN *** opcode: %d", fa->opcode);
237 return FUSE_BPF_BACKING;
238 }
239}
240
241LICENSE("GPL");