From d73a418a5535d62e67b0d3de95724d3895c3a9c5 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Sun, 5 Jul 2020 11:28:30 +0100 Subject: [PATCH] cmount: always supply stat information in Readdir It is cheap to make the stat information here - we give FUSE a file type to look at least. --- cmd/cmount/fs.go | 15 ++++++--------- cmd/cmount/mount.go | 11 +---------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/cmd/cmount/fs.go b/cmd/cmount/fs.go index c558eaf7a..883bbf069 100644 --- a/cmd/cmount/fs.go +++ b/cmd/cmount/fs.go @@ -231,7 +231,7 @@ func (fsys *FS) Readdir(dirPath string, // for getattr (but FUSE only looks at st_ino and the // file-type bits of st_mode). // - // FIXME If you call host.SetCapReaddirPlus() then WinFsp will + // We have called host.SetCapReaddirPlus() so WinFsp will // use the full stat information - a Useful optimization on // Windows. // @@ -250,14 +250,11 @@ func (fsys *FS) Readdir(dirPath string, fs.Errorf(dirPath, "Name too long (%d bytes) for FUSE, skipping: %s", len(name), name) continue } - if usingReaddirPlus { - // We have called host.SetCapReaddirPlus() so supply the stat information - var stat fuse.Stat_t - _ = fsys.stat(node, &stat) // not capable of returning an error - fill(name, &stat, 0) - } else { - fill(name, nil, 0) - } + // We have called host.SetCapReaddirPlus() so supply the stat information + // It is very cheap at this point so supply it regardless of OS capabilities + var stat fuse.Stat_t + _ = fsys.stat(node, &stat) // not capable of returning an error + fill(name, &stat, 0) } } itemsRead = len(items) diff --git a/cmd/cmount/mount.go b/cmd/cmount/mount.go index a122f4863..ebda4dcd9 100644 --- a/cmd/cmount/mount.go +++ b/cmd/cmount/mount.go @@ -21,13 +21,6 @@ import ( "github.com/rclone/rclone/vfs" ) -const ( - // SetCapReaddirPlus informs the host that the hosted file system has the readdir-plus - // capability [Windows only]. A file system that has the readdir-plus capability can send - // full stat information during Readdir, thus avoiding extraneous Getattr calls. - usingReaddirPlus = runtime.GOOS == "windows" -) - func init() { name := "cmount" if runtime.GOOS == "windows" { @@ -146,9 +139,7 @@ func mount(VFS *vfs.VFS, mountpoint string, opt *mountlib.Options) (<-chan error // Create underlying FS fsys := NewFS(VFS) host := fuse.NewFileSystemHost(fsys) - if usingReaddirPlus { - host.SetCapReaddirPlus(true) - } + host.SetCapReaddirPlus(true) // only works on Windows host.SetCapCaseInsensitive(f.Features().CaseInsensitive) // Create options