Documentation ¶
Overview ¶
Package fuse provides APIs to implement filesystems in userspace in terms of raw FUSE protocol.
A filesystem is implemented by implementing its server that provides a RawFileSystem interface. Typically the server embeds NewDefaultRawFileSystem() and implements only subset of filesystem methods:
type MyFS struct { fuse.RawFileSystem ... } func NewMyFS() *MyFS { return &MyFS{ RawFileSystem: fuse.NewDefaultRawFileSystem(), ... } } // Mkdir implements "mkdir" request handler. // // For other requests - not explicitly implemented by MyFS - ENOSYS // will be typically returned to client. func (fs *MyFS) Mkdir(...) { ... }
Then the filesystem can be mounted and served to a client (typically OS kernel) by creating Server:
fs := NewMyFS() // implements RawFileSystem fssrv, err := fuse.NewServer(fs, mountpoint, &fuse.MountOptions{...}) if err != nil { ... }
and letting the server do its work:
// either synchronously - .Serve() blocks until the filesystem is unmounted. fssrv.Serve() // or in the background - .Serve() is spawned in another goroutine, but // before interacting with fssrv from current context we have to wait // until the filesystem mounting is complete. go fssrv.Serve() err = fssrv.WaitMount() if err != nil { ... }
The server will serve clients by dispatching their requests to the filesystem implementation and conveying responses back. For example "mkdir" FUSE request dispatches to call
fs.Mkdir(*MkdirIn, ..., *EntryOut)
"stat" to call
fs.GetAttr(*GetAttrIn, *AttrOut)
etc. Please refer to RawFileSystem documentation for details.
Typically, each call of the API happens in its own goroutine, so take care to make the file system thread-safe.
Higher level interfaces ¶
As said above this packages provides way to implement filesystems in terms of raw FUSE protocol. Additionally packages nodefs and pathfs provide ways to implement filesystem at higher levels:
Package github.com/hanwen/go-fuse/fuse/nodefs provides way to implement filesystems in terms of inodes. This resembles kernel's idea of what a filesystem looks like.
Package github.com/hanwen/go-fuse/fuse/pathfs provides way to implement filesystems in terms of path names. Working with path names is somewhat easier compared to inodes, however renames can be racy. Do not use pathfs if you care about correctness.
Index ¶
- Constants
- Variables
- func FlagString(names map[int64]string, fl int64, def string) string
- func Print(obj interface{}) string
- func ToStatT(f os.FileInfo) *syscall.Stat_t
- func UtimeToTimespec(t *time.Time) (ts syscall.Timespec)
- type AccessIn
- type Attr
- func (a *Attr) AccessTime() time.Time
- func (a *Attr) ChangeTime() time.Time
- func (a *Attr) FromStat(s *syscall.Stat_t)
- func (a *Attr) IsBlock() bool
- func (a *Attr) IsChar() bool
- func (a *Attr) IsDir() bool
- func (a *Attr) IsFifo() bool
- func (a *Attr) IsRegular() bool
- func (a *Attr) IsSocket() bool
- func (a *Attr) IsSymlink() bool
- func (a *Attr) ModTime() time.Time
- func (a *Attr) SetTimes(access *time.Time, mod *time.Time, chstatus *time.Time)
- func (a *Attr) String() string
- type AttrOut
- type BufferPool
- type Context
- type CreateIn
- type CreateOut
- type DirEntry
- type DirEntryList
- type EntryOut
- type FallocateIn
- type FileLock
- type FlushIn
- type ForgetIn
- type FsyncIn
- type GetAttrIn
- type GetXAttrIn
- type GetXAttrOut
- type InHeader
- type InitIn
- type InitOut
- type InterruptIn
- type LatencyMap
- type LinkIn
- type LkIn
- type LkOut
- type MkdirIn
- type MknodIn
- type MountOptions
- type NotifyInvalDeleteOut
- type NotifyInvalEntryOut
- type NotifyInvalInodeOut
- type NotifyRetrieveIn
- type NotifyRetrieveOut
- type NotifyStoreOut
- type OpenIn
- type OpenOut
- type OutHeader
- type Owner
- type RawFileSystem
- type ReadIn
- type ReadResult
- type ReleaseIn
- type Rename1In
- type RenameIn
- type Server
- func (ms *Server) DebugData() string
- func (ms *Server) DeleteNotify(parent uint64, child uint64, name string) Status
- func (ms *Server) EntryNotify(parent uint64, name string) Status
- func (ms *Server) InodeNotify(node uint64, off int64, length int64) Status
- func (ms *Server) InodeNotifyStoreCache(node uint64, offset int64, data []byte) Status
- func (ms *Server) InodeRetrieveCache(node uint64, offset int64, dest []byte) (n int, st Status)
- func (ms *Server) KernelSettings() *InitIn
- func (ms *Server) RecordLatencies(l LatencyMap)
- func (ms *Server) Serve()
- func (ms *Server) SetDebug(dbg bool)
- func (ms *Server) Unmount() (err error)
- func (ms *Server) WaitMount() error
- type SetAttrIn
- type SetAttrInCommon
- func (s *SetAttrInCommon) GetATime() (time.Time, bool)
- func (s *SetAttrInCommon) GetCTime() (time.Time, bool)
- func (s *SetAttrInCommon) GetFh() (uint64, bool)
- func (s *SetAttrInCommon) GetGID() (uint32, bool)
- func (s *SetAttrInCommon) GetMTime() (time.Time, bool)
- func (s *SetAttrInCommon) GetMode() (uint32, bool)
- func (s *SetAttrInCommon) GetSize() (uint64, bool)
- func (s *SetAttrInCommon) GetUID() (uint32, bool)
- type SetXAttrIn
- type StatfsOut
- type Status
- type WriteIn
- type WriteOut
Constants ¶
const ( FUSE_ROOT_ID = 1 FUSE_UNKNOWN_INO = 0xffffffff CUSE_UNRESTRICTED_IOCTL = (1 << 0) FUSE_LK_FLOCK = (1 << 0) FUSE_IOCTL_MAX_IOV = 256 FUSE_POLL_SCHEDULE_NOTIFY = (1 << 0) CUSE_INIT_INFO_MAX = 4096 S_IFDIR = syscall.S_IFDIR S_IFREG = syscall.S_IFREG S_IFLNK = syscall.S_IFLNK S_IFIFO = syscall.S_IFIFO CUSE_INIT = 4096 O_ANYWRITE = uint32(os.O_WRONLY | os.O_RDWR | os.O_APPEND | os.O_CREATE | os.O_TRUNC) )
const ( OK = Status(0) // EACCESS Permission denied EACCES = Status(syscall.EACCES) // EBUSY Device or resource busy EBUSY = Status(syscall.EBUSY) // EAGAIN Resource temporarily unavailable EAGAIN = Status(syscall.EAGAIN) // EINVAL Invalid argument EINVAL = Status(syscall.EINVAL) // EIO I/O error EIO = Status(syscall.EIO) // ENOENT No such file or directory ENOENT = Status(syscall.ENOENT) // ENOSYS Function not implemented ENOSYS = Status(syscall.ENOSYS) // ENODATA No data available ENODATA = Status(syscall.ENODATA) // ENOTDIR Not a directory ENOTDIR = Status(syscall.ENOTDIR) // EISDIR Is a directory EISDIR = Status(syscall.EISDIR) // EPERM Operation not permitted EPERM = Status(syscall.EPERM) // ERANGE Math result not representable ERANGE = Status(syscall.ERANGE) // EXDEV Cross-device link EXDEV = Status(syscall.EXDEV) // EBADF Bad file number EBADF = Status(syscall.EBADF) // ENODEV No such device ENODEV = Status(syscall.ENODEV) // EROFS Read-only file system EROFS = Status(syscall.EROFS) )
const ( FATTR_MODE = (1 << 0) FATTR_UID = (1 << 1) FATTR_GID = (1 << 2) FATTR_SIZE = (1 << 3) FATTR_ATIME = (1 << 4) FATTR_MTIME = (1 << 5) FATTR_FH = (1 << 6) FATTR_ATIME_NOW = (1 << 7) FATTR_MTIME_NOW = (1 << 8) FATTR_LOCKOWNER = (1 << 9) FATTR_CTIME = (1 << 10) )
const ( // OpenOut.Flags FOPEN_DIRECT_IO = (1 << 0) FOPEN_KEEP_CACHE = (1 << 1) FOPEN_NONSEEKABLE = (1 << 2) )
const ( CAP_ASYNC_READ = (1 << 0) CAP_POSIX_LOCKS = (1 << 1) CAP_FILE_OPS = (1 << 2) CAP_ATOMIC_O_TRUNC = (1 << 3) CAP_EXPORT_SUPPORT = (1 << 4) CAP_BIG_WRITES = (1 << 5) CAP_DONT_MASK = (1 << 6) CAP_SPLICE_WRITE = (1 << 7) CAP_SPLICE_MOVE = (1 << 8) CAP_SPLICE_READ = (1 << 9) CAP_FLOCK_LOCKS = (1 << 10) CAP_IOCTL_DIR = (1 << 11) CAP_AUTO_INVAL_DATA = (1 << 12) CAP_READDIRPLUS = (1 << 13) CAP_READDIRPLUS_AUTO = (1 << 14) CAP_ASYNC_DIO = (1 << 15) CAP_WRITEBACK_CACHE = (1 << 16) CAP_NO_OPEN_SUPPORT = (1 << 17) CAP_PARALLEL_DIROPS = (1 << 18) CAP_HANDLE_KILLPRIV = (1 << 19) CAP_POSIX_ACL = (1 << 20) CAP_ABORT_ERROR = (1 << 21) CAP_MAX_PAGES = (1 << 22) CAP_CACHE_SYMLINKS = (1 << 23) CAP_NO_OPENDIR_SUPPORT = (1 << 24) )
To be set in InitIn/InitOut.Flags.
const ( FUSE_IOCTL_COMPAT = (1 << 0) FUSE_IOCTL_UNRESTRICTED = (1 << 1) FUSE_IOCTL_RETRY = (1 << 2) )
const ( X_OK = 1 W_OK = 2 R_OK = 4 F_OK = 0 )
For AccessIn.Mask.
const ( // NOTIFY_POLL = -1 // notify kernel that a poll waiting for IO on a file handle should wake up NOTIFY_INVAL_INODE = -2 // notify kernel that an inode should be invalidated NOTIFY_INVAL_ENTRY = -3 // notify kernel that a directory entry should be invalidated NOTIFY_STORE_CACHE = -4 // store data into kernel cache of an inode NOTIFY_RETRIEVE_CACHE = -5 // retrieve data from kernel cache of an inode NOTIFY_DELETE = -6 // notify kernel that a directory entry has been deleted )
const ( WRITE_CACHE = (1 << 0) WRITE_LOCKOWNER = (1 << 1) )
const ( ENOATTR = Status(syscall.ENODATA) // On Linux, ENOATTR is an alias for ENODATA. // EREMOTEIO Remote I/O error EREMOTEIO = Status(syscall.EREMOTEIO) )
const (
// Mask for GetAttrIn.Flags. If set, GetAttrIn has a file handle set.
FUSE_GETATTR_FH = (1 << 0)
)
const (
// The kernel caps writes at 128k.
MAX_KERNEL_WRITE = 128 * 1024
)
const (
READ_LOCKOWNER = (1 << 1)
)
const RELEASE_FLUSH = (1 << 0)
Variables ¶
var FuseOpenFlagNames map[int64]string
var OpenFlagNames map[int64]string
Functions ¶
Types ¶
type Attr ¶
type Attr struct { Ino uint64 Size uint64 Blocks uint64 Atime uint64 Mtime uint64 Ctime uint64 Atimensec uint32 Mtimensec uint32 Ctimensec uint32 Mode uint32 Nlink uint32 Owner Rdev uint32 Blksize uint32 Padding uint32 }
func (*Attr) AccessTime ¶
func (*Attr) ChangeTime ¶
type AttrOut ¶
func (*AttrOut) SetTimeout ¶
type BufferPool ¶
type BufferPool interface { // AllocBuffer creates a buffer of at least the given size. After use, // it should be deallocated with FreeBuffer(). AllocBuffer(size uint32) []byte // FreeBuffer takes back a buffer if it was allocated through // AllocBuffer. It is not an error to call FreeBuffer() on a slice // obtained elsewhere. FreeBuffer(slice []byte) }
BufferPool implements explicit memory management. It is used for minimizing the GC overhead of communicating with the kernel.
func NewBufferPool ¶
func NewBufferPool() BufferPool
NewBufferPool returns a BufferPool implementation that that returns slices with capacity of a multiple of page size, which have possibly been used, and may contain random contents. When using NewBufferPool, file system handlers may not hang on to passed-in buffers beyond the handler's return.
func NewGcBufferPool ¶
func NewGcBufferPool() BufferPool
NewGcBufferPool is a fallback to the standard allocation routines.
type DirEntry ¶
type DirEntry struct { // Mode is the file's mode. Only the high bits (eg. S_IFDIR) // are considered. Mode uint32 // Name is the basename of the file in the directory. Name string // Ino is the inode number. Ino uint64 }
DirEntry is a type for PathFileSystem and NodeFileSystem to return directory contents in.
type DirEntryList ¶
type DirEntryList struct {
// contains filtered or unexported fields
}
DirEntryList holds the return value for READDIR and READDIRPLUS opcodes.
func NewDirEntryList ¶
func NewDirEntryList(data []byte, off uint64) *DirEntryList
NewDirEntryList creates a DirEntryList with the given data buffer and offset.
func (*DirEntryList) AddDirEntry ¶
func (l *DirEntryList) AddDirEntry(e DirEntry) bool
AddDirEntry tries to add an entry, and reports whether it succeeded.
func (*DirEntryList) AddDirLookupEntry ¶
func (l *DirEntryList) AddDirLookupEntry(e DirEntry) *EntryOut
AddDirLookupEntry is used for ReadDirPlus. It serializes a DirEntry and returns the space for entry. If no space is left, returns a nil pointer.
type EntryOut ¶
type EntryOut struct { NodeId uint64 Generation uint64 EntryValid uint64 AttrValid uint64 EntryValidNsec uint32 AttrValidNsec uint32 Attr }
func (*EntryOut) SetAttrTimeout ¶
func (*EntryOut) SetEntryTimeout ¶
type FallocateIn ¶
type FileLock ¶
func (*FileLock) FromFlockT ¶
type GetAttrIn ¶
type GetXAttrIn ¶
type GetXAttrOut ¶
type InitIn ¶
func (*InitIn) SupportsNotify ¶
SupportsNotify returns whether a certain notification type is supported. Pass any of the NOTIFY_* types as argument.
func (*InitIn) SupportsVersion ¶
SupportsVersion returns true if the kernel supports the given protocol version or newer.
type InterruptIn ¶
type LatencyMap ¶
This type may be provided for recording latencies of each FUSE operation.
type MountOptions ¶
type MountOptions struct { AllowOther bool // Options are passed as -o string to fusermount. Options []string // Default is _DEFAULT_BACKGROUND_TASKS, 12. This numbers // controls the allowed number of requests that relate to // async I/O. Concurrency for synchronous I/O is not limited. MaxBackground int // Write size to use. If 0, use default. This number is // capped at the kernel maximum. MaxWrite int // Max read ahead to use. If 0, use default. This number is // capped at the kernel maximum. MaxReadAhead int // If IgnoreSecurityLabels is set, all security related xattr // requests will return NO_DATA without passing through the // user defined filesystem. You should only set this if you // file system implements extended attributes, and you are not // interested in security labels. IgnoreSecurityLabels bool // ignoring labels should be provided as a fusermount mount option. // If given, use this buffer pool instead of the global one. Buffers BufferPool // If RememberInodes is set, we will never forget inodes. // This may be useful for NFS. RememberInodes bool // Values shown in "df -T" and friends // First column, "Filesystem" FsName string // Second column, "Type", will be shown as "fuse." + Name Name string // If set, wrap the file system in a single-threaded locking wrapper. SingleThreaded bool // If set, return ENOSYS for Getxattr calls, so the kernel does not issue any // Xattr operations at all. DisableXAttrs bool // If set, print debugging information. Debug bool // If set, ask kernel to forward file locks to FUSE. If using, // you must implement the GetLk/SetLk/SetLkw methods. EnableLocks bool }
type NotifyInvalDeleteOut ¶
type NotifyInvalEntryOut ¶
type NotifyInvalInodeOut ¶
type NotifyRetrieveIn ¶
type NotifyRetrieveOut ¶
type NotifyStoreOut ¶
type Owner ¶
func CurrentOwner ¶
func CurrentOwner() *Owner
type RawFileSystem ¶
type RawFileSystem interface { String() string // If called, provide debug output through the log package. SetDebug(debug bool) // Lookup is called by the kernel when the VFS wants to know // about a file inside a directory. Many lookup calls can // occur in parallel, but only one call happens for each (dir, // name) pair. Lookup(header *InHeader, name string, out *EntryOut) (status Status) // Forget is called when the kernel discards entries from its // dentry cache. This happens on unmount, and when the kernel // is short on memory. Since it is not guaranteed to occur at // any moment, and since there is no return value, Forget // should not do I/O, as there is no channel to report back // I/O errors. Forget(nodeid, nlookup uint64) // Attributes. GetAttr(input *GetAttrIn, out *AttrOut) (code Status) SetAttr(input *SetAttrIn, out *AttrOut) (code Status) // Modifying structure. Mknod(input *MknodIn, name string, out *EntryOut) (code Status) Mkdir(input *MkdirIn, name string, out *EntryOut) (code Status) Unlink(header *InHeader, name string) (code Status) Rmdir(header *InHeader, name string) (code Status) Rename(input *RenameIn, oldName string, newName string) (code Status) Link(input *LinkIn, filename string, out *EntryOut) (code Status) Symlink(header *InHeader, pointedTo string, linkName string, out *EntryOut) (code Status) Readlink(header *InHeader) (out []byte, code Status) Access(input *AccessIn) (code Status) // Extended attributes. GetXAttrSize(header *InHeader, attr string) (sz int, code Status) GetXAttrData(header *InHeader, attr string) (data []byte, code Status) ListXAttr(header *InHeader) (attributes []byte, code Status) SetXAttr(input *SetXAttrIn, attr string, data []byte) Status RemoveXAttr(header *InHeader, attr string) (code Status) // File handling. Create(input *CreateIn, name string, out *CreateOut) (code Status) Open(input *OpenIn, out *OpenOut) (status Status) Read(input *ReadIn, buf []byte) (ReadResult, Status) // File locking GetLk(input *LkIn, out *LkOut) (code Status) SetLk(input *LkIn) (code Status) SetLkw(input *LkIn) (code Status) Release(input *ReleaseIn) Write(input *WriteIn, data []byte) (written uint32, code Status) Flush(input *FlushIn) Status Fsync(input *FsyncIn) (code Status) Fallocate(input *FallocateIn) (code Status) // Directory handling OpenDir(input *OpenIn, out *OpenOut) (status Status) ReadDir(input *ReadIn, out *DirEntryList) Status ReadDirPlus(input *ReadIn, out *DirEntryList) Status ReleaseDir(input *ReleaseIn) FsyncDir(input *FsyncIn) (code Status) // StatFs(input *InHeader, out *StatfsOut) (code Status) // This is called on processing the first request. The // filesystem implementation can use the server argument to // talk back to the kernel (through notify methods). Init(*Server) }
RawFileSystem is an interface close to the FUSE wire protocol.
Unless you really know what you are doing, you should not implement this, but rather the nodefs.Node or pathfs.FileSystem interfaces; the details of getting interactions with open files, renames, and threading right etc. are somewhat tricky and not very interesting.
Each FUSE request results in a corresponding method called by Server. Several calls may be made simultaneously, because the server typically calls each method in separate goroutine.
A null implementation is provided by NewDefaultRawFileSystem.
func NewDefaultRawFileSystem ¶
func NewDefaultRawFileSystem() RawFileSystem
NewDefaultRawFileSystem returns ENOSYS (not implemented) for all operations.
func NewLockingRawFileSystem ¶
func NewLockingRawFileSystem(fs RawFileSystem) RawFileSystem
Returns a Wrap
func NewRawFileSystem ¶
func NewRawFileSystem(fs interface{}) RawFileSystem
NewRawFileSystem adds the methods missing for implementing a RawFileSystem to any object.
type ReadResult ¶
type ReadResult interface { // Returns the raw bytes for the read, possibly using the // passed buffer. The buffer should be larger than the return // value from Size. Bytes(buf []byte) ([]byte, Status) // Size returns how many bytes this return value takes at most. Size() int // Done() is called after sending the data to the kernel. Done() }
The result of Read is an array of bytes, but for performance reasons, we can also return data as a file-descriptor/offset/size tuple. If the backing store for a file is another filesystem, this reduces the amount of copying between the kernel and the FUSE server. The ReadResult interface captures both cases.
func ReadResultData ¶
func ReadResultData(b []byte) ReadResult
func ReadResultFd ¶
func ReadResultFd(fd uintptr, off int64, sz int) ReadResult
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server contains the logic for reading from the FUSE device and translating it to RawFileSystem interface calls.
func NewServer ¶
func NewServer(fs RawFileSystem, mountPoint string, opts *MountOptions) (*Server, error)
NewServer creates a server and attaches it to the given directory.
func (*Server) DeleteNotify ¶
DeleteNotify notifies the kernel that an entry is removed from a directory. In many cases, this is equivalent to EntryNotify, except when the directory is in use, eg. as working directory of some process. You should not hold any FUSE filesystem locks, as that can lead to deadlock.
func (*Server) EntryNotify ¶
EntryNotify should be used if the existence status of an entry within a directory changes. You should not hold any FUSE filesystem locks, as that can lead to deadlock.
func (*Server) InodeNotify ¶
InodeNotify invalidates the information associated with the inode (ie. data cache, attributes, etc.)
func (*Server) InodeNotifyStoreCache ¶
InodeNotifyStoreCache tells kernel to store data into inode's cache.
This call is similar to InodeNotify, but instead of only invalidating a data region, it gives updated data directly to the kernel.
func (*Server) InodeRetrieveCache ¶
InodeRetrieveCache retrieves data from kernel's inode cache.
InodeRetrieveCache asks kernel to return data from its cache for inode at [offset:offset+len(dest)) and waits for corresponding reply. If kernel cache has fewer consecutive data starting at offset, that fewer amount is returned. In particular if inode data at offset is not cached (0, OK) is returned.
The kernel returns ENOENT if it does not currently have entry for this inode in its dentry cache.
func (*Server) KernelSettings ¶
KernelSettings returns the Init message from the kernel, so filesystems can adapt to availability of features of the kernel driver. The message should not be altered.
func (*Server) RecordLatencies ¶
func (ms *Server) RecordLatencies(l LatencyMap)
RecordLatencies switches on collection of timing for each request coming from the kernel.P assing a nil argument switches off the
func (*Server) Serve ¶
func (ms *Server) Serve()
Serve initiates the FUSE loop. Normally, callers should run Serve() and wait for it to exit, but tests will want to run this in a goroutine.
Each filesystem operation executes in a separate goroutine.
type SetAttrIn ¶
type SetAttrIn struct {
SetAttrInCommon
}
type SetAttrInCommon ¶
type SetAttrInCommon struct { InHeader Valid uint32 Padding uint32 Fh uint64 Size uint64 LockOwner uint64 Atime uint64 Mtime uint64 Ctime uint64 Atimensec uint32 Mtimensec uint32 Ctimensec uint32 Mode uint32 Unused4 uint32 Owner Unused5 uint32 }
func (*SetAttrInCommon) GetFh ¶
func (s *SetAttrInCommon) GetFh() (uint64, bool)
func (*SetAttrInCommon) GetGID ¶
func (s *SetAttrInCommon) GetGID() (uint32, bool)
func (*SetAttrInCommon) GetMode ¶
func (s *SetAttrInCommon) GetMode() (uint32, bool)
func (*SetAttrInCommon) GetSize ¶
func (s *SetAttrInCommon) GetSize() (uint64, bool)
func (*SetAttrInCommon) GetUID ¶
func (s *SetAttrInCommon) GetUID() (uint32, bool)
type SetXAttrIn ¶
type StatfsOut ¶
type StatfsOut struct { Blocks uint64 Bfree uint64 Bavail uint64 Files uint64 Ffree uint64 Bsize uint32 NameLen uint32 Frsize uint32 Padding uint32 Spare [6]uint32 }
func (*StatfsOut) FromStatfsT ¶
type Status ¶
type Status int32
Status is the errno number that a FUSE call returns to the kernel.
Source Files ¶
- api.go
- attr.go
- attr_linux.go
- bufferpool.go
- constants.go
- constants_linux.go
- defaultraw.go
- direntry.go
- lockingfs.go
- misc.go
- mount_linux.go
- opcode.go
- poll.go
- poll_linux.go
- print.go
- print_linux.go
- read.go
- request.go
- request_linux.go
- server.go
- server_linux.go
- splice_linux.go
- syscall_linux.go
- typeprint.go
- types.go
- types_linux.go
- upgrade.go
Directories ¶
Path | Synopsis |
---|---|
The nodefs package offers a high level API that resembles the kernel's idea of what an FS looks like.
|
The nodefs package offers a high level API that resembles the kernel's idea of what an FS looks like. |
Package test holds the tests for Go-FUSE and is not for end-user consumption.
|
Package test holds the tests for Go-FUSE and is not for end-user consumption. |