From 0ed762f2d2ff613052b81d06509dac06b13fc0c9 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 19 Nov 2013 14:40:15 +0100 Subject: [PATCH] devicemapper: Unmount when removing device Without this the remove will fail due to a busy device. --- graphdriver/devmapper/driver.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/graphdriver/devmapper/driver.go b/graphdriver/devmapper/driver.go index 315b7b091e..84d53e666e 100644 --- a/graphdriver/devmapper/driver.go +++ b/graphdriver/devmapper/driver.go @@ -61,6 +61,10 @@ func (d *Driver) Create(id string, parent string) error { } func (d *Driver) Remove(id string) error { + mp := path.Join(d.home, "mnt", id) + if err := d.unmount(id, mp); err != nil { + return err + } return d.DeviceSet.RemoveDevice(id) } @@ -90,3 +94,14 @@ func (d *Driver) mount(id, mountPoint string) error { // Mount the device return d.DeviceSet.MountDevice(id, mountPoint, false) } + +func (d *Driver) unmount(id, mountPoint string) error { + // If mountpoint is not mounted, do nothing + if mounted, err := Mounted(mountPoint); err != nil { + return fmt.Errorf("Error checking mountpoint: %s", err) + } else if !mounted { + return nil + } + // Unmount the device + return d.DeviceSet.UnmountDevice(id, mountPoint, true) +}