From ed308ea1e6f7be0965ddb3afa7df3b86387ba4e9 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Wed, 5 Jun 2019 19:31:05 +0000 Subject: [PATCH] Unmount rootfs with separate Remove() in bundle This ensures that a container does not have a mounted rootfs in the bundle directory before RemoveAll is called. Having the rootfs removed first with a Remove ensures that the directory is not mounted and empty before the bundle directory is removed. Signed-off-by: Michael Crosby --- runtime/v2/bundle.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/runtime/v2/bundle.go b/runtime/v2/bundle.go index ad3e95bd3..6e21a875f 100644 --- a/runtime/v2/bundle.go +++ b/runtime/v2/bundle.go @@ -24,6 +24,7 @@ import ( "path/filepath" "github.com/containerd/containerd/identifiers" + "github.com/containerd/containerd/mount" "github.com/containerd/containerd/namespaces" "github.com/pkg/errors" ) @@ -116,6 +117,13 @@ type Bundle struct { // Delete a bundle atomically func (b *Bundle) Delete() error { work, werr := os.Readlink(filepath.Join(b.Path, "work")) + rootfs := filepath.Join(b.Path, "rootfs") + if err := mount.UnmountAll(rootfs, 0); err != nil { + return errors.Wrapf(err, "unmount rootfs %s", rootfs) + } + if err := os.Remove(rootfs); err != nil && os.IsNotExist(err) { + return errors.Wrap(err, "failed to remove bundle rootfs") + } err := atomicDelete(b.Path) if err == nil { if werr == nil {