summaryrefslogtreecommitdiff
path: root/cmd/btrfs-mount/subvol_fuse.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/btrfs-mount/subvol_fuse.go')
-rw-r--r--cmd/btrfs-mount/subvol_fuse.go51
1 files changed, 39 insertions, 12 deletions
diff --git a/cmd/btrfs-mount/subvol_fuse.go b/cmd/btrfs-mount/subvol_fuse.go
index 6f3f267..1163e9f 100644
--- a/cmd/btrfs-mount/subvol_fuse.go
+++ b/cmd/btrfs-mount/subvol_fuse.go
@@ -6,6 +6,9 @@ import (
"sync/atomic"
"syscall"
+ "github.com/datawire/dlib/dcontext"
+ "github.com/datawire/dlib/dlog"
+ "github.com/jacobsa/fuse"
"github.com/jacobsa/fuse/fuseops"
"github.com/jacobsa/fuse/fuseutil"
@@ -15,21 +18,45 @@ import (
)
type dirState struct {
- Dir *dir
+ Dir *btrfs.Dir
}
type fileState struct {
- File *file
+ File *btrfs.File
}
-type subvolumeFUSE struct {
+type Subvolume struct {
+ btrfs.Subvolume
+ DeviceName string
+ Mountpoint string
+
fuseutil.NotImplementedFileSystem
lastHandle uint64
dirHandles util.SyncMap[fuseops.HandleID, *dirState]
fileHandles util.SyncMap[fuseops.HandleID, *fileState]
}
-func (sv *subvolumeFUSE) newHandle() fuseops.HandleID {
+func (sv *Subvolume) Run(ctx context.Context) error {
+ mount, err := fuse.Mount(
+ sv.Mountpoint,
+ fuseutil.NewFileSystemServer(sv),
+ &fuse.MountConfig{
+ OpContext: ctx,
+ ErrorLogger: dlog.StdLogger(ctx, dlog.LogLevelError),
+ DebugLogger: dlog.StdLogger(ctx, dlog.LogLevelDebug),
+
+ FSName: sv.DeviceName,
+ Subtype: "btrfs",
+
+ ReadOnly: true,
+ })
+ if err != nil {
+ return err
+ }
+ return mount.Join(dcontext.HardContext(ctx))
+}
+
+func (sv *Subvolume) newHandle() fuseops.HandleID {
return fuseops.HandleID(atomic.AddUint64(&sv.lastHandle, 1))
}
@@ -73,14 +100,14 @@ func (sv *Subvolume) StatFS(_ context.Context, op *fuseops.StatFSOp) error {
func (sv *Subvolume) LookUpInode(_ context.Context, op *fuseops.LookUpInodeOp) error {
if op.Parent == fuseops.RootInodeID {
- parent, err := sv.getRootInode()
+ parent, err := sv.GetRootInode()
if err != nil {
return err
}
op.Parent = fuseops.InodeID(parent)
}
- dir, err := sv.loadDir(btrfs.ObjID(op.Parent))
+ dir, err := sv.LoadDir(btrfs.ObjID(op.Parent))
if err != nil {
return err
}
@@ -91,7 +118,7 @@ func (sv *Subvolume) LookUpInode(_ context.Context, op *fuseops.LookUpInodeOp) e
if entry.Location.ItemType != btrfsitem.INODE_ITEM_KEY {
return fmt.Errorf("child %q is not an inode: %w", op.Name, syscall.ENOSYS)
}
- bareInode, err := sv.loadBareInode(entry.Location.ObjectID)
+ bareInode, err := sv.LoadBareInode(entry.Location.ObjectID)
if err != nil {
return err
}
@@ -105,14 +132,14 @@ func (sv *Subvolume) LookUpInode(_ context.Context, op *fuseops.LookUpInodeOp) e
func (sv *Subvolume) GetInodeAttributes(_ context.Context, op *fuseops.GetInodeAttributesOp) error {
if op.Inode == fuseops.RootInodeID {
- inode, err := sv.getRootInode()
+ inode, err := sv.GetRootInode()
if err != nil {
return err
}
op.Inode = fuseops.InodeID(inode)
}
- bareInode, err := sv.loadBareInode(btrfs.ObjID(op.Inode))
+ bareInode, err := sv.LoadBareInode(btrfs.ObjID(op.Inode))
if err != nil {
return err
}
@@ -123,14 +150,14 @@ func (sv *Subvolume) GetInodeAttributes(_ context.Context, op *fuseops.GetInodeA
func (sv *Subvolume) OpenDir(_ context.Context, op *fuseops.OpenDirOp) error {
if op.Inode == fuseops.RootInodeID {
- inode, err := sv.getRootInode()
+ inode, err := sv.GetRootInode()
if err != nil {
return err
}
op.Inode = fuseops.InodeID(inode)
}
- dir, err := sv.loadDir(btrfs.ObjID(op.Inode))
+ dir, err := sv.LoadDir(btrfs.ObjID(op.Inode))
if err != nil {
return err
}
@@ -184,7 +211,7 @@ func (sv *Subvolume) ReleaseDirHandle(_ context.Context, op *fuseops.ReleaseDirH
}
func (sv *Subvolume) OpenFile(_ context.Context, op *fuseops.OpenFileOp) error {
- file, err := sv.loadFile(btrfs.ObjID(op.Inode))
+ file, err := sv.LoadFile(btrfs.ObjID(op.Inode))
if err != nil {
return err
}