summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/fs/fsutil
diff options
context:
space:
mode:
authorgVisor bot <gvisor-bot@google.com>2021-03-22 18:50:51 +0000
committergVisor bot <gvisor-bot@google.com>2021-03-22 18:50:51 +0000
commiteb11764fbf2f8db7a8ac6b8bf1beaf6b3ea276c4 (patch)
tree1ebd967c4fce187109370f1f17391bcdc404d435 /pkg/sentry/fs/fsutil
parent8418ed1b4099d346859d17f44ed868803340eaf1 (diff)
parentb428fd02e627fc151527f0f26cbff9b05f6240e0 (diff)
Merge release-20210315.0-5-gb428fd02e (automated)
Diffstat (limited to 'pkg/sentry/fs/fsutil')
-rw-r--r--pkg/sentry/fs/fsutil/inode_cached.go21
1 files changed, 14 insertions, 7 deletions
diff --git a/pkg/sentry/fs/fsutil/inode_cached.go b/pkg/sentry/fs/fsutil/inode_cached.go
index 82eda3e43..0ed7aafa5 100644
--- a/pkg/sentry/fs/fsutil/inode_cached.go
+++ b/pkg/sentry/fs/fsutil/inode_cached.go
@@ -380,16 +380,17 @@ func (c *CachingInodeOperations) Allocate(ctx context.Context, offset, length in
return nil
}
-// WriteOut implements fs.InodeOperations.WriteOut.
-func (c *CachingInodeOperations) WriteOut(ctx context.Context, inode *fs.Inode) error {
+// WriteDirtyPagesAndAttrs will write the dirty pages and attributes to the
+// gofer without calling Fsync on the remote file.
+func (c *CachingInodeOperations) WriteDirtyPagesAndAttrs(ctx context.Context, inode *fs.Inode) error {
c.attrMu.Lock()
+ defer c.attrMu.Unlock()
+ c.dataMu.Lock()
+ defer c.dataMu.Unlock()
// Write dirty pages back.
- c.dataMu.Lock()
err := SyncDirtyAll(ctx, &c.cache, &c.dirty, uint64(c.attr.Size), c.mfp.MemoryFile(), c.backingFile.WriteFromBlocksAt)
- c.dataMu.Unlock()
if err != nil {
- c.attrMu.Unlock()
return err
}
@@ -399,12 +400,18 @@ func (c *CachingInodeOperations) WriteOut(ctx context.Context, inode *fs.Inode)
// Write out cached attributes.
if err := c.backingFile.SetMaskedAttributes(ctx, c.dirtyAttr, c.attr, false); err != nil {
- c.attrMu.Unlock()
return err
}
c.dirtyAttr = fs.AttrMask{}
- c.attrMu.Unlock()
+ return nil
+}
+
+// WriteOut implements fs.InodeOperations.WriteOut.
+func (c *CachingInodeOperations) WriteOut(ctx context.Context, inode *fs.Inode) error {
+ if err := c.WriteDirtyPagesAndAttrs(ctx, inode); err != nil {
+ return err
+ }
// Fsync the remote file.
return c.backingFile.Sync(ctx)