mirrorfs

package module
v0.0.0-...-cd50412 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 9, 2017 License: MIT Imports: 15 Imported by: 0

README

MirrorFS

A simple FUSE file system that mirrors operations from the mounted directory to another directory.

Usage

Clone the repository into your $GOPATH or install as follows:

$ go get github.com/bbengfort/...

If you've run go install (by default with go get) then you should have the mirrorfs command:

$ mirrorfs mount path/to/mount path/to/mirror

All operations in path/to/mount will be mirrored to path/to/mirror and vice-versa.

Fuse Implementation

The bazil.org/fuse implementation has many interfaces for various FUSE requests and responses that may overlap. For example ReadAll will supersede Read if implemented (serve.go L1228). A full inspection of the handleRequest method is required to understand the full FUSE response handling by the Bazil implementation.

MirrorFS implements the following methods/interfaces:

  • (*FileSystem) Root() (fusefs.Node, error)
  • (*Node) Attr(ctx context.Context, attr *fuse.Attr) error
  • (*Node) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error
  • (*Node) Lookup(ctx context.Context, name string) (fusefs.Node, error)
  • (*Node) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error)
  • (*Node) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fusefs.Node, error)
  • (*Node) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error)
  • (*Node) Remove(ctx context.Context, req *fuse.RemoveRequest) error
  • (*Node) Rename(ctx context.Context, req *fuse.RenameRequest, newDir fusefs.Node) error
  • (*Node) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error
  • (*Node) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error
  • (*Node) Fsync(ctx context.Context, req *fuse.FsyncRequest) error
  • (*Node) Flush(ctx context.Context, req *fuse.FlushRequest) error
  • (*Node) Release(ctx context.Context, req *fuse.ReleaseRequest) error
Notes
  • If Getattr is not implemented will use Attr and fill in zero values.
  • Setattr is used to communicate changes to a file size, e.g. truncate.
  • Create creates and opens a file handle; the node is also used as a handle since it has an open reference to the file object in mirror.
  • If Open is not implemented it will always succeed and the node itself will be returned as the handle.
  • Fsync is a low level op, telling the OS to flush its buffers to physical media. Flush tells an application to flush its internal buffers out to the OS.
Reference

This section contains a complete listing of interfaces that can be implemented by a bazil.org/fuse application. Note that syscall error numbers can be found here.

FS Interfaces
  • Root() (Node, error)
  • Destroy()
  • GenerateInode(parentInode uint64, name string) uint64
  • Statfs(ctx context.Context, req *fuse.StatfsRequest, resp *fuse.StatfsResponse) error
Node Interfaces
  • Attr(ctx context.Context, attr *fuse.Attr) error
  • Access(ctx context.Context, req *fuse.AccessRequest) error
  • Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (Node, Handle, error)
  • Forget()
  • Fsync(ctx context.Context, req *fuse.FsyncRequest) error
  • Getattr(ctx context.Context, req *fuse.GetattrRequest, resp *fuse.GetattrResponse) error
  • Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error
  • Link(ctx context.Context, req *fuse.LinkRequest, old Node) (Node, error)
  • Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error
  • Mkdir(ctx context.Context, req *fuse.MkdirRequest) (Node, error)
  • Mknod(ctx context.Context, req *fuse.MknodRequest) (Node, error)
  • Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (Handle, error)
  • Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error)
  • Remove(ctx context.Context, req *fuse.RemoveRequest) error
  • Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error
  • Rename(ctx context.Context, req *fuse.RenameRequest, newDir Node) error
  • Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (Node, error)
  • Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error
  • Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error
  • Lookup(ctx context.Context, name string) (Node, error)
  • Symlink(ctx context.Context, req *fuse.SymlinkRequest) (Node, error)
Handle Interfaces
  • Flush(ctx context.Context, req *fuse.FlushRequest) error
  • ReadAll(ctx context.Context) ([]byte, error)
  • ReadDirAll(ctx context.Context) ([]fuse.Dirent, error)
  • Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error
  • Release(ctx context.Context, req *fuse.ReleaseRequest) error
  • Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error

Documentation

Index

Constants

View Source
const (
	Trace uint8 = iota
	Debug
	Info
	Caution
	Status
	Warn
	Silent
)

Levels for implementing the debug and trace message functionality.

View Source
const CautionThreshold = 10

CautionThreshold for issuing caution logs after accumulating cautions.

Variables

This section is empty.

Functions

func LogLevel

func LogLevel() string

LogLevel returns a string representation of the current level

func Mount

func Mount(mount, mirror string) (err error)

Mount the mirror file system at the specified path, mirroring to the other path. This returns an error if the mount point does not exist.

func SetLogLevel

func SetLogLevel(level uint8)

SetLogLevel modifies the log level for messages at runtime. Ensures that the highest level that can be set is the trace level.

Types

type FileSystem

type FileSystem struct {
	// contains filtered or unexported fields
}

FileSystem implements fusefs.FS* interfaces.

func NewFS

func NewFS(mount, mirror string, abs bool) *FileSystem

NewFS returns a new FileSystem object

func (FileSystem) Root

func (fs FileSystem) Root() (fusefs.Node, error)

Root implements fusefs.FS

type Node

type Node struct {
	// contains filtered or unexported fields
}

Node implements the fuse.Node methods.

func (*Node) Attr

func (n *Node) Attr(ctx context.Context, attr *fuse.Attr) error

Attr implements the fuse.Node interface (also used for Getattr)

func (*Node) Create

func (n *Node) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error)

Create implements fuse.NodeCreater

func (*Node) Flush

func (n *Node) Flush(ctx context.Context, req *fuse.FlushRequest) error

Flush implments fuse.HandleFlusher

func (*Node) Fsync

func (n *Node) Fsync(ctx context.Context, req *fuse.FsyncRequest) error

Fsync implements fuse.HandleFsyncer

func (*Node) Lookup

func (n *Node) Lookup(ctx context.Context, name string) (fs.Node, error)

Lookup implements the fuse.NodeRequestLookuper interface.

func (*Node) Mkdir

func (n *Node) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error)

Mkdir implements fuse.NodeMkdirer

func (*Node) Open

func (n *Node) Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (fs.Handle, error)

Open implements fuse.NodeOpener

func (*Node) Read

func (n *Node) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) (err error)

Read implements fuse.HandleReader

func (*Node) ReadDirAll

func (n *Node) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error)

ReadDirAll implements the fuse.HandleReadDirAller interface.

func (*Node) Release

func (n *Node) Release(ctx context.Context, req *fuse.ReleaseRequest) error

Release implements fuse.HandleReleaser

func (*Node) Remove

func (n *Node) Remove(ctx context.Context, req *fuse.RemoveRequest) error

Remove implements fuse.NodeRemover

func (*Node) Rename

func (n *Node) Rename(ctx context.Context, req *fuse.RenameRequest, newDir fs.Node) error

Rename implements fuse.NodeRenamer

func (*Node) Setattr

func (n *Node) Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error

Setattr implements the fuse.NodeSetattrer interface

func (*Node) Write

func (n *Node) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) (err error)

Write implements fuse.HandleWriter

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL