diff --git a/daemon/graphdriver/zfs/zfs.go b/daemon/graphdriver/zfs/zfs.go index 12e0dd8e9c..1e0a703497 100644 --- a/daemon/graphdriver/zfs/zfs.go +++ b/daemon/graphdriver/zfs/zfs.go @@ -1,15 +1,5 @@ package zfs -/* -#include -#include -#include - -const char* PROC_MOUNTS = "/proc/mounts"; -const char* OPEN_MODE = "r"; -*/ -import "C" - import ( "fmt" "os" @@ -19,10 +9,10 @@ import ( "strings" "syscall" "time" - "unsafe" log "github.com/Sirupsen/logrus" "github.com/docker/docker/daemon/graphdriver" + "github.com/docker/docker/pkg/mount" "github.com/docker/docker/pkg/parsers" zfs "github.com/mistifyio/go-zfs" ) @@ -129,27 +119,18 @@ func lookupZfsDataset(rootdir string) (string, error) { } wantedDev := stat.Dev - Cfp, err := C.setmntent(C.PROC_MOUNTS, C.OPEN_MODE) + mounts, err := mount.GetMounts() if err != nil { - return "", fmt.Errorf("Failed to open /proc/mounts: %v", err) + return "", err } - defer C.endmntent(Cfp) - - var Cmnt C.struct_mntent - buf := string(make([]byte, 256, 256)) - Cbuf := C.CString(buf) - defer C.free(unsafe.Pointer(Cbuf)) - - for C.getmntent_r(Cfp, &Cmnt, Cbuf, 256) != nil { - dir := C.GoString(Cmnt.mnt_dir) - if err := syscall.Stat(dir, &stat); err != nil { - log.Debugf("[zfs] failed to stat '%s' while scanning for zfs mount: %v", dir, err) + for _, m := range mounts { + if err := syscall.Stat(m.Mountpoint, &stat); err != nil { + log.Debugf("[zfs] failed to stat '%s' while scanning for zfs mount: %v", m.Mountpoint, err) continue // may fail on fuse file systems } - fs := C.GoString(Cmnt.mnt_type) - if stat.Dev == wantedDev && fs == "zfs" { - return C.GoString(Cmnt.mnt_fsname), nil + if stat.Dev == wantedDev && m.Fstype == "zfs" { + return m.Source, nil } }