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