aboutsummaryrefslogtreecommitdiff
path: root/weed/mount/inode_to_path.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/mount/inode_to_path.go')
-rw-r--r--weed/mount/inode_to_path.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/weed/mount/inode_to_path.go b/weed/mount/inode_to_path.go
new file mode 100644
index 000000000..04366ab0d
--- /dev/null
+++ b/weed/mount/inode_to_path.go
@@ -0,0 +1,61 @@
+package mount
+
+import (
+ "github.com/chrislusf/seaweedfs/weed/glog"
+ "github.com/chrislusf/seaweedfs/weed/util"
+ "sync"
+)
+
+type InodeToPath struct {
+ sync.RWMutex
+ nextInodeId uint64
+ inode2path map[uint64]util.FullPath
+ path2inode map[util.FullPath]uint64
+}
+
+func NewInodeToPath() *InodeToPath {
+ return &InodeToPath{
+ inode2path: make(map[uint64]util.FullPath),
+ path2inode: make(map[util.FullPath]uint64),
+ nextInodeId: 2, // the root inode id is 1
+ }
+}
+
+func (i *InodeToPath) GetInode(path util.FullPath) uint64 {
+ if path == "/" {
+ return 1
+ }
+ i.Lock()
+ defer i.Unlock()
+ inode, found := i.path2inode[path]
+ if !found {
+ inode = i.nextInodeId
+ i.nextInodeId++
+ i.path2inode[path] = inode
+ i.inode2path[inode] = path
+ }
+ return inode
+}
+
+func (i *InodeToPath) GetPath(inode uint64) util.FullPath {
+ if inode == 1 {
+ return "/"
+ }
+ i.RLock()
+ defer i.RUnlock()
+ path, found := i.inode2path[inode]
+ if !found {
+ glog.Fatal("not found inode %d", inode)
+ }
+ return path
+}
+
+func (i *InodeToPath) HasPath(path util.FullPath) bool {
+ if path == "/" {
+ return true
+ }
+ i.RLock()
+ defer i.RUnlock()
+ _, found := i.path2inode[path]
+ return found
+}