mount.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package docker
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "syscall"
  7. "time"
  8. )
  9. func Unmount(target string) error {
  10. if err := syscall.Unmount(target, 0); err != nil {
  11. return err
  12. }
  13. // Even though we just unmounted the filesystem, AUFS will prevent deleting the mntpoint
  14. // for some time. We'll just keep retrying until it succeeds.
  15. for retries := 0; retries < 1000; retries++ {
  16. err := os.Remove(target)
  17. if err == nil {
  18. // rm mntpoint succeeded
  19. return nil
  20. }
  21. if os.IsNotExist(err) {
  22. // mntpoint doesn't exist anymore. Success.
  23. return nil
  24. }
  25. // fmt.Printf("(%v) Remove %v returned: %v\n", retries, target, err)
  26. time.Sleep(10 * time.Millisecond)
  27. }
  28. return fmt.Errorf("Umount: Failed to umount %v", target)
  29. }
  30. func Mounted(mountpoint string) (bool, error) {
  31. mntpoint, err := os.Stat(mountpoint)
  32. if err != nil {
  33. if os.IsNotExist(err) {
  34. return false, nil
  35. }
  36. return false, err
  37. }
  38. parent, err := os.Stat(filepath.Join(mountpoint, ".."))
  39. if err != nil {
  40. return false, err
  41. }
  42. mntpointSt := mntpoint.Sys().(*syscall.Stat_t)
  43. parentSt := parent.Sys().(*syscall.Stat_t)
  44. return mntpointSt.Dev != parentSt.Dev, nil
  45. }