gvisor/pkg
Jamie Liu 492229d017 VFS2 gofer client
Updates #1198

Opening host pipes (by spinning in fdpipe) and host sockets is not yet
complete, and will be done in a future CL.

Major differences from VFS1 gofer client (sentry/fs/gofer), with varying levels
of backportability:

- "Cache policies" are replaced by InteropMode, which control the behavior of
  timestamps in addition to caching. Under InteropModeExclusive (analogous to
  cacheAll) and InteropModeWritethrough (analogous to cacheAllWritethrough),
  client timestamps are *not* written back to the server (it is not possible in
  9P or Linux for clients to set ctime, so writing back client-authoritative
  timestamps results in incoherence between atime/mtime and ctime). Under
  InteropModeShared (analogous to cacheRemoteRevalidating), client timestamps
  are not used at all (remote filesystem clocks are authoritative). cacheNone
  is translated to InteropModeShared + new option
  filesystemOptions.specialRegularFiles.

- Under InteropModeShared, "unstable attribute" reloading for permission
  checks, lookup, and revalidation are fused, which is feasible in VFS2 since
  gofer.filesystem controls path resolution. This results in a ~33% reduction
  in RPCs for filesystem operations compared to cacheRemoteRevalidating. For
  example, consider stat("/foo/bar/baz") where "/foo/bar/baz" fails
  revalidation, resulting in the instantiation of a new dentry:

  VFS1 RPCs:
  getattr("/")                          // fs.MountNamespace.FindLink() => fs.Inode.CheckPermission() => gofer.inodeOperations.check() => gofer.inodeOperations.UnstableAttr()
  walkgetattr("/", "foo") = fid1        // fs.Dirent.walk() => gofer.session.Revalidate() => gofer.cachePolicy.Revalidate()
  clunk(fid1)
  getattr("/foo")                       // CheckPermission
  walkgetattr("/foo", "bar") = fid2     // Revalidate
  clunk(fid2)
  getattr("/foo/bar")                   // CheckPermission
  walkgetattr("/foo/bar", "baz") = fid3 // Revalidate
  clunk(fid3)
  walkgetattr("/foo/bar", "baz") = fid4 // fs.Dirent.walk() => gofer.inodeOperations.Lookup
  getattr("/foo/bar/baz")               // linux.stat() => gofer.inodeOperations.UnstableAttr()

  VFS2 RPCs:
  getattr("/")                          // gofer.filesystem.walkExistingLocked()
  walkgetattr("/", "foo") = fid1        // gofer.filesystem.stepExistingLocked()
  clunk(fid1)
                                        // No getattr: walkgetattr already updated metadata for permission check
  walkgetattr("/foo", "bar") = fid2
  clunk(fid2)
  walkgetattr("/foo/bar", "baz") = fid3
                                        // No clunk: fid3 used for new gofer.dentry
                                        // No getattr: walkgetattr already updated metadata for stat()

- gofer.filesystem.unlinkAt() does not require instantiation of a dentry that
  represents the file to be deleted. Updates #898.

- gofer.regularFileFD.OnClose() skips Tflushf for regular files under
  InteropModeExclusive, as it's nonsensical to request a remote file flush
  without flushing locally-buffered writes to that remote file first.

- Symlink targets are cached when InteropModeShared is not in effect.

- p9.QID.Path (which is already required to be unique for each file within a
  server, and is accordingly already synthesized from device/inode numbers in
  all known gofers) is used as-is for inode numbers, rather than being mapped
  along with attr.RDev in the client to yet another synthetic inode number.

- Relevant parts of fsutil.CachingInodeOperations are inlined directly into
  gofer package code. This avoids having to duplicate part of its functionality
  in fsutil.HostMappable.

PiperOrigin-RevId: 293190213
2020-02-04 11:29:22 -08:00
..
abi Add //pkg/sentry/devices/memdev. 2020-01-29 10:09:31 -08:00
amutex Standardize on tools directory. 2020-01-27 12:21:00 -08:00
atomicbitops Standardize on tools directory. 2020-01-27 12:21:00 -08:00
binary Standardize on tools directory. 2020-01-27 12:21:00 -08:00
bits Standardize on tools directory. 2020-01-27 12:21:00 -08:00
bpf Standardize on tools directory. 2020-01-27 12:21:00 -08:00
compressio Standardize on tools directory. 2020-01-27 12:21:00 -08:00
context Update package locations. 2020-01-27 15:31:32 -08:00
control Standardize on tools directory. 2020-01-27 12:21:00 -08:00
cpuid Standardize on tools directory. 2020-01-27 12:21:00 -08:00
eventchannel Standardize on tools directory. 2020-01-27 12:21:00 -08:00
fd Standardize on tools directory. 2020-01-27 12:21:00 -08:00
fdchannel Standardize on tools directory. 2020-01-27 12:21:00 -08:00
fdnotifier Standardize on tools directory. 2020-01-27 12:21:00 -08:00
flipcall Standardize on tools directory. 2020-01-27 12:21:00 -08:00
fspath Standardize on tools directory. 2020-01-27 12:21:00 -08:00
gate Standardize on tools directory. 2020-01-27 12:21:00 -08:00
goid Standardize on tools directory. 2020-01-27 12:21:00 -08:00
ilist Standardize on tools directory. 2020-01-27 12:21:00 -08:00
linewriter Standardize on tools directory. 2020-01-27 12:21:00 -08:00
log Cleanup glog and add real caller information. 2020-01-27 16:08:35 -08:00
memutil Standardize on tools directory. 2020-01-27 12:21:00 -08:00
metric Standardize on tools directory. 2020-01-27 12:21:00 -08:00
p9 Standardize on tools directory. 2020-01-27 12:21:00 -08:00
procid Standardize on tools directory. 2020-01-27 12:21:00 -08:00
rand Standardize on tools directory. 2020-01-27 12:21:00 -08:00
refs Standardize on tools directory. 2020-01-27 12:21:00 -08:00
safecopy Update package locations. 2020-01-27 15:31:32 -08:00
safemem VFS2 gofer client 2020-02-04 11:29:22 -08:00
seccomp seccomp: allow to filter syscalls by instruction pointer 2020-02-03 16:16:18 -08:00
secio Standardize on tools directory. 2020-01-27 12:21:00 -08:00
segment Standardize on tools directory. 2020-01-27 12:21:00 -08:00
sentry VFS2 gofer client 2020-02-04 11:29:22 -08:00
sleep Standardize on tools directory. 2020-01-27 12:21:00 -08:00
state Standardize on tools directory. 2020-01-27 12:21:00 -08:00
sync Standardize on tools directory. 2020-01-27 12:21:00 -08:00
syserr Standardize on tools directory. 2020-01-27 12:21:00 -08:00
syserror Standardize on tools directory. 2020-01-27 12:21:00 -08:00
tcpip Fix method comment to match method name. 2020-01-31 15:09:13 -08:00
tmutex Standardize on tools directory. 2020-01-27 12:21:00 -08:00
unet Standardize on tools directory. 2020-01-27 12:21:00 -08:00
urpc Standardize on tools directory. 2020-01-27 12:21:00 -08:00
usermem Update package locations. 2020-01-27 15:31:32 -08:00
waiter Standardize on tools directory. 2020-01-27 12:21:00 -08:00