chrislu
3 years ago
3 changed files with 102 additions and 13 deletions
@ -0,0 +1,71 @@ |
|||||
|
package mount |
||||
|
|
||||
|
import ( |
||||
|
"context" |
||||
|
"github.com/chrislusf/seaweedfs/weed/filer" |
||||
|
"github.com/chrislusf/seaweedfs/weed/filesys/meta_cache" |
||||
|
"github.com/chrislusf/seaweedfs/weed/glog" |
||||
|
"github.com/hanwen/go-fuse/v2/fuse" |
||||
|
"math" |
||||
|
) |
||||
|
|
||||
|
// Directory handling
|
||||
|
|
||||
|
func (wfs *WFS) OpenDir(cancel <-chan struct{}, input *fuse.OpenIn, out *fuse.OpenOut) (code fuse.Status) { |
||||
|
return fuse.OK |
||||
|
} |
||||
|
func (wfs *WFS) ReleaseDir(input *fuse.ReleaseIn) { |
||||
|
} |
||||
|
func (wfs *WFS) FsyncDir(cancel <-chan struct{}, input *fuse.FsyncIn) (code fuse.Status) { |
||||
|
return fuse.OK |
||||
|
} |
||||
|
|
||||
|
func (wfs *WFS) ReadDir(cancel <-chan struct{}, input *fuse.ReadIn, out *fuse.DirEntryList) (code fuse.Status) { |
||||
|
return wfs.doReadDirectory(input, out, false) |
||||
|
} |
||||
|
|
||||
|
func (wfs *WFS) ReadDirPlus(cancel <-chan struct{}, input *fuse.ReadIn, out *fuse.DirEntryList) (code fuse.Status) { |
||||
|
return wfs.doReadDirectory(input, out, true) |
||||
|
} |
||||
|
|
||||
|
func (wfs *WFS) doReadDirectory(input *fuse.ReadIn, out *fuse.DirEntryList, isPlusMode bool) fuse.Status { |
||||
|
dirPath := wfs.inodeToPath.GetPath(input.NodeId) |
||||
|
|
||||
|
var dirEntry fuse.DirEntry |
||||
|
processEachEntryFn := func(entry *filer.Entry, isLast bool) bool { |
||||
|
dirEntry.Name = entry.Name() |
||||
|
inode := wfs.inodeToPath.GetInode(dirPath.Child(dirEntry.Name)) |
||||
|
dirEntry.Ino = inode |
||||
|
dirEntry.Mode = toSystemMode(entry.Mode) |
||||
|
if !isPlusMode { |
||||
|
if !out.AddDirEntry(dirEntry) { |
||||
|
return false |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
entryOut := out.AddDirLookupEntry(dirEntry) |
||||
|
if entryOut == nil { |
||||
|
return false |
||||
|
} |
||||
|
entryOut.Generation = 1 |
||||
|
entryOut.EntryValid = 1 |
||||
|
entryOut.AttrValid = 1 |
||||
|
wfs.setAttrByFilerEntry(&entryOut.Attr, inode, entry) |
||||
|
} |
||||
|
return true |
||||
|
} |
||||
|
|
||||
|
// TODO remove this with checking whether directory is not forgotten
|
||||
|
if err := meta_cache.EnsureVisited(wfs.metaCache, wfs, dirPath); err != nil { |
||||
|
glog.Errorf("dir ReadDirAll %s: %v", dirPath, err) |
||||
|
return fuse.EIO |
||||
|
} |
||||
|
listErr := wfs.metaCache.ListDirectoryEntries(context.Background(), dirPath, "", false, int64(math.MaxInt32), func(entry *filer.Entry) bool { |
||||
|
return processEachEntryFn(entry, false) |
||||
|
}) |
||||
|
if listErr != nil { |
||||
|
glog.Errorf("list meta cache: %v", listErr) |
||||
|
return fuse.EIO |
||||
|
} |
||||
|
return fuse.OK |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue