// Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package fs import ( "gvisor.googlesource.com/gvisor/pkg/sentry/arch" "gvisor.googlesource.com/gvisor/pkg/sentry/context" "gvisor.googlesource.com/gvisor/pkg/sentry/memmap" "gvisor.googlesource.com/gvisor/pkg/sentry/usermem" "gvisor.googlesource.com/gvisor/pkg/waiter" ) // FileOperations are operations on a File that diverge per file system. // // Operations that take a *File may use only the following interfaces: // // - File.UniqueID: Operations may only read this value. // - File.Dirent: Operations must not take or drop a reference. // - File.Offset(): This value is guaranteed to not change for the // duration of the operation. // - File.Flags(): This value may change during the operation. type FileOperations interface { // Release release resources held by FileOperations. Release() // Waitable defines how this File can be waited on for read and // write readiness. waiter.Waitable // Seek seeks to offset based on SeekWhence. Returns the new // offset or no change in the offset and an error. Seek(ctx context.Context, file *File, whence SeekWhence, offset int64) (int64, error) // Readdir reads the directory entries of file and serializes them // using serializer. // // Returns the new directory offset or no change in the offset and // an error. The offset returned must not be less than file.Offset(). // // Serialization of directory entries must not happen asynchronously. Readdir(ctx context.Context, file *File, serializer DentrySerializer) (int64, error) // Read reads from file into dst at offset and returns the number // of bytes read which must be greater than or equal to 0. File // systems that do not support reading at an offset, (i.e. pipefs, // sockfs) may ignore the offset. These file systems are expected // to construct Files with !FileFlags.Pread. // // Read may return a nil error and only partially fill dst (at or // before EOF). If the file represents a symlink, Read reads the target // value of the symlink. // // Read does not check permissions nor flags. // // Read must not be called if !FileFlags.Read. Read(ctx context.Context, file *File, dst usermem.IOSequence, offset int64) (int64, error) // Write writes src to file at offset and returns the number of bytes // written which must be greater than or equal to 0. Like Read, file // systems that do not support writing at an offset (i.e. pipefs, sockfs) // may ignore the offset. These file systems are expected to construct // Files with !FileFlags.Pwrite. // // If only part of src could be written, Write must return an error // indicating why (e.g. syserror.ErrWouldBlock). // // Write does not check permissions nor flags. // // Write must not be called if !FileFlags.Write. Write(ctx context.Context, file *File, src usermem.IOSequence, offset int64) (int64, error) // Fsync writes buffered modifications of file and/or flushes in-flight // operations to backing storage based on syncType. The range to sync is // [start, end]. The end is inclusive so that the last byte of a maximally // sized file can be synced. Fsync(ctx context.Context, file *File, start, end int64, syncType SyncType) error // Flush this file's buffers/state (on close(2)). Flush(ctx context.Context, file *File) error // ConfigureMMap mutates opts to implement mmap(2) for the file. Most // implementations can either embed fsutil.NoMMap (if they don't support // memory mapping) or call fsutil.GenericConfigureMMap with the appropriate // memmap.Mappable. ConfigureMMap(ctx context.Context, file *File, opts *memmap.MMapOpts) error // Ioctl implements the ioctl(2) linux syscall. // // io provides access to the virtual memory space to which pointers in args // refer. // // Preconditions: The AddressSpace (if any) that io refers to is activated. Ioctl(ctx context.Context, io usermem.IO, args arch.SyscallArguments) (uintptr, error) }