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