From a9ec1dbc9bec91e1c0f1b751a06680570a04e915 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 4 Sep 2013 14:21:53 +0200 Subject: [PATCH] Image: Deactivate image device when unmounting container There is no need to keep all the device-mapper devices active, we can just activate them on demand if needed. --- container.go | 7 ++++++- image.go | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/container.go b/container.go index b74e9f2f0e..5bc9153993 100644 --- a/container.go +++ b/container.go @@ -1181,7 +1181,12 @@ func (container *Container) Mounted() (bool, error) { } func (container *Container) Unmount() error { - return Unmount(container.RootfsPath()) + image, err := container.GetImage() + if err != nil { + return err + } + err = image.Unmount(container.runtime, container.RootfsPath(), container.ID) + return err } // ShortID returns a shorthand version of the container's id for convenience. diff --git a/image.go b/image.go index 07eca11269..b306dfd956 100644 --- a/image.go +++ b/image.go @@ -444,6 +444,30 @@ func (image *Image) Mount(runtime *Runtime, root, rw string, id string) error { return nil } +func (image *Image) Unmount(runtime *Runtime, root string, id string) error { + switch runtime.GetMountMethod() { + case MountMethodNone: + return fmt.Errorf("No supported Unmount implementation") + + case MountMethodAUFS: + return Unmount(root) + + case MountMethodDeviceMapper: + err := syscall.Unmount(root, 0) + if err != nil { + return err + } + + // Try to deactivate the device as generally there is no use for it anymore + devices, err := runtime.GetDeviceSet() + if err != nil { + return err; + } + return devices.DeactivateDevice(id) + } + return nil +} + func (image *Image) Changes(rw string) ([]Change, error) { layers, err := image.layers() if err != nil {