summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/fs
diff options
context:
space:
mode:
authorJustine Olshan <justineolshan@google.com>2018-06-29 14:46:45 -0700
committerShentubot <shentubot@google.com>2018-06-29 14:47:40 -0700
commit80bdf8a4068de3ac4a73b6b61a0cdcfe3e3571af (patch)
tree05d5cb347813b8e8cc4c53a581b9724a7c5afb77 /pkg/sentry/fs
parent25e315c2e1764a9b0a1b70196e1108c00d172f48 (diff)
Sets the restore environment for restoring a container.
Updated how restoring occurs through boot.go with a separate Restore function. This prevents a new process and new mounts from being created. Added tests to ensure the container is restored. Registered checkpoint and restore commands so they can be used. Docker support for these commands is still limited. Working on #80. PiperOrigin-RevId: 202710950 Change-Id: I2b893ceaef6b9442b1ce3743bd112383cb92af0c
Diffstat (limited to 'pkg/sentry/fs')
-rw-r--r--pkg/sentry/fs/gofer/inode_state.go27
1 files changed, 26 insertions, 1 deletions
diff --git a/pkg/sentry/fs/gofer/inode_state.go b/pkg/sentry/fs/gofer/inode_state.go
index 82d1dd4da..33ec33364 100644
--- a/pkg/sentry/fs/gofer/inode_state.go
+++ b/pkg/sentry/fs/gofer/inode_state.go
@@ -17,6 +17,7 @@ package gofer
import (
"errors"
"fmt"
+ "path/filepath"
"strings"
"gvisor.googlesource.com/gvisor/pkg/p9"
@@ -77,6 +78,29 @@ func (i *inodeFileState) saveLoading() struct{} {
return struct{}{}
}
+// splitAbsolutePath splits the path on slashes ignoring the leading slash.
+func splitAbsolutePath(path string) []string {
+ if len(path) == 0 {
+ panic("There is no path!")
+ }
+ if path != filepath.Clean(path) {
+ panic(fmt.Sprintf("path %q is not clean", path))
+ }
+ // This case is to return {} rather than {""}
+ if path == "/" {
+ return []string{}
+ }
+ if path[0] != '/' {
+ panic(fmt.Sprintf("path %q is not absolute", path))
+ }
+
+ s := strings.Split(path, "/")
+
+ // Since p is absolute, the first component of s
+ // is an empty string. We must remove that.
+ return s[1:]
+}
+
// loadLoading is invoked by stateify.
func (i *inodeFileState) loadLoading(_ struct{}) {
i.loading.Lock()
@@ -98,7 +122,8 @@ func (i *inodeFileState) afterLoad() {
// TODO: Context is not plumbed to save/restore.
ctx := &dummyClockContext{context.Background()}
var err error
- _, i.file, err = i.s.attach.walk(ctx, strings.Split(name, "/"))
+
+ _, i.file, err = i.s.attach.walk(ctx, splitAbsolutePath(name))
if err != nil {
return fmt.Errorf("failed to walk to %q: %v", name, err)
}