implement symlink caching

geesefs-0-30-9
Michael Stapelberg 2020-02-15 08:04:53 +01:00
parent ae5da07e4c
commit 7c2b569250
3 changed files with 21 additions and 0 deletions

View File

@ -148,6 +148,8 @@ func (c *Connection) Init() error {
c.protocol = initOp.Kernel
}
cacheSymlinks := initOp.Flags&fusekernel.InitCacheSymlinks > 0
// Respond to the init op.
initOp.Library = c.protocol
initOp.MaxReadahead = maxReadahead
@ -163,6 +165,12 @@ func (c *Connection) Init() error {
initOp.Flags |= fusekernel.InitWritebackCache
}
// Enable caching symlink targets in the kernel page cache if the user opted
// into it (might require fixing the size field of inode attributes first):
if c.cfg.EnableSymlinkCaching && cacheSymlinks {
initOp.Flags |= fusekernel.InitCacheSymlinks
}
c.Reply(ctx, nil)
return nil
}

View File

@ -266,6 +266,7 @@ const (
InitAsyncDIO InitFlags = 1 << 15
InitWritebackCache InitFlags = 1 << 16
InitNoOpenSupport InitFlags = 1 << 17
InitCacheSymlinks InitFlags = 1 << 23
InitCaseSensitive InitFlags = 1 << 29 // OS X only
InitVolRename InitFlags = 1 << 30 // OS X only
@ -296,6 +297,7 @@ var initFlagNames = []flagName{
{uint32(InitAsyncDIO), "InitAsyncDIO"},
{uint32(InitWritebackCache), "InitWritebackCache"},
{uint32(InitNoOpenSupport), "InitNoOpenSupport"},
{uint32(InitCacheSymlinks), "InitCacheSymlinks"},
{uint32(InitCaseSensitive), "InitCaseSensitive"},
{uint32(InitVolRename), "InitVolRename"},

View File

@ -128,6 +128,17 @@ type MountConfig struct {
// entries will be cached for an arbitrarily long time.
EnableVnodeCaching bool
// Linux only.
//
// Linux 4.20 introduced caching symlink targets in the page cache:
// https://github.com/torvalds/linux/commit/5571f1e65486be025f73fa6aa30fb03725d362a2
//
// This is not enabled by default because the old behavior masked a bug:
// file systems could return any size in the inode attributes of
// symlinks. After enabling caching, the specified size caps the symlink
// target.
EnableSymlinkCaching bool
// OS X only.
//
// The name of the mounted volume, as displayed in the Finder. If empty, a