1 /*- 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright (c) 2007-2009 Google Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are 9 * met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above 14 * copyright notice, this list of conditions and the following disclaimer 15 * in the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Google Inc. nor the names of its 18 * contributors may be used to endorse or promote products derived from 19 * this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 * Copyright (C) 2005 Csaba Henk. 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 45 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 46 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 47 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 48 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 49 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 50 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 51 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 53 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 54 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 55 * SUCH DAMAGE. 56 * 57 * $FreeBSD$ 58 */ 59 60 #include "fuse_kernel.h" 61 62 #define FUSE_DEFAULT_DAEMON_TIMEOUT 60 /* s */ 63 #define FUSE_MIN_DAEMON_TIMEOUT 0 /* s */ 64 #define FUSE_MAX_DAEMON_TIMEOUT 600 /* s */ 65 66 #ifndef FUSE_FREEBSD_VERSION 67 #define FUSE_FREEBSD_VERSION "0.4.4" 68 #endif 69 70 /* Mapping versions to features */ 71 72 #define FUSE_KERNELABI_GEQ(maj, min) \ 73 (FUSE_KERNEL_VERSION > (maj) || (FUSE_KERNEL_VERSION == (maj) && FUSE_KERNEL_MINOR_VERSION >= (min))) 74 75 /* 76 * Appearance of new FUSE operations is not always in par with version 77 * numbering... At least, 7.3 is a sufficient condition for having 78 * FUSE_{ACCESS,CREATE}. 79 */ 80 #if FUSE_KERNELABI_GEQ(7, 3) 81 #ifndef FUSE_HAS_ACCESS 82 #define FUSE_HAS_ACCESS 1 83 #endif 84 #ifndef FUSE_HAS_CREATE 85 #define FUSE_HAS_CREATE 1 86 #endif 87 #else /* FUSE_KERNELABI_GEQ(7, 3) */ 88 #ifndef FUSE_HAS_ACCESS 89 #define FUSE_HAS_ACCESS 0 90 #endif 91 #ifndef FUSE_HAS_CREATE 92 #define FUSE_HAS_CREATE 0 93 #endif 94 #endif 95 96 #if FUSE_KERNELABI_GEQ(7, 7) 97 #ifndef FUSE_HAS_GETLK 98 #define FUSE_HAS_GETLK 1 99 #endif 100 #ifndef FUSE_HAS_SETLK 101 #define FUSE_HAS_SETLK 1 102 #endif 103 #ifndef FUSE_HAS_SETLKW 104 #define FUSE_HAS_SETLKW 1 105 #endif 106 #ifndef FUSE_HAS_INTERRUPT 107 #define FUSE_HAS_INTERRUPT 1 108 #endif 109 #else /* FUSE_KERNELABI_GEQ(7, 7) */ 110 #ifndef FUSE_HAS_GETLK 111 #define FUSE_HAS_GETLK 0 112 #endif 113 #ifndef FUSE_HAS_SETLK 114 #define FUSE_HAS_SETLK 0 115 #endif 116 #ifndef FUSE_HAS_SETLKW 117 #define FUSE_HAS_SETLKW 0 118 #endif 119 #ifndef FUSE_HAS_INTERRUPT 120 #define FUSE_HAS_INTERRUPT 0 121 #endif 122 #endif 123 124 #if FUSE_KERNELABI_GEQ(7, 8) 125 #ifndef FUSE_HAS_FLUSH_RELEASE 126 #define FUSE_HAS_FLUSH_RELEASE 1 127 /* 128 * "DESTROY" came in the middle of the 7.8 era, 129 * so this is not completely exact... 130 */ 131 #ifndef FUSE_HAS_DESTROY 132 #define FUSE_HAS_DESTROY 1 133 #endif 134 #endif 135 #else /* FUSE_KERNELABI_GEQ(7, 8) */ 136 #ifndef FUSE_HAS_FLUSH_RELEASE 137 #define FUSE_HAS_FLUSH_RELEASE 0 138 #ifndef FUSE_HAS_DESTROY 139 #define FUSE_HAS_DESTROY 0 140 #endif 141 #endif 142 #endif 143 144 /* misc */ 145 146 SYSCTL_DECL(_vfs_fuse); 147 148 /* Fuse locking */ 149 150 extern struct mtx fuse_mtx; 151 #define FUSE_LOCK() fuse_lck_mtx_lock(fuse_mtx) 152 #define FUSE_UNLOCK() fuse_lck_mtx_unlock(fuse_mtx) 153 154 #define RECTIFY_TDCR(td, cred) \ 155 do { \ 156 if (! (td)) \ 157 (td) = curthread; \ 158 if (! (cred)) \ 159 (cred) = (td)->td_ucred; \ 160 } while (0) 161 162 /* Debug related stuff */ 163 164 #ifndef FUSE_DEBUG_DEVICE 165 #define FUSE_DEBUG_DEVICE 0 166 #endif 167 168 #ifndef FUSE_DEBUG_FILE 169 #define FUSE_DEBUG_FILE 0 170 #endif 171 172 #ifndef FUSE_DEBUG_INTERNAL 173 #define FUSE_DEBUG_INTERNAL 0 174 #endif 175 176 #ifndef FUSE_DEBUG_IO 177 #define FUSE_DEBUG_IO 0 178 #endif 179 180 #ifndef FUSE_DEBUG_IPC 181 #define FUSE_DEBUG_IPC 0 182 #endif 183 184 #ifndef FUSE_DEBUG_LOCK 185 #define FUSE_DEBUG_LOCK 0 186 #endif 187 188 #ifndef FUSE_DEBUG_VFSOPS 189 #define FUSE_DEBUG_VFSOPS 0 190 #endif 191 192 #ifndef FUSE_DEBUG_VNOPS 193 #define FUSE_DEBUG_VNOPS 0 194 #endif 195 196 #ifndef FUSE_TRACE 197 #define FUSE_TRACE 0 198 #endif 199 200 #define DEBUGX(cond, fmt, ...) do { \ 201 if (((cond))) { \ 202 printf("%s: " fmt, __func__, ## __VA_ARGS__); \ 203 } } while (0) 204 205 #define fuse_lck_mtx_lock(mtx) do { \ 206 DEBUGX(FUSE_DEBUG_LOCK, "0: lock(%s): %s@%d by %d\n", \ 207 __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ 208 mtx_lock(&(mtx)); \ 209 DEBUGX(FUSE_DEBUG_LOCK, "1: lock(%s): %s@%d by %d\n", \ 210 __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ 211 } while (0) 212 213 #define fuse_lck_mtx_unlock(mtx) do { \ 214 DEBUGX(FUSE_DEBUG_LOCK, "0: unlock(%s): %s@%d by %d\n", \ 215 __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ 216 mtx_unlock(&(mtx)); \ 217 DEBUGX(FUSE_DEBUG_LOCK, "1: unlock(%s): %s@%d by %d\n", \ 218 __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ 219 } while (0) 220 221 void fuse_ipc_init(void); 222 void fuse_ipc_destroy(void); 223 224 int fuse_device_init(void); 225 void fuse_device_destroy(void); 226