Skip to content

Commit

Permalink
Add vfs.FilesystemImplSaveRestoreExtension.PostSave.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ayushr2 authored and gvisor-bot committed Feb 19, 2025
1 parent 84670a4 commit cdb0796
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 0 deletions.
7 changes: 7 additions & 0 deletions pkg/sentry/fsimpl/gofer/save_restore.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ import (
"gvisor.dev/gvisor/pkg/sentry/vfs"
)

var _ vfs.FilesystemImplSaveRestoreExtension = (*filesystem)(nil)

// +stateify savable
type savedDentryRW struct {
read bool
Expand Down Expand Up @@ -134,6 +136,11 @@ func (d *dentry) beforeSave() {
}
}

// PostSave implements vfs.FilesystemImplSaveRestoreExtension.PostSave.
func (fs *filesystem) PostSave(ctx context.Context) {
fs.savedDentryRW = nil
}

// afterLoad is invoked by stateify.
func (fs *filesystem) afterLoad(ctx goContext.Context) {
fs.mf = pgalloc.MemoryFileFromContext(ctx)
Expand Down
5 changes: 5 additions & 0 deletions pkg/sentry/fsimpl/tmpfs/save_restore.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import (
"gvisor.dev/gvisor/pkg/sentry/vfs"
)

var _ vfs.FilesystemImplSaveRestoreExtension = (*filesystem)(nil)

// saveMf is called by stateify.
func (fs *filesystem) saveMf() string {
if !fs.mf.IsSavable() {
Expand Down Expand Up @@ -75,6 +77,9 @@ func (fs *filesystem) PrepareSave(ctx context.Context) error {
return nil
}

// PostSave implements vfs.FilesystemImplSaveRestoreExtension.PostSave.
func (fs *filesystem) PostSave(ctx context.Context) {}

// CompleteRestore implements
// vfs.FilesystemImplSaveRestoreExtension.CompleteRestore.
func (fs *filesystem) CompleteRestore(ctx context.Context, opts vfs.CompleteRestoreOptions) error {
Expand Down
2 changes: 2 additions & 0 deletions pkg/sentry/kernel/kernel.go
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,8 @@ func (k *Kernel) SaveTo(ctx context.Context, w, pagesMetadata io.Writer, pagesFi
return mfSaveErr
}

k.vfs.PostSave(ctx)

log.Infof("Overall save took [%s].", time.Since(saveStart))
return nil
}
Expand Down
14 changes: 14 additions & 0 deletions pkg/sentry/vfs/save_restore.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ type FilesystemImplSaveRestoreExtension interface {
// PrepareSave prepares this filesystem for serialization.
PrepareSave(ctx context.Context) error

// PostSave is invoked after save. It can be used to clean up any state that
// should be discarded after save.
PostSave(ctx context.Context)

// CompleteRestore completes restoration from checkpoint for this
// filesystem after deserialization.
CompleteRestore(ctx context.Context, opts CompleteRestoreOptions) error
Expand All @@ -73,6 +77,16 @@ func (vfs *VirtualFilesystem) PrepareSave(ctx context.Context) error {
return nil
}

// PostSave is called after save and allows filesystems to clean up S/R state.
func (vfs *VirtualFilesystem) PostSave(ctx context.Context) {
for fs := range vfs.getFilesystems() {
if ext, ok := fs.impl.(FilesystemImplSaveRestoreExtension); ok {
ext.PostSave(ctx)
}
fs.DecRef(ctx)
}
}

// CompleteRestore completes restoration from checkpoint for all filesystems
// after deserialization.
func (vfs *VirtualFilesystem) CompleteRestore(ctx context.Context, opts *CompleteRestoreOptions) error {
Expand Down

0 comments on commit cdb0796

Please sign in to comment.