diff --git a/internal/fuse/root.go b/internal/fuse/root.go index 5a14b374f..63ab96d6d 100644 --- a/internal/fuse/root.go +++ b/internal/fuse/root.go @@ -27,7 +27,6 @@ type Config struct { type Root struct { repo restic.Repository cfg Config - inode uint64 blobCache *bloblru.Cache *SnapshotsDir @@ -50,7 +49,6 @@ func NewRoot(repo restic.Repository, cfg Config) *Root { root := &Root{ repo: repo, - inode: rootInode, cfg: cfg, blobCache: bloblru.New(blobCacheSize), } @@ -70,7 +68,7 @@ func NewRoot(repo restic.Repository, cfg Config) *Root { } } - root.SnapshotsDir = NewSnapshotsDir(root, rootInode, NewSnapshotsDirStructure(root, cfg.PathTemplates, cfg.TimeTemplate), "") + root.SnapshotsDir = NewSnapshotsDir(root, rootInode, rootInode, NewSnapshotsDirStructure(root, cfg.PathTemplates, cfg.TimeTemplate), "") return root } diff --git a/internal/fuse/snapshots_dir.go b/internal/fuse/snapshots_dir.go index e5b18b20f..34bcccc4d 100644 --- a/internal/fuse/snapshots_dir.go +++ b/internal/fuse/snapshots_dir.go @@ -17,10 +17,11 @@ import ( // SnapshotsDir is a actual fuse directory generated from SnapshotsDirStructure // It uses the saved prefix to select the corresponding MetaDirData. type SnapshotsDir struct { - root *Root - inode uint64 - dirStruct *SnapshotsDirStructure - prefix string + root *Root + inode uint64 + parentInode uint64 + dirStruct *SnapshotsDirStructure + prefix string } // ensure that *SnapshotsDir implements these interfaces @@ -28,13 +29,14 @@ var _ = fs.HandleReadDirAller(&SnapshotsDir{}) var _ = fs.NodeStringLookuper(&SnapshotsDir{}) // NewSnapshotsDir returns a new directory structure containing snapshots and "latest" links -func NewSnapshotsDir(root *Root, inode uint64, dirStruct *SnapshotsDirStructure, prefix string) *SnapshotsDir { +func NewSnapshotsDir(root *Root, inode, parentInode uint64, dirStruct *SnapshotsDirStructure, prefix string) *SnapshotsDir { debug.Log("create snapshots dir, inode %d", inode) return &SnapshotsDir{ - root: root, - inode: inode, - dirStruct: dirStruct, - prefix: prefix, + root: root, + inode: inode, + parentInode: parentInode, + dirStruct: dirStruct, + prefix: prefix, } } @@ -68,7 +70,7 @@ func (d *SnapshotsDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { Type: fuse.DT_Dir, }, { - Inode: d.root.inode, + Inode: d.parentInode, Name: "..", Type: fuse.DT_Dir, }, @@ -107,7 +109,7 @@ func (d *SnapshotsDir) Lookup(ctx context.Context, name string) (fs.Node, error) } else if entry.snapshot != nil { return newDirFromSnapshot(ctx, d.root, fs.GenerateDynamicInode(d.inode, name), entry.snapshot) } else { - return NewSnapshotsDir(d.root, fs.GenerateDynamicInode(d.inode, name), d.dirStruct, d.prefix+"/"+name), nil + return NewSnapshotsDir(d.root, fs.GenerateDynamicInode(d.inode, name), d.inode, d.dirStruct, d.prefix+"/"+name), nil } }