From 31d1087c3f39cc48bde5983ca43764a366cc0d2c Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 11 Jan 2016 17:28:34 +0100 Subject: ipc: umount all mounts before removing temp dirs This is needed if unshare(CLONE_NEWNS) is not implemented. Otherwise, os.RemoveAll fails. --- fileutil/fileutil.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'fileutil') diff --git a/fileutil/fileutil.go b/fileutil/fileutil.go index a019a14ea..b84088354 100644 --- a/fileutil/fileutil.go +++ b/fileutil/fileutil.go @@ -12,6 +12,7 @@ import ( "strconv" "sync" "syscall" + "unsafe" ) var copyMu sync.Mutex @@ -103,3 +104,16 @@ func ProcessTempDir(where string) (string, int, error) { } return "", 0, fmt.Errorf("too many live instances") } + +// UmountAll recurusively unmounts all mounts in dir. +func UmountAll(dir string) { + files, _ := ioutil.ReadDir(dir) + for _, f := range files { + name := filepath.Join(dir, f.Name()) + if f.IsDir() { + UmountAll(name) + } + fn := []byte(name + "\x00") + syscall.Syscall(syscall.SYS_UMOUNT2, uintptr(unsafe.Pointer(&fn[0])), syscall.MNT_FORCE, 0) + } +} -- cgit mrf-deployment