diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-06 12:11:41 -0600 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2022-07-08 00:16:01 -0600 |
commit | 2878002388509b30d36ff90283b5349ff2096b7b (patch) | |
tree | f5e916a4ca65f6fbae6b5f9953908dbe69399ceb /cmd/btrfs-mount/fuseutil.go | |
parent | 12d10ff2e3317c280e5f6ebfd913c73a6a1d896b (diff) |
Get subvolume mounting/unmounting working way better
Diffstat (limited to 'cmd/btrfs-mount/fuseutil.go')
-rw-r--r-- | cmd/btrfs-mount/fuseutil.go | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/cmd/btrfs-mount/fuseutil.go b/cmd/btrfs-mount/fuseutil.go new file mode 100644 index 0000000..c89e4b2 --- /dev/null +++ b/cmd/btrfs-mount/fuseutil.go @@ -0,0 +1,51 @@ +package main + +import ( + "context" + "sync/atomic" + + "github.com/datawire/dlib/dcontext" + "github.com/datawire/dlib/dgroup" + "github.com/datawire/dlib/dlog" + "github.com/jacobsa/fuse" +) + +func Mount(ctx context.Context, mountpoint string, server fuse.Server, cfg *fuse.MountConfig) error { + grp := dgroup.NewGroup(ctx, dgroup.GroupConfig{ + // Allow mountHandle.Join() returning to cause the + // "unmount" goroutine to quit. + ShutdownOnNonError: true, + }) + mounted := uint32(1) + grp.Go("unmount", func(ctx context.Context) error { + <-ctx.Done() + var err error + var gotNil bool + // Keep retrying, because the FS might be busy. + for atomic.LoadUint32(&mounted) != 0 { + if _err := fuse.Unmount(mountpoint); _err == nil { + gotNil = true + } else if !gotNil { + err = _err + } + } + if gotNil { + return nil + } + return err + }) + grp.Go("mount", func(ctx context.Context) error { + defer atomic.StoreUint32(&mounted, 0) + + cfg.OpContext = ctx + cfg.ErrorLogger = dlog.StdLogger(ctx, dlog.LogLevelError) + cfg.DebugLogger = dlog.StdLogger(ctx, dlog.LogLevelDebug) + + mountHandle, err := fuse.Mount(mountpoint, server, cfg) + if err != nil { + return err + } + return mountHandle.Join(dcontext.HardContext(ctx)) + }) + return grp.Wait() +} |