mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Remove FileReadWriteSeeker from vfs.
Previous experience has shown that these types of wrappers tends to create two kinds of problems: hidden allocations (e.g. each call to FileReadWriteSeeker.Read/Write allocates a usermem.BytesIO on the heap) and hidden lock ordering problems (e.g. VFS1 splice deadlocks). Since this is only needed by fsimpl/verity, move it there. PiperOrigin-RevId: 345377830
This commit is contained in:
@@ -254,7 +254,7 @@ func (fs *filesystem) verifyChildLocked(ctx context.Context, parent *dentry, chi
|
||||
return nil, alertIntegrityViolation(fmt.Sprintf("Failed to convert xattr %s for %s to int: %v", merkleSizeXattr, childPath, err))
|
||||
}
|
||||
|
||||
fdReader := vfs.FileReadWriteSeeker{
|
||||
fdReader := FileReadWriteSeeker{
|
||||
FD: parentMerkleFD,
|
||||
Ctx: ctx,
|
||||
}
|
||||
@@ -397,7 +397,7 @@ func (fs *filesystem) verifyStatAndChildrenLocked(ctx context.Context, d *dentry
|
||||
}
|
||||
}
|
||||
|
||||
fdReader := vfs.FileReadWriteSeeker{
|
||||
fdReader := FileReadWriteSeeker{
|
||||
FD: fd,
|
||||
Ctx: ctx,
|
||||
}
|
||||
|
||||
@@ -749,15 +749,15 @@ func (fd *fileDescription) Seek(ctx context.Context, offset int64, whence int32)
|
||||
//
|
||||
// Preconditions: fd.d.fs.verityMu must be locked.
|
||||
func (fd *fileDescription) generateMerkleLocked(ctx context.Context) ([]byte, uint64, error) {
|
||||
fdReader := vfs.FileReadWriteSeeker{
|
||||
fdReader := FileReadWriteSeeker{
|
||||
FD: fd.lowerFD,
|
||||
Ctx: ctx,
|
||||
}
|
||||
merkleReader := vfs.FileReadWriteSeeker{
|
||||
merkleReader := FileReadWriteSeeker{
|
||||
FD: fd.merkleReader,
|
||||
Ctx: ctx,
|
||||
}
|
||||
merkleWriter := vfs.FileReadWriteSeeker{
|
||||
merkleWriter := FileReadWriteSeeker{
|
||||
FD: fd.merkleWriter,
|
||||
Ctx: ctx,
|
||||
}
|
||||
@@ -1047,12 +1047,12 @@ func (fd *fileDescription) PRead(ctx context.Context, dst usermem.IOSequence, of
|
||||
return 0, alertIntegrityViolation(fmt.Sprintf("Failed to convert xattr %s to int: %v", merkleSizeXattr, err))
|
||||
}
|
||||
|
||||
dataReader := vfs.FileReadWriteSeeker{
|
||||
dataReader := FileReadWriteSeeker{
|
||||
FD: fd.lowerFD,
|
||||
Ctx: ctx,
|
||||
}
|
||||
|
||||
merkleReader := vfs.FileReadWriteSeeker{
|
||||
merkleReader := FileReadWriteSeeker{
|
||||
FD: fd.merkleReader,
|
||||
Ctx: ctx,
|
||||
}
|
||||
@@ -1101,3 +1101,45 @@ func (fd *fileDescription) LockPOSIX(ctx context.Context, uid fslock.UniqueID, t
|
||||
func (fd *fileDescription) UnlockPOSIX(ctx context.Context, uid fslock.UniqueID, start, length uint64, whence int16) error {
|
||||
return fd.lowerFD.UnlockPOSIX(ctx, uid, start, length, whence)
|
||||
}
|
||||
|
||||
// FileReadWriteSeeker is a helper struct to pass a vfs.FileDescription as
|
||||
// io.Reader/io.Writer/io.ReadSeeker/io.ReaderAt/io.WriterAt/etc.
|
||||
type FileReadWriteSeeker struct {
|
||||
FD *vfs.FileDescription
|
||||
Ctx context.Context
|
||||
ROpts vfs.ReadOptions
|
||||
WOpts vfs.WriteOptions
|
||||
}
|
||||
|
||||
// ReadAt implements io.ReaderAt.ReadAt.
|
||||
func (f *FileReadWriteSeeker) ReadAt(p []byte, off int64) (int, error) {
|
||||
dst := usermem.BytesIOSequence(p)
|
||||
n, err := f.FD.PRead(f.Ctx, dst, off, f.ROpts)
|
||||
return int(n), err
|
||||
}
|
||||
|
||||
// Read implements io.ReadWriteSeeker.Read.
|
||||
func (f *FileReadWriteSeeker) Read(p []byte) (int, error) {
|
||||
dst := usermem.BytesIOSequence(p)
|
||||
n, err := f.FD.Read(f.Ctx, dst, f.ROpts)
|
||||
return int(n), err
|
||||
}
|
||||
|
||||
// Seek implements io.ReadWriteSeeker.Seek.
|
||||
func (f *FileReadWriteSeeker) Seek(offset int64, whence int) (int64, error) {
|
||||
return f.FD.Seek(f.Ctx, offset, int32(whence))
|
||||
}
|
||||
|
||||
// WriteAt implements io.WriterAt.WriteAt.
|
||||
func (f *FileReadWriteSeeker) WriteAt(p []byte, off int64) (int, error) {
|
||||
dst := usermem.BytesIOSequence(p)
|
||||
n, err := f.FD.PWrite(f.Ctx, dst, off, f.WOpts)
|
||||
return int(n), err
|
||||
}
|
||||
|
||||
// Write implements io.ReadWriteSeeker.Write.
|
||||
func (f *FileReadWriteSeeker) Write(p []byte) (int, error) {
|
||||
buf := usermem.BytesIOSequence(p)
|
||||
n, err := f.FD.Write(f.Ctx, buf, f.WOpts)
|
||||
return int(n), err
|
||||
}
|
||||
|
||||
@@ -833,45 +833,3 @@ func (fd *FileDescription) SetAsyncHandler(newHandler func() FileAsync) FileAsyn
|
||||
}
|
||||
return fd.asyncHandler
|
||||
}
|
||||
|
||||
// FileReadWriteSeeker is a helper struct to pass a FileDescription as
|
||||
// io.Reader/io.Writer/io.ReadSeeker/io.ReaderAt/io.WriterAt/etc.
|
||||
type FileReadWriteSeeker struct {
|
||||
FD *FileDescription
|
||||
Ctx context.Context
|
||||
ROpts ReadOptions
|
||||
WOpts WriteOptions
|
||||
}
|
||||
|
||||
// ReadAt implements io.ReaderAt.ReadAt.
|
||||
func (f *FileReadWriteSeeker) ReadAt(p []byte, off int64) (int, error) {
|
||||
dst := usermem.BytesIOSequence(p)
|
||||
n, err := f.FD.PRead(f.Ctx, dst, off, f.ROpts)
|
||||
return int(n), err
|
||||
}
|
||||
|
||||
// Read implements io.ReadWriteSeeker.Read.
|
||||
func (f *FileReadWriteSeeker) Read(p []byte) (int, error) {
|
||||
dst := usermem.BytesIOSequence(p)
|
||||
n, err := f.FD.Read(f.Ctx, dst, f.ROpts)
|
||||
return int(n), err
|
||||
}
|
||||
|
||||
// Seek implements io.ReadWriteSeeker.Seek.
|
||||
func (f *FileReadWriteSeeker) Seek(offset int64, whence int) (int64, error) {
|
||||
return f.FD.Seek(f.Ctx, offset, int32(whence))
|
||||
}
|
||||
|
||||
// WriteAt implements io.WriterAt.WriteAt.
|
||||
func (f *FileReadWriteSeeker) WriteAt(p []byte, off int64) (int, error) {
|
||||
dst := usermem.BytesIOSequence(p)
|
||||
n, err := f.FD.PWrite(f.Ctx, dst, off, f.WOpts)
|
||||
return int(n), err
|
||||
}
|
||||
|
||||
// Write implements io.ReadWriteSeeker.Write.
|
||||
func (f *FileReadWriteSeeker) Write(p []byte) (int, error) {
|
||||
buf := usermem.BytesIOSequence(p)
|
||||
n, err := f.FD.Write(f.Ctx, buf, f.WOpts)
|
||||
return int(n), err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user