Skip to content

Commit cdb0796

Browse files
ayushr2gvisor-bot
authored andcommitted
Add vfs.FilesystemImplSaveRestoreExtension.PostSave.
This allows filesystem implementations to cleanup S/R state which is not needed after resume. This state was being cleaned up on restore, but not resume. Updates #11425 PiperOrigin-RevId: 728591228
1 parent 84670a4 commit cdb0796

File tree

4 files changed

+28
-0
lines changed

4 files changed

+28
-0
lines changed

pkg/sentry/fsimpl/gofer/save_restore.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import (
3131
"gvisor.dev/gvisor/pkg/sentry/vfs"
3232
)
3333

34+
var _ vfs.FilesystemImplSaveRestoreExtension = (*filesystem)(nil)
35+
3436
// +stateify savable
3537
type savedDentryRW struct {
3638
read bool
@@ -134,6 +136,11 @@ func (d *dentry) beforeSave() {
134136
}
135137
}
136138

139+
// PostSave implements vfs.FilesystemImplSaveRestoreExtension.PostSave.
140+
func (fs *filesystem) PostSave(ctx context.Context) {
141+
fs.savedDentryRW = nil
142+
}
143+
137144
// afterLoad is invoked by stateify.
138145
func (fs *filesystem) afterLoad(ctx goContext.Context) {
139146
fs.mf = pgalloc.MemoryFileFromContext(ctx)

pkg/sentry/fsimpl/tmpfs/save_restore.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import (
2323
"gvisor.dev/gvisor/pkg/sentry/vfs"
2424
)
2525

26+
var _ vfs.FilesystemImplSaveRestoreExtension = (*filesystem)(nil)
27+
2628
// saveMf is called by stateify.
2729
func (fs *filesystem) saveMf() string {
2830
if !fs.mf.IsSavable() {
@@ -75,6 +77,9 @@ func (fs *filesystem) PrepareSave(ctx context.Context) error {
7577
return nil
7678
}
7779

80+
// PostSave implements vfs.FilesystemImplSaveRestoreExtension.PostSave.
81+
func (fs *filesystem) PostSave(ctx context.Context) {}
82+
7883
// CompleteRestore implements
7984
// vfs.FilesystemImplSaveRestoreExtension.CompleteRestore.
8085
func (fs *filesystem) CompleteRestore(ctx context.Context, opts vfs.CompleteRestoreOptions) error {

pkg/sentry/kernel/kernel.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,8 @@ func (k *Kernel) SaveTo(ctx context.Context, w, pagesMetadata io.Writer, pagesFi
698698
return mfSaveErr
699699
}
700700

701+
k.vfs.PostSave(ctx)
702+
701703
log.Infof("Overall save took [%s].", time.Since(saveStart))
702704
return nil
703705
}

pkg/sentry/vfs/save_restore.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ type FilesystemImplSaveRestoreExtension interface {
5454
// PrepareSave prepares this filesystem for serialization.
5555
PrepareSave(ctx context.Context) error
5656

57+
// PostSave is invoked after save. It can be used to clean up any state that
58+
// should be discarded after save.
59+
PostSave(ctx context.Context)
60+
5761
// CompleteRestore completes restoration from checkpoint for this
5862
// filesystem after deserialization.
5963
CompleteRestore(ctx context.Context, opts CompleteRestoreOptions) error
@@ -73,6 +77,16 @@ func (vfs *VirtualFilesystem) PrepareSave(ctx context.Context) error {
7377
return nil
7478
}
7579

80+
// PostSave is called after save and allows filesystems to clean up S/R state.
81+
func (vfs *VirtualFilesystem) PostSave(ctx context.Context) {
82+
for fs := range vfs.getFilesystems() {
83+
if ext, ok := fs.impl.(FilesystemImplSaveRestoreExtension); ok {
84+
ext.PostSave(ctx)
85+
}
86+
fs.DecRef(ctx)
87+
}
88+
}
89+
7690
// CompleteRestore completes restoration from checkpoint for all filesystems
7791
// after deserialization.
7892
func (vfs *VirtualFilesystem) CompleteRestore(ctx context.Context, opts *CompleteRestoreOptions) error {

0 commit comments

Comments
 (0)