diff --git a/weed/mount/filehandle.go b/weed/mount/filehandle.go index f2a2ec69c..770e89a10 100644 --- a/weed/mount/filehandle.go +++ b/weed/mount/filehandle.go @@ -49,7 +49,8 @@ func newFileHandle(wfs *WFS, handleId FileHandleId, inode uint64, entry *filer_p } func (fh *FileHandle) FullPath() util.FullPath { - return fh.wfs.inodeToPath.GetPath(fh.inode) + fp, _ := fh.wfs.inodeToPath.GetPath(fh.inode) + return fp } func (fh *FileHandle) addChunks(chunks []*filer_pb.FileChunk) { diff --git a/weed/mount/inode_to_path.go b/weed/mount/inode_to_path.go index edea91a5d..ae95730e1 100644 --- a/weed/mount/inode_to_path.go +++ b/weed/mount/inode_to_path.go @@ -3,6 +3,7 @@ package mount import ( "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/util" + "github.com/hanwen/go-fuse/v2/fuse" "sync" ) @@ -65,14 +66,14 @@ func (i *InodeToPath) GetInode(path util.FullPath) uint64 { return inode } -func (i *InodeToPath) GetPath(inode uint64) util.FullPath { +func (i *InodeToPath) GetPath(inode uint64) (util.FullPath, fuse.Status) { i.RLock() defer i.RUnlock() path, found := i.inode2path[inode] if !found { - glog.Fatalf("not found inode %d", inode) + return "", fuse.ENOENT } - return path.FullPath + return path.FullPath, fuse.OK } func (i *InodeToPath) HasPath(path util.FullPath) bool { diff --git a/weed/mount/weedfs.go b/weed/mount/weedfs.go index b070fdd6c..1ec74b9e4 100644 --- a/weed/mount/weedfs.go +++ b/weed/mount/weedfs.go @@ -2,6 +2,7 @@ package mount import ( "context" + "fmt" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/mount/meta_cache" "github.com/chrislusf/seaweedfs/weed/pb" @@ -110,7 +111,10 @@ func (wfs *WFS) String() string { } func (wfs *WFS) maybeReadEntry(inode uint64) (path util.FullPath, fh *FileHandle, entry *filer_pb.Entry, status fuse.Status) { - path = wfs.inodeToPath.GetPath(inode) + path, status = wfs.inodeToPath.GetPath(inode) + if status != fuse.OK { + return + } var found bool if fh, found = wfs.fhmap.FindFileHandle(inode); found { return path, fh, fh.entry, fuse.OK diff --git a/weed/mount/weedfs_dir_lookup.go b/weed/mount/weedfs_dir_lookup.go index 852e08444..4eceb5ce4 100644 --- a/weed/mount/weedfs_dir_lookup.go +++ b/weed/mount/weedfs_dir_lookup.go @@ -20,7 +20,10 @@ func (wfs *WFS) Lookup(cancel <-chan struct{}, header *fuse.InHeader, name strin return s } - dirPath := wfs.inodeToPath.GetPath(header.NodeId) + dirPath, code := wfs.inodeToPath.GetPath(header.NodeId) + if code != fuse.OK { + return + } fullFilePath := dirPath.Child(name) diff --git a/weed/mount/weedfs_dir_mkrm.go b/weed/mount/weedfs_dir_mkrm.go index 17b70cacd..a73bb3c2a 100644 --- a/weed/mount/weedfs_dir_mkrm.go +++ b/weed/mount/weedfs_dir_mkrm.go @@ -37,7 +37,10 @@ func (wfs *WFS) Mkdir(cancel <-chan struct{}, in *fuse.MkdirIn, name string, out }, } - dirFullPath := wfs.inodeToPath.GetPath(in.NodeId) + dirFullPath, code := wfs.inodeToPath.GetPath(in.NodeId) + if code != fuse.OK { + return + } entryFullPath := dirFullPath.Child(name) @@ -89,7 +92,10 @@ func (wfs *WFS) Rmdir(cancel <-chan struct{}, header *fuse.InHeader, name string return fuse.Status(syscall.ENOTEMPTY) } - dirFullPath := wfs.inodeToPath.GetPath(header.NodeId) + dirFullPath, code := wfs.inodeToPath.GetPath(header.NodeId) + if code != fuse.OK { + return + } entryFullPath := dirFullPath.Child(name) glog.V(3).Infof("remove directory: %v", entryFullPath) diff --git a/weed/mount/weedfs_dir_read.go b/weed/mount/weedfs_dir_read.go index a14f4d960..9e8587995 100644 --- a/weed/mount/weedfs_dir_read.go +++ b/weed/mount/weedfs_dir_read.go @@ -142,7 +142,10 @@ func (wfs *WFS) doReadDirectory(input *fuse.ReadIn, out *fuse.DirEntryList, isPl } isEarlyTerminated := false - dirPath := wfs.inodeToPath.GetPath(input.NodeId) + dirPath, code := wfs.inodeToPath.GetPath(input.NodeId) + if code != fuse.OK { + return code + } var dirEntry fuse.DirEntry if input.Offset == 0 { diff --git a/weed/mount/weedfs_file_mkrm.go b/weed/mount/weedfs_file_mkrm.go index 032008a85..6c06e1947 100644 --- a/weed/mount/weedfs_file_mkrm.go +++ b/weed/mount/weedfs_file_mkrm.go @@ -54,7 +54,10 @@ func (wfs *WFS) Mknod(cancel <-chan struct{}, in *fuse.MknodIn, name string, out }, } - dirFullPath := wfs.inodeToPath.GetPath(in.NodeId) + dirFullPath, code := wfs.inodeToPath.GetPath(in.NodeId) + if code != fuse.OK { + return + } entryFullPath := dirFullPath.Child(name) @@ -99,7 +102,10 @@ func (wfs *WFS) Mknod(cancel <-chan struct{}, in *fuse.MknodIn, name string, out /** Remove a file */ func (wfs *WFS) Unlink(cancel <-chan struct{}, header *fuse.InHeader, name string) (code fuse.Status) { - dirFullPath := wfs.inodeToPath.GetPath(header.NodeId) + dirFullPath, code := wfs.inodeToPath.GetPath(header.NodeId) + if code != fuse.OK { + return + } entryFullPath := dirFullPath.Child(name) entry, status := wfs.maybeLoadEntry(entryFullPath) diff --git a/weed/mount/weedfs_link.go b/weed/mount/weedfs_link.go index 7cc98b3e6..4e8559e72 100644 --- a/weed/mount/weedfs_link.go +++ b/weed/mount/weedfs_link.go @@ -21,8 +21,14 @@ func (wfs *WFS) Link(cancel <-chan struct{}, in *fuse.LinkIn, name string, out * return s } - newParentPath := wfs.inodeToPath.GetPath(in.NodeId) - oldEntryPath := wfs.inodeToPath.GetPath(in.Oldnodeid) + newParentPath, code := wfs.inodeToPath.GetPath(in.NodeId) + if code != fuse.OK { + return + } + oldEntryPath, code := wfs.inodeToPath.GetPath(in.Oldnodeid) + if code != fuse.OK { + return + } oldParentPath, _ := oldEntryPath.DirAndName() oldEntry, status := wfs.maybeLoadEntry(oldEntryPath) diff --git a/weed/mount/weedfs_rename.go b/weed/mount/weedfs_rename.go index 9e461abce..9c83a4b94 100644 --- a/weed/mount/weedfs_rename.go +++ b/weed/mount/weedfs_rename.go @@ -145,9 +145,15 @@ func (wfs *WFS) Rename(cancel <-chan struct{}, in *fuse.RenameIn, oldName string return fuse.EINVAL } - oldDir := wfs.inodeToPath.GetPath(in.NodeId) + oldDir, code := wfs.inodeToPath.GetPath(in.NodeId) + if code != fuse.OK { + return + } oldPath := oldDir.Child(oldName) - newDir := wfs.inodeToPath.GetPath(in.Newdir) + newDir, code := wfs.inodeToPath.GetPath(in.Newdir) + if code != fuse.OK { + return + } newPath := newDir.Child(newName) glog.V(4).Infof("dir Rename %s => %s", oldPath, newPath) diff --git a/weed/mount/weedfs_symlink.go b/weed/mount/weedfs_symlink.go index 66d956a91..44477d765 100644 --- a/weed/mount/weedfs_symlink.go +++ b/weed/mount/weedfs_symlink.go @@ -18,7 +18,10 @@ func (wfs *WFS) Symlink(cancel <-chan struct{}, header *fuse.InHeader, target st return s } - dirPath := wfs.inodeToPath.GetPath(header.NodeId) + dirPath, code := wfs.inodeToPath.GetPath(header.NodeId) + if code != fuse.OK { + return + } entryFullPath := dirPath.Child(name) request := &filer_pb.CreateEntryRequest{ @@ -64,7 +67,10 @@ func (wfs *WFS) Symlink(cancel <-chan struct{}, header *fuse.InHeader, target st } func (wfs *WFS) Readlink(cancel <-chan struct{}, header *fuse.InHeader) (out []byte, code fuse.Status) { - entryFullPath := wfs.inodeToPath.GetPath(header.NodeId) + entryFullPath, code := wfs.inodeToPath.GetPath(header.NodeId) + if code != fuse.OK { + return + } entry, status := wfs.maybeLoadEntry(entryFullPath) if status != fuse.OK {