Bladeren bron

zfs: replace c for /proc/mounts parsing with go

Signed-off-by: Jörg Thalheim <joerg@higgsboson.tk>
Jörg Thalheim 10 jaren geleden
bovenliggende
commit
ee00f07ea6
1 gewijzigde bestanden met toevoegingen van 8 en 27 verwijderingen
  1. 8 27
      daemon/graphdriver/zfs/zfs.go

+ 8 - 27
daemon/graphdriver/zfs/zfs.go

@@ -1,15 +1,5 @@
 package zfs
 
-/*
-#include <stdlib.h>
-#include <dirent.h>
-#include <mntent.h>
-
-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
 		}
 	}