summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/fsimpl/gofer/regular_file.go
diff options
context:
space:
mode:
authorJamie Liu <jamieliu@google.com>2020-08-24 20:04:12 -0700
committergVisor bot <gvisor-bot@google.com>2020-08-24 20:06:16 -0700
commit4ad858a586fc560608d181b72ec78db0894bce48 (patch)
tree1a583f5966d8e27e89d4827416b181208fd882b6 /pkg/sentry/fsimpl/gofer/regular_file.go
parentee041b60bf87d78cf076c88b1fd92be5ec928374 (diff)
Flush in fsimpl/gofer.regularFileFD.OnClose() if there are no dirty pages.
This is closer to indistinguishable from VFS1 behavior. PiperOrigin-RevId: 328256068
Diffstat (limited to 'pkg/sentry/fsimpl/gofer/regular_file.go')
-rw-r--r--pkg/sentry/fsimpl/gofer/regular_file.go12
1 files changed, 9 insertions, 3 deletions
diff --git a/pkg/sentry/fsimpl/gofer/regular_file.go b/pkg/sentry/fsimpl/gofer/regular_file.go
index 7e1cbf065..3b5462682 100644
--- a/pkg/sentry/fsimpl/gofer/regular_file.go
+++ b/pkg/sentry/fsimpl/gofer/regular_file.go
@@ -56,10 +56,16 @@ func (fd *regularFileFD) OnClose(ctx context.Context) error {
if !fd.vfsfd.IsWritable() {
return nil
}
- // Skip flushing if writes may be buffered by the client, since (as with
- // the VFS1 client) we don't flush buffered writes on close anyway.
+ // Skip flushing if there are client-buffered writes, since (as with the
+ // VFS1 client) we don't flush buffered writes on close anyway.
d := fd.dentry()
- if d.fs.opts.interop == InteropModeExclusive {
+ if d.fs.opts.interop != InteropModeExclusive {
+ return nil
+ }
+ d.dataMu.RLock()
+ haveDirtyPages := !d.dirty.IsEmpty()
+ d.dataMu.RUnlock()
+ if haveDirtyPages {
return nil
}
d.handleMu.RLock()