2016-03-25 19:38:00 -04:00
|
|
|
// +build solaris,cgo
|
|
|
|
|
|
|
|
package zfs
|
|
|
|
|
|
|
|
/*
|
|
|
|
#include <sys/statvfs.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
static inline struct statvfs *getstatfs(char *s) {
|
|
|
|
struct statvfs *buf;
|
|
|
|
int err;
|
|
|
|
buf = (struct statvfs *)malloc(sizeof(struct statvfs));
|
|
|
|
err = statvfs(s, buf);
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
import "C"
|
|
|
|
import (
|
|
|
|
"path/filepath"
|
|
|
|
"strings"
|
|
|
|
"unsafe"
|
|
|
|
|
2016-07-18 03:13:54 -04:00
|
|
|
"github.com/Sirupsen/logrus"
|
2016-03-25 19:38:00 -04:00
|
|
|
"github.com/docker/docker/daemon/graphdriver"
|
|
|
|
)
|
|
|
|
|
|
|
|
func checkRootdirFs(rootdir string) error {
|
|
|
|
|
|
|
|
cs := C.CString(filepath.Dir(rootdir))
|
|
|
|
buf := C.getstatfs(cs)
|
|
|
|
|
|
|
|
// on Solaris buf.f_basetype contains ['z', 'f', 's', 0 ... ]
|
|
|
|
if (buf.f_basetype[0] != 122) || (buf.f_basetype[1] != 102) || (buf.f_basetype[2] != 115) ||
|
|
|
|
(buf.f_basetype[3] != 0) {
|
2016-07-18 03:13:54 -04:00
|
|
|
logrus.Debugf("[zfs] no zfs dataset found for rootdir '%s'", rootdir)
|
2016-03-25 19:38:00 -04:00
|
|
|
C.free(unsafe.Pointer(buf))
|
|
|
|
return graphdriver.ErrPrerequisites
|
|
|
|
}
|
|
|
|
|
|
|
|
C.free(unsafe.Pointer(buf))
|
|
|
|
C.free(unsafe.Pointer(cs))
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
/* rootfs is introduced to comply with the OCI spec
|
|
|
|
which states that root filesystem must be mounted at <CID>/rootfs/ instead of <CID>/
|
|
|
|
*/
|
|
|
|
func getMountpoint(id string) string {
|
|
|
|
maxlen := 12
|
|
|
|
|
|
|
|
// we need to preserve filesystem suffix
|
|
|
|
suffix := strings.SplitN(id, "-", 2)
|
|
|
|
|
|
|
|
if len(suffix) > 1 {
|
|
|
|
return filepath.Join(id[:maxlen]+"-"+suffix[1], "rootfs", "root")
|
|
|
|
}
|
|
|
|
|
|
|
|
return filepath.Join(id[:maxlen], "rootfs", "root")
|
|
|
|
}
|