diff options
author | Ayush Ranjan <ayushranjan@google.com> | 2019-07-29 20:11:24 -0700 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2019-07-29 20:12:37 -0700 |
commit | 8da9f8a12c51de41c4e048128a163fbb63679e4b (patch) | |
tree | 88dd537f92bf3b4d3e803bd7fdbf5b0693587607 /pkg/sentry/fs/ext/block_map_file.go | |
parent | ddf25e3331a18a74d0e01d74fee7f82963fe778c (diff) |
Migrate from using io.ReadSeeker to io.ReaderAt.
This provides the following benefits:
- We can now use pkg/fd package which does not take ownership
of the file descriptor. So it does not close the fd when garbage collected.
This reduces scope of errors from unexpected garbage collection of io.File.
- It enforces the offset parameter in every read call.
It does not affect the fd offset nor is it affected by it. Hence reducing
scope of error of using stale offsets when reading.
- We do not need to serialize the usage of any global file descriptor anymore.
So this drops the mutual exclusion req hence reducing complexity and
congestion.
PiperOrigin-RevId: 260635174
Diffstat (limited to 'pkg/sentry/fs/ext/block_map_file.go')
-rw-r--r-- | pkg/sentry/fs/ext/block_map_file.go | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/pkg/sentry/fs/ext/block_map_file.go b/pkg/sentry/fs/ext/block_map_file.go index eb0b35e36..9aabbd145 100644 --- a/pkg/sentry/fs/ext/block_map_file.go +++ b/pkg/sentry/fs/ext/block_map_file.go @@ -16,6 +16,7 @@ package ext import ( "io" + "sync" "gvisor.dev/gvisor/pkg/binary" ) @@ -25,10 +26,13 @@ import ( type blockMapFile struct { regFile regularFile + // mu serializes changes to fileToPhysBlks. + mu sync.RWMutex + // fileToPhysBlks maps the file block numbers to the physical block numbers. // the physical block number for the (i)th file block is stored in the (i)th // index. This is initialized (at max) with the first 12 entries. The rest - // have to be read in from disk when required. + // have to be read in from disk when required. Protected by mu. fileToPhysBlks []uint32 } @@ -36,7 +40,7 @@ type blockMapFile struct { var _ fileReader = (*blockMapFile)(nil) // Read implements fileReader.getFileReader. -func (f *blockMapFile) getFileReader(dev io.ReadSeeker, blkSize uint64, offset uint64) io.Reader { +func (f *blockMapFile) getFileReader(dev io.ReaderAt, blkSize uint64, offset uint64) io.Reader { panic("unimplemented") } |