1331722Seadler/* 2241519Sattilio * Copyright (c) 2007-2009 Google Inc. 3241519Sattilio * All rights reserved. 4241519Sattilio * 5241519Sattilio * Redistribution and use in source and binary forms, with or without 6241519Sattilio * modification, are permitted provided that the following conditions are 7241519Sattilio * met: 8241519Sattilio * 9241519Sattilio * * Redistributions of source code must retain the above copyright 10241519Sattilio * notice, this list of conditions and the following disclaimer. 11241519Sattilio * * Redistributions in binary form must reproduce the above 12241519Sattilio * copyright notice, this list of conditions and the following disclaimer 13241519Sattilio * in the documentation and/or other materials provided with the 14241519Sattilio * distribution. 15241519Sattilio * * Neither the name of Google Inc. nor the names of its 16241519Sattilio * contributors may be used to endorse or promote products derived from 17241519Sattilio * this software without specific prior written permission. 18241519Sattilio * 19241519Sattilio * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20241519Sattilio * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21241519Sattilio * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22241519Sattilio * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23241519Sattilio * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24241519Sattilio * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25241519Sattilio * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26241519Sattilio * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27241519Sattilio * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28241519Sattilio * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29241519Sattilio * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30241519Sattilio * 31241519Sattilio * Copyright (C) 2005 Csaba Henk. 32241519Sattilio * All rights reserved. 33241519Sattilio * 34241519Sattilio * Redistribution and use in source and binary forms, with or without 35241519Sattilio * modification, are permitted provided that the following conditions 36241519Sattilio * are met: 37241519Sattilio * 1. Redistributions of source code must retain the above copyright 38241519Sattilio * notice, this list of conditions and the following disclaimer. 39241519Sattilio * 2. Redistributions in binary form must reproduce the above copyright 40241519Sattilio * notice, this list of conditions and the following disclaimer in the 41241519Sattilio * documentation and/or other materials provided with the distribution. 42241519Sattilio * 43241519Sattilio * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 44241519Sattilio * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 45241519Sattilio * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 46241519Sattilio * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 47241519Sattilio * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 48241519Sattilio * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 49241519Sattilio * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 50241519Sattilio * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 51241519Sattilio * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 52241519Sattilio * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 53241519Sattilio * SUCH DAMAGE. 54241519Sattilio * 55241519Sattilio * $FreeBSD$ 56241519Sattilio */ 57241519Sattilio 58241519Sattilio#include "fuse_kernel.h" 59241519Sattilio 60241519Sattilio#define FUSE_DEFAULT_DAEMON_TIMEOUT 60 /* s */ 61241519Sattilio#define FUSE_MIN_DAEMON_TIMEOUT 0 /* s */ 62241519Sattilio#define FUSE_MAX_DAEMON_TIMEOUT 600 /* s */ 63241519Sattilio 64241519Sattilio#ifndef FUSE_FREEBSD_VERSION 65241519Sattilio#define FUSE_FREEBSD_VERSION "0.4.4" 66241519Sattilio#endif 67241519Sattilio 68241519Sattilio/* Mapping versions to features */ 69241519Sattilio 70241519Sattilio#define FUSE_KERNELABI_GEQ(maj, min) \ 71241519Sattilio(FUSE_KERNEL_VERSION > (maj) || (FUSE_KERNEL_VERSION == (maj) && FUSE_KERNEL_MINOR_VERSION >= (min))) 72241519Sattilio 73241519Sattilio/* 74241519Sattilio * Appearance of new FUSE operations is not always in par with version 75241519Sattilio * numbering... At least, 7.3 is a sufficient condition for having 76241519Sattilio * FUSE_{ACCESS,CREATE}. 77241519Sattilio */ 78241519Sattilio#if FUSE_KERNELABI_GEQ(7, 3) 79241519Sattilio#ifndef FUSE_HAS_ACCESS 80241519Sattilio#define FUSE_HAS_ACCESS 1 81241519Sattilio#endif 82241519Sattilio#ifndef FUSE_HAS_CREATE 83241519Sattilio#define FUSE_HAS_CREATE 1 84241519Sattilio#endif 85241519Sattilio#else /* FUSE_KERNELABI_GEQ(7, 3) */ 86241519Sattilio#ifndef FUSE_HAS_ACCESS 87241519Sattilio#define FUSE_HAS_ACCESS 0 88241519Sattilio#endif 89241519Sattilio#ifndef FUSE_HAS_CREATE 90241519Sattilio#define FUSE_HAS_CREATE 0 91241519Sattilio#endif 92241519Sattilio#endif 93241519Sattilio 94241519Sattilio#if FUSE_KERNELABI_GEQ(7, 7) 95241519Sattilio#ifndef FUSE_HAS_GETLK 96241519Sattilio#define FUSE_HAS_GETLK 1 97241519Sattilio#endif 98241519Sattilio#ifndef FUSE_HAS_SETLK 99241519Sattilio#define FUSE_HAS_SETLK 1 100241519Sattilio#endif 101241519Sattilio#ifndef FUSE_HAS_SETLKW 102241519Sattilio#define FUSE_HAS_SETLKW 1 103241519Sattilio#endif 104241519Sattilio#ifndef FUSE_HAS_INTERRUPT 105241519Sattilio#define FUSE_HAS_INTERRUPT 1 106241519Sattilio#endif 107241519Sattilio#else /* FUSE_KERNELABI_GEQ(7, 7) */ 108241519Sattilio#ifndef FUSE_HAS_GETLK 109241519Sattilio#define FUSE_HAS_GETLK 0 110241519Sattilio#endif 111241519Sattilio#ifndef FUSE_HAS_SETLK 112241519Sattilio#define FUSE_HAS_SETLK 0 113241519Sattilio#endif 114241519Sattilio#ifndef FUSE_HAS_SETLKW 115241519Sattilio#define FUSE_HAS_SETLKW 0 116241519Sattilio#endif 117241519Sattilio#ifndef FUSE_HAS_INTERRUPT 118241519Sattilio#define FUSE_HAS_INTERRUPT 0 119241519Sattilio#endif 120241519Sattilio#endif 121241519Sattilio 122241519Sattilio#if FUSE_KERNELABI_GEQ(7, 8) 123241519Sattilio#ifndef FUSE_HAS_FLUSH_RELEASE 124241519Sattilio#define FUSE_HAS_FLUSH_RELEASE 1 125241519Sattilio/* 126241519Sattilio * "DESTROY" came in the middle of the 7.8 era, 127241519Sattilio * so this is not completely exact... 128241519Sattilio */ 129241519Sattilio#ifndef FUSE_HAS_DESTROY 130241519Sattilio#define FUSE_HAS_DESTROY 1 131241519Sattilio#endif 132241519Sattilio#endif 133241519Sattilio#else /* FUSE_KERNELABI_GEQ(7, 8) */ 134241519Sattilio#ifndef FUSE_HAS_FLUSH_RELEASE 135241519Sattilio#define FUSE_HAS_FLUSH_RELEASE 0 136241519Sattilio#ifndef FUSE_HAS_DESTROY 137241519Sattilio#define FUSE_HAS_DESTROY 0 138241519Sattilio#endif 139241519Sattilio#endif 140241519Sattilio#endif 141241519Sattilio 142241519Sattilio/* misc */ 143241519Sattilio 144241519SattilioSYSCTL_DECL(_vfs_fuse); 145241519Sattilio 146241519Sattilio/* Fuse locking */ 147241519Sattilio 148241519Sattilioextern struct mtx fuse_mtx; 149241519Sattilio#define FUSE_LOCK() fuse_lck_mtx_lock(fuse_mtx) 150241519Sattilio#define FUSE_UNLOCK() fuse_lck_mtx_unlock(fuse_mtx) 151241519Sattilio 152241519Sattilio#define RECTIFY_TDCR(td, cred) \ 153241519Sattiliodo { \ 154241519Sattilio if (! (td)) \ 155241519Sattilio (td) = curthread; \ 156241519Sattilio if (! (cred)) \ 157241519Sattilio (cred) = (td)->td_ucred; \ 158241519Sattilio} while (0) 159241519Sattilio 160241519Sattilio/* Debug related stuff */ 161241519Sattilio 162241519Sattilio#ifndef FUSE_DEBUG_DEVICE 163241519Sattilio#define FUSE_DEBUG_DEVICE 0 164241519Sattilio#endif 165241519Sattilio 166241519Sattilio#ifndef FUSE_DEBUG_FILE 167241519Sattilio#define FUSE_DEBUG_FILE 0 168241519Sattilio#endif 169241519Sattilio 170241519Sattilio#ifndef FUSE_DEBUG_INTERNAL 171241519Sattilio#define FUSE_DEBUG_INTERNAL 0 172241519Sattilio#endif 173241519Sattilio 174241519Sattilio#ifndef FUSE_DEBUG_IO 175241519Sattilio#define FUSE_DEBUG_IO 0 176241519Sattilio#endif 177241519Sattilio 178241519Sattilio#ifndef FUSE_DEBUG_IPC 179241519Sattilio#define FUSE_DEBUG_IPC 0 180241519Sattilio#endif 181241519Sattilio 182241519Sattilio#ifndef FUSE_DEBUG_LOCK 183241519Sattilio#define FUSE_DEBUG_LOCK 0 184241519Sattilio#endif 185241519Sattilio 186241519Sattilio#ifndef FUSE_DEBUG_VFSOPS 187241519Sattilio#define FUSE_DEBUG_VFSOPS 0 188241519Sattilio#endif 189241519Sattilio 190241519Sattilio#ifndef FUSE_DEBUG_VNOPS 191241519Sattilio#define FUSE_DEBUG_VNOPS 0 192241519Sattilio#endif 193241519Sattilio 194241519Sattilio#ifndef FUSE_TRACE 195241519Sattilio#define FUSE_TRACE 0 196241519Sattilio#endif 197241519Sattilio 198241519Sattilio#define DEBUGX(cond, fmt, ...) do { \ 199241519Sattilio if (((cond))) { \ 200241519Sattilio printf("%s: " fmt, __func__, ## __VA_ARGS__); \ 201241519Sattilio } } while (0) 202241519Sattilio 203241519Sattilio#define fuse_lck_mtx_lock(mtx) do { \ 204241519Sattilio DEBUGX(FUSE_DEBUG_LOCK, "0: lock(%s): %s@%d by %d\n", \ 205241519Sattilio __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ 206241519Sattilio mtx_lock(&(mtx)); \ 207241519Sattilio DEBUGX(FUSE_DEBUG_LOCK, "1: lock(%s): %s@%d by %d\n", \ 208241519Sattilio __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ 209241519Sattilio } while (0) 210241519Sattilio 211241519Sattilio#define fuse_lck_mtx_unlock(mtx) do { \ 212241519Sattilio DEBUGX(FUSE_DEBUG_LOCK, "0: unlock(%s): %s@%d by %d\n", \ 213241519Sattilio __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ 214241519Sattilio mtx_unlock(&(mtx)); \ 215241519Sattilio DEBUGX(FUSE_DEBUG_LOCK, "1: unlock(%s): %s@%d by %d\n", \ 216241519Sattilio __STRING(mtx), __func__, __LINE__, curthread->td_proc->p_pid); \ 217241519Sattilio } while (0) 218241519Sattilio 219241519Sattiliovoid fuse_ipc_init(void); 220241519Sattiliovoid fuse_ipc_destroy(void); 221241519Sattilio 222241519Sattilioint fuse_device_init(void); 223241519Sattiliovoid fuse_device_destroy(void); 224