xref: /dflybsd-src/sys/vfs/fuse/fuse_util.c (revision 5812c3cc7f8e910251a2cf4e78242f0b11a5fb4d)
1*5812c3ccSTomohiro Kusumi /*-
2*5812c3ccSTomohiro Kusumi  * Copyright (c) 2019 Tomohiro Kusumi <tkusumi@netbsd.org>
3*5812c3ccSTomohiro Kusumi  * Copyright (c) 2019 The DragonFly Project
4*5812c3ccSTomohiro Kusumi  * All rights reserved.
5*5812c3ccSTomohiro Kusumi  *
6*5812c3ccSTomohiro Kusumi  * Redistribution and use in source and binary forms, with or without
7*5812c3ccSTomohiro Kusumi  * modification, are permitted provided that the following conditions
8*5812c3ccSTomohiro Kusumi  * are met:
9*5812c3ccSTomohiro Kusumi  * 1. Redistributions of source code must retain the above copyright
10*5812c3ccSTomohiro Kusumi  *    notice, this list of conditions and the following disclaimer.
11*5812c3ccSTomohiro Kusumi  * 2. Redistributions in binary form must reproduce the above copyright
12*5812c3ccSTomohiro Kusumi  *    notice, this list of conditions and the following disclaimer in the
13*5812c3ccSTomohiro Kusumi  *    documentation and/or other materials provided with the distribution.
14*5812c3ccSTomohiro Kusumi  *
15*5812c3ccSTomohiro Kusumi  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*5812c3ccSTomohiro Kusumi  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*5812c3ccSTomohiro Kusumi  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*5812c3ccSTomohiro Kusumi  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*5812c3ccSTomohiro Kusumi  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*5812c3ccSTomohiro Kusumi  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*5812c3ccSTomohiro Kusumi  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*5812c3ccSTomohiro Kusumi  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*5812c3ccSTomohiro Kusumi  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*5812c3ccSTomohiro Kusumi  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*5812c3ccSTomohiro Kusumi  * SUCH DAMAGE.
26*5812c3ccSTomohiro Kusumi  */
27*5812c3ccSTomohiro Kusumi 
28*5812c3ccSTomohiro Kusumi #include "fuse.h"
29*5812c3ccSTomohiro Kusumi 
30*5812c3ccSTomohiro Kusumi void
31*5812c3ccSTomohiro Kusumi fuse_hexdump(const char *p, size_t len)
32*5812c3ccSTomohiro Kusumi {
33*5812c3ccSTomohiro Kusumi 	int i;
34*5812c3ccSTomohiro Kusumi 
35*5812c3ccSTomohiro Kusumi 	if (!fuse_debug)
36*5812c3ccSTomohiro Kusumi 		return;
37*5812c3ccSTomohiro Kusumi 
38*5812c3ccSTomohiro Kusumi 	for (i = 0; i < (int)len; i++) {
39*5812c3ccSTomohiro Kusumi 		kprintf("%02X ", p[i] & 0xff);
40*5812c3ccSTomohiro Kusumi 		if ((i + 1) % 32 == 0)
41*5812c3ccSTomohiro Kusumi 			kprintf("\n");
42*5812c3ccSTomohiro Kusumi 	}
43*5812c3ccSTomohiro Kusumi 	kprintf("\n");
44*5812c3ccSTomohiro Kusumi }
45*5812c3ccSTomohiro Kusumi 
46*5812c3ccSTomohiro Kusumi void
47*5812c3ccSTomohiro Kusumi fuse_fill_in_header(struct fuse_in_header *ihd,
48*5812c3ccSTomohiro Kusumi     uint32_t len, uint32_t opcode, uint64_t unique, uint64_t nodeid,
49*5812c3ccSTomohiro Kusumi     uint32_t uid, uint32_t gid, uint32_t pid)
50*5812c3ccSTomohiro Kusumi {
51*5812c3ccSTomohiro Kusumi 	ihd->len = len;
52*5812c3ccSTomohiro Kusumi 	ihd->opcode = opcode;
53*5812c3ccSTomohiro Kusumi 	ihd->unique = unique;
54*5812c3ccSTomohiro Kusumi 	ihd->nodeid = nodeid;
55*5812c3ccSTomohiro Kusumi 	ihd->uid = uid;
56*5812c3ccSTomohiro Kusumi 	ihd->gid = gid;
57*5812c3ccSTomohiro Kusumi 	ihd->pid = pid;
58*5812c3ccSTomohiro Kusumi }
59*5812c3ccSTomohiro Kusumi 
60*5812c3ccSTomohiro Kusumi int
61*5812c3ccSTomohiro Kusumi fuse_forget_node(struct fuse_mount *fmp, uint64_t ino, uint64_t nlookup,
62*5812c3ccSTomohiro Kusumi     struct ucred *cred)
63*5812c3ccSTomohiro Kusumi {
64*5812c3ccSTomohiro Kusumi 	struct fuse_ipc *fip;
65*5812c3ccSTomohiro Kusumi 	struct fuse_forget_in *ffi;
66*5812c3ccSTomohiro Kusumi 	int error;
67*5812c3ccSTomohiro Kusumi 
68*5812c3ccSTomohiro Kusumi 	KKASSERT(nlookup > 0);
69*5812c3ccSTomohiro Kusumi 
70*5812c3ccSTomohiro Kusumi 	fip = fuse_ipc_get(fmp, sizeof(*ffi));
71*5812c3ccSTomohiro Kusumi 	ffi = fuse_ipc_fill(fip, FUSE_FORGET, ino, cred);
72*5812c3ccSTomohiro Kusumi 	ffi->nlookup = nlookup;
73*5812c3ccSTomohiro Kusumi 
74*5812c3ccSTomohiro Kusumi 	error = fuse_ipc_tx(fip);
75*5812c3ccSTomohiro Kusumi 	if (error)
76*5812c3ccSTomohiro Kusumi 		return error;
77*5812c3ccSTomohiro Kusumi 	fuse_ipc_put(fip);
78*5812c3ccSTomohiro Kusumi 
79*5812c3ccSTomohiro Kusumi 	return 0;
80*5812c3ccSTomohiro Kusumi }
81*5812c3ccSTomohiro Kusumi 
82*5812c3ccSTomohiro Kusumi /*
83*5812c3ccSTomohiro Kusumi  * Ignore FUSE_COMPAT_XXX which seem to exist for backward compatibility
84*5812c3ccSTomohiro Kusumi  * for ancient versions of FUSE protocol.
85*5812c3ccSTomohiro Kusumi  */
86*5812c3ccSTomohiro Kusumi int
87*5812c3ccSTomohiro Kusumi fuse_audit_length(struct fuse_in_header *ihd, struct fuse_out_header *ohd)
88*5812c3ccSTomohiro Kusumi {
89*5812c3ccSTomohiro Kusumi 	size_t len = ohd->len - sizeof(struct fuse_out_header);
90*5812c3ccSTomohiro Kusumi 	bool res;
91*5812c3ccSTomohiro Kusumi 
92*5812c3ccSTomohiro Kusumi 	switch (ihd->opcode) {
93*5812c3ccSTomohiro Kusumi 	case FUSE_LOOKUP:
94*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_entry_out));
95*5812c3ccSTomohiro Kusumi 		break;
96*5812c3ccSTomohiro Kusumi 	case FUSE_FORGET:
97*5812c3ccSTomohiro Kusumi 		res = true;
98*5812c3ccSTomohiro Kusumi 		break;
99*5812c3ccSTomohiro Kusumi 	case FUSE_GETATTR:
100*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_attr_out));
101*5812c3ccSTomohiro Kusumi 		break;
102*5812c3ccSTomohiro Kusumi 	case FUSE_SETATTR:
103*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_attr_out));
104*5812c3ccSTomohiro Kusumi 		break;
105*5812c3ccSTomohiro Kusumi 	case FUSE_READLINK:
106*5812c3ccSTomohiro Kusumi 		res = (len <= PAGE_SIZE);
107*5812c3ccSTomohiro Kusumi 		break;
108*5812c3ccSTomohiro Kusumi 	case FUSE_SYMLINK:
109*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_entry_out));
110*5812c3ccSTomohiro Kusumi 		break;
111*5812c3ccSTomohiro Kusumi 	case FUSE_MKNOD:
112*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_entry_out));
113*5812c3ccSTomohiro Kusumi 		break;
114*5812c3ccSTomohiro Kusumi 	case FUSE_MKDIR:
115*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_entry_out));
116*5812c3ccSTomohiro Kusumi 		break;
117*5812c3ccSTomohiro Kusumi 	case FUSE_UNLINK:
118*5812c3ccSTomohiro Kusumi 		res = (len == 0);
119*5812c3ccSTomohiro Kusumi 		break;
120*5812c3ccSTomohiro Kusumi 	case FUSE_RMDIR:
121*5812c3ccSTomohiro Kusumi 		res = (len == 0);
122*5812c3ccSTomohiro Kusumi 		break;
123*5812c3ccSTomohiro Kusumi 	case FUSE_RENAME:
124*5812c3ccSTomohiro Kusumi 		res = (len == 0);
125*5812c3ccSTomohiro Kusumi 		break;
126*5812c3ccSTomohiro Kusumi 	case FUSE_LINK:
127*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_entry_out));
128*5812c3ccSTomohiro Kusumi 		break;
129*5812c3ccSTomohiro Kusumi 	case FUSE_OPEN:
130*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_open_out));
131*5812c3ccSTomohiro Kusumi 		break;
132*5812c3ccSTomohiro Kusumi 	case FUSE_READ:
133*5812c3ccSTomohiro Kusumi 		res = (len <= ((struct fuse_read_in*)(ihd + 1))->size);
134*5812c3ccSTomohiro Kusumi 		break;
135*5812c3ccSTomohiro Kusumi 	case FUSE_WRITE:
136*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_write_out));
137*5812c3ccSTomohiro Kusumi 		break;
138*5812c3ccSTomohiro Kusumi 	case FUSE_STATFS:
139*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_statfs_out));
140*5812c3ccSTomohiro Kusumi 		break;
141*5812c3ccSTomohiro Kusumi 	case FUSE_RELEASE:
142*5812c3ccSTomohiro Kusumi 		res = (len == 0);
143*5812c3ccSTomohiro Kusumi 		break;
144*5812c3ccSTomohiro Kusumi 	case FUSE_FSYNC:
145*5812c3ccSTomohiro Kusumi 		res = (len == 0);
146*5812c3ccSTomohiro Kusumi 		break;
147*5812c3ccSTomohiro Kusumi 	case FUSE_SETXATTR:
148*5812c3ccSTomohiro Kusumi 		res = (len == 0);
149*5812c3ccSTomohiro Kusumi 		break;
150*5812c3ccSTomohiro Kusumi 	case FUSE_GETXATTR:
151*5812c3ccSTomohiro Kusumi 		res = true;
152*5812c3ccSTomohiro Kusumi 		break;
153*5812c3ccSTomohiro Kusumi 	case FUSE_LISTXATTR:
154*5812c3ccSTomohiro Kusumi 		res = true;
155*5812c3ccSTomohiro Kusumi 		break;
156*5812c3ccSTomohiro Kusumi 	case FUSE_REMOVEXATTR:
157*5812c3ccSTomohiro Kusumi 		res = (len == 0);
158*5812c3ccSTomohiro Kusumi 		break;
159*5812c3ccSTomohiro Kusumi 	case FUSE_FLUSH:
160*5812c3ccSTomohiro Kusumi 		res = (len == 0);
161*5812c3ccSTomohiro Kusumi 		break;
162*5812c3ccSTomohiro Kusumi 	case FUSE_INIT:
163*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_init_out));
164*5812c3ccSTomohiro Kusumi 		break;
165*5812c3ccSTomohiro Kusumi 	case FUSE_OPENDIR:
166*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_open_out));
167*5812c3ccSTomohiro Kusumi 		break;
168*5812c3ccSTomohiro Kusumi 	case FUSE_READDIR:
169*5812c3ccSTomohiro Kusumi 		res = (len <= ((struct fuse_read_in*)(ihd + 1))->size);
170*5812c3ccSTomohiro Kusumi 		break;
171*5812c3ccSTomohiro Kusumi 	case FUSE_RELEASEDIR:
172*5812c3ccSTomohiro Kusumi 		res = (len == 0);
173*5812c3ccSTomohiro Kusumi 		break;
174*5812c3ccSTomohiro Kusumi 	case FUSE_FSYNCDIR:
175*5812c3ccSTomohiro Kusumi 		res = (len == 0);
176*5812c3ccSTomohiro Kusumi 		break;
177*5812c3ccSTomohiro Kusumi 	case FUSE_GETLK:
178*5812c3ccSTomohiro Kusumi 		res = false;
179*5812c3ccSTomohiro Kusumi 		break;
180*5812c3ccSTomohiro Kusumi 	case FUSE_SETLK:
181*5812c3ccSTomohiro Kusumi 		res = false;
182*5812c3ccSTomohiro Kusumi 		break;
183*5812c3ccSTomohiro Kusumi 	case FUSE_SETLKW:
184*5812c3ccSTomohiro Kusumi 		res = false;
185*5812c3ccSTomohiro Kusumi 		break;
186*5812c3ccSTomohiro Kusumi 	case FUSE_ACCESS:
187*5812c3ccSTomohiro Kusumi 		res = (len == 0);
188*5812c3ccSTomohiro Kusumi 		break;
189*5812c3ccSTomohiro Kusumi 	case FUSE_CREATE:
190*5812c3ccSTomohiro Kusumi 		res = (len == sizeof(struct fuse_entry_out) +
191*5812c3ccSTomohiro Kusumi 		    sizeof(struct fuse_open_out));
192*5812c3ccSTomohiro Kusumi 		break;
193*5812c3ccSTomohiro Kusumi 	case FUSE_INTERRUPT:
194*5812c3ccSTomohiro Kusumi 		res = false;
195*5812c3ccSTomohiro Kusumi 		break;
196*5812c3ccSTomohiro Kusumi 	case FUSE_BMAP:
197*5812c3ccSTomohiro Kusumi 		res = false;
198*5812c3ccSTomohiro Kusumi 		break;
199*5812c3ccSTomohiro Kusumi 	case FUSE_DESTROY:
200*5812c3ccSTomohiro Kusumi 		res = (len == 0);
201*5812c3ccSTomohiro Kusumi 		break;
202*5812c3ccSTomohiro Kusumi 	case FUSE_IOCTL:
203*5812c3ccSTomohiro Kusumi 		res = false;
204*5812c3ccSTomohiro Kusumi 		break;
205*5812c3ccSTomohiro Kusumi 	case FUSE_POLL:
206*5812c3ccSTomohiro Kusumi 		res = false;
207*5812c3ccSTomohiro Kusumi 		break;
208*5812c3ccSTomohiro Kusumi 	case FUSE_NOTIFY_REPLY:
209*5812c3ccSTomohiro Kusumi 		res = false;
210*5812c3ccSTomohiro Kusumi 		break;
211*5812c3ccSTomohiro Kusumi 	case FUSE_BATCH_FORGET:
212*5812c3ccSTomohiro Kusumi 		res = false;
213*5812c3ccSTomohiro Kusumi 		break;
214*5812c3ccSTomohiro Kusumi 	case FUSE_FALLOCATE:
215*5812c3ccSTomohiro Kusumi 		res = false;
216*5812c3ccSTomohiro Kusumi 		break;
217*5812c3ccSTomohiro Kusumi 	case FUSE_READDIRPLUS:
218*5812c3ccSTomohiro Kusumi 		res = false;
219*5812c3ccSTomohiro Kusumi 		break;
220*5812c3ccSTomohiro Kusumi 	case FUSE_RENAME2:
221*5812c3ccSTomohiro Kusumi 		res = false;
222*5812c3ccSTomohiro Kusumi 		break;
223*5812c3ccSTomohiro Kusumi 	case FUSE_LSEEK:
224*5812c3ccSTomohiro Kusumi 		res = false;
225*5812c3ccSTomohiro Kusumi 		break;
226*5812c3ccSTomohiro Kusumi 	case FUSE_COPY_FILE_RANGE:
227*5812c3ccSTomohiro Kusumi 		res = false;
228*5812c3ccSTomohiro Kusumi 		break;
229*5812c3ccSTomohiro Kusumi 	default:
230*5812c3ccSTomohiro Kusumi 		fuse_panic("Invalid opcode %d", ihd->opcode);
231*5812c3ccSTomohiro Kusumi 		break;
232*5812c3ccSTomohiro Kusumi 	}
233*5812c3ccSTomohiro Kusumi 
234*5812c3ccSTomohiro Kusumi 	if (!res)
235*5812c3ccSTomohiro Kusumi 		return -1;
236*5812c3ccSTomohiro Kusumi 	return 0;
237*5812c3ccSTomohiro Kusumi }
238*5812c3ccSTomohiro Kusumi 
239*5812c3ccSTomohiro Kusumi const char*
240*5812c3ccSTomohiro Kusumi fuse_get_ops(int op)
241*5812c3ccSTomohiro Kusumi {
242*5812c3ccSTomohiro Kusumi 	switch (op) {
243*5812c3ccSTomohiro Kusumi 	case FUSE_LOOKUP:
244*5812c3ccSTomohiro Kusumi 		return "FUSE_LOOKUP";
245*5812c3ccSTomohiro Kusumi 	case FUSE_FORGET:
246*5812c3ccSTomohiro Kusumi 		return "FUSE_FORGET";
247*5812c3ccSTomohiro Kusumi 	case FUSE_GETATTR:
248*5812c3ccSTomohiro Kusumi 		return "FUSE_GETATTR";
249*5812c3ccSTomohiro Kusumi 	case FUSE_SETATTR:
250*5812c3ccSTomohiro Kusumi 		return "FUSE_SETATTR";
251*5812c3ccSTomohiro Kusumi 	case FUSE_READLINK:
252*5812c3ccSTomohiro Kusumi 		return "FUSE_READLINK";
253*5812c3ccSTomohiro Kusumi 	case FUSE_SYMLINK:
254*5812c3ccSTomohiro Kusumi 		return "FUSE_SYMLINK";
255*5812c3ccSTomohiro Kusumi 	case FUSE_MKNOD:
256*5812c3ccSTomohiro Kusumi 		return "FUSE_MKNOD";
257*5812c3ccSTomohiro Kusumi 	case FUSE_MKDIR:
258*5812c3ccSTomohiro Kusumi 		return "FUSE_MKDIR";
259*5812c3ccSTomohiro Kusumi 	case FUSE_UNLINK:
260*5812c3ccSTomohiro Kusumi 		return "FUSE_UNLINK";
261*5812c3ccSTomohiro Kusumi 	case FUSE_RMDIR:
262*5812c3ccSTomohiro Kusumi 		return "FUSE_RMDIR";
263*5812c3ccSTomohiro Kusumi 	case FUSE_RENAME:
264*5812c3ccSTomohiro Kusumi 		return "FUSE_RENAME";
265*5812c3ccSTomohiro Kusumi 	case FUSE_LINK:
266*5812c3ccSTomohiro Kusumi 		return "FUSE_LINK";
267*5812c3ccSTomohiro Kusumi 	case FUSE_OPEN:
268*5812c3ccSTomohiro Kusumi 		return "FUSE_OPEN";
269*5812c3ccSTomohiro Kusumi 	case FUSE_READ:
270*5812c3ccSTomohiro Kusumi 		return "FUSE_READ";
271*5812c3ccSTomohiro Kusumi 	case FUSE_WRITE:
272*5812c3ccSTomohiro Kusumi 		return "FUSE_WRITE";
273*5812c3ccSTomohiro Kusumi 	case FUSE_STATFS:
274*5812c3ccSTomohiro Kusumi 		return "FUSE_STATFS";
275*5812c3ccSTomohiro Kusumi 	case FUSE_RELEASE:
276*5812c3ccSTomohiro Kusumi 		return "FUSE_RELEASE";
277*5812c3ccSTomohiro Kusumi 	case FUSE_FSYNC:
278*5812c3ccSTomohiro Kusumi 		return "FUSE_FSYNC";
279*5812c3ccSTomohiro Kusumi 	case FUSE_SETXATTR:
280*5812c3ccSTomohiro Kusumi 		return "FUSE_SETXATTR";
281*5812c3ccSTomohiro Kusumi 	case FUSE_GETXATTR:
282*5812c3ccSTomohiro Kusumi 		return "FUSE_GETXATTR";
283*5812c3ccSTomohiro Kusumi 	case FUSE_LISTXATTR:
284*5812c3ccSTomohiro Kusumi 		return "FUSE_LISTXATTR";
285*5812c3ccSTomohiro Kusumi 	case FUSE_REMOVEXATTR:
286*5812c3ccSTomohiro Kusumi 		return "FUSE_REMOVEXATTR";
287*5812c3ccSTomohiro Kusumi 	case FUSE_FLUSH:
288*5812c3ccSTomohiro Kusumi 		return "FUSE_FLUSH";
289*5812c3ccSTomohiro Kusumi 	case FUSE_INIT:
290*5812c3ccSTomohiro Kusumi 		return "FUSE_INIT";
291*5812c3ccSTomohiro Kusumi 	case FUSE_OPENDIR:
292*5812c3ccSTomohiro Kusumi 		return "FUSE_OPENDIR";
293*5812c3ccSTomohiro Kusumi 	case FUSE_READDIR:
294*5812c3ccSTomohiro Kusumi 		return "FUSE_READDIR";
295*5812c3ccSTomohiro Kusumi 	case FUSE_RELEASEDIR:
296*5812c3ccSTomohiro Kusumi 		return "FUSE_RELEASEDIR";
297*5812c3ccSTomohiro Kusumi 	case FUSE_FSYNCDIR:
298*5812c3ccSTomohiro Kusumi 		return "FUSE_FSYNCDIR";
299*5812c3ccSTomohiro Kusumi 	case FUSE_GETLK:
300*5812c3ccSTomohiro Kusumi 		return "FUSE_GETLK";
301*5812c3ccSTomohiro Kusumi 	case FUSE_SETLK:
302*5812c3ccSTomohiro Kusumi 		return "FUSE_SETLK";
303*5812c3ccSTomohiro Kusumi 	case FUSE_SETLKW:
304*5812c3ccSTomohiro Kusumi 		return "FUSE_SETLKW";
305*5812c3ccSTomohiro Kusumi 	case FUSE_ACCESS:
306*5812c3ccSTomohiro Kusumi 		return "FUSE_ACCESS";
307*5812c3ccSTomohiro Kusumi 	case FUSE_CREATE:
308*5812c3ccSTomohiro Kusumi 		return "FUSE_CREATE";
309*5812c3ccSTomohiro Kusumi 	case FUSE_INTERRUPT:
310*5812c3ccSTomohiro Kusumi 		return "FUSE_INTERRUPT";
311*5812c3ccSTomohiro Kusumi 	case FUSE_BMAP:
312*5812c3ccSTomohiro Kusumi 		return "FUSE_BMAP";
313*5812c3ccSTomohiro Kusumi 	case FUSE_DESTROY:
314*5812c3ccSTomohiro Kusumi 		return "FUSE_DESTROY";
315*5812c3ccSTomohiro Kusumi 	case FUSE_IOCTL:
316*5812c3ccSTomohiro Kusumi 		return "FUSE_IOCTL";
317*5812c3ccSTomohiro Kusumi 	case FUSE_POLL:
318*5812c3ccSTomohiro Kusumi 		return "FUSE_POLL";
319*5812c3ccSTomohiro Kusumi 	case FUSE_NOTIFY_REPLY:
320*5812c3ccSTomohiro Kusumi 		return "FUSE_NOTIFY_REPLY";
321*5812c3ccSTomohiro Kusumi 	case FUSE_BATCH_FORGET:
322*5812c3ccSTomohiro Kusumi 		return "FUSE_BATCH_FORGET";
323*5812c3ccSTomohiro Kusumi 	case FUSE_FALLOCATE:
324*5812c3ccSTomohiro Kusumi 		return "FUSE_FALLOCATE";
325*5812c3ccSTomohiro Kusumi 	case FUSE_READDIRPLUS:
326*5812c3ccSTomohiro Kusumi 		return "FUSE_READDIRPLUS";
327*5812c3ccSTomohiro Kusumi 	case FUSE_RENAME2:
328*5812c3ccSTomohiro Kusumi 		return "FUSE_RENAME2";
329*5812c3ccSTomohiro Kusumi 	case FUSE_LSEEK:
330*5812c3ccSTomohiro Kusumi 		return "FUSE_LSEEK";
331*5812c3ccSTomohiro Kusumi 	case FUSE_COPY_FILE_RANGE:
332*5812c3ccSTomohiro Kusumi 		return "FUSE_COPY_FILE_RANGE";
333*5812c3ccSTomohiro Kusumi 	default:
334*5812c3ccSTomohiro Kusumi 		fuse_panic("Invalid opcode %d", op);
335*5812c3ccSTomohiro Kusumi 		break;
336*5812c3ccSTomohiro Kusumi 	}
337*5812c3ccSTomohiro Kusumi 
338*5812c3ccSTomohiro Kusumi 	return NULL;
339*5812c3ccSTomohiro Kusumi }
340