aboutsummaryrefslogtreecommitdiff
path: root/weed
diff options
context:
space:
mode:
Diffstat (limited to 'weed')
-rw-r--r--weed/mount/inode_to_path.go16
-rw-r--r--weed/mount/weedfs.go6
2 files changed, 20 insertions, 2 deletions
diff --git a/weed/mount/inode_to_path.go b/weed/mount/inode_to_path.go
index 0c34b2ab4..c287f4791 100644
--- a/weed/mount/inode_to_path.go
+++ b/weed/mount/inode_to_path.go
@@ -5,6 +5,7 @@ import (
"github.com/chrislusf/seaweedfs/weed/util"
"github.com/hanwen/go-fuse/v2/fuse"
"sync"
+ "time"
)
type InodeToPath struct {
@@ -52,6 +53,21 @@ func NewInodeToPath(root util.FullPath) *InodeToPath {
return t
}
+// EnsurePath make sure the full path is tracked, used by symlink.
+func (i *InodeToPath) EnsurePath(path util.FullPath, isDirectory bool) bool {
+ for {
+ dir, _ := path.DirAndName()
+ if dir == "/" {
+ return true
+ }
+ if i.EnsurePath(util.FullPath(dir), true) {
+ i.Lookup(path, time.Now().Unix(), isDirectory, false, 0, false)
+ return true
+ }
+ }
+ return false
+}
+
func (i *InodeToPath) Lookup(path util.FullPath, unixTime int64, isDirectory bool, isHardlink bool, possibleInode uint64, isLookup bool) uint64 {
i.Lock()
defer i.Unlock()
diff --git a/weed/mount/weedfs.go b/weed/mount/weedfs.go
index d7516b6c1..f360594f9 100644
--- a/weed/mount/weedfs.go
+++ b/weed/mount/weedfs.go
@@ -144,8 +144,10 @@ func (wfs *WFS) maybeReadEntry(inode uint64, followSymLink bool) (path util.Full
if entry != nil && entry.Attributes != nil && entry.Attributes.Inode != 0 {
targetInode = entry.Attributes.Inode
}
- target := filepath.Join(string(path), "../"+entry.Attributes.SymlinkTarget)
- entry, status = wfs.maybeLoadEntry(util.FullPath(target))
+ target := util.FullPath(filepath.Join(string(path), "../"+entry.Attributes.SymlinkTarget))
+ targetParent, _ := target.DirAndName()
+ wfs.inodeToPath.EnsurePath(util.FullPath(targetParent), true)
+ entry, status = wfs.maybeLoadEntry(target)
}
return
}