github.com/jiasir/docker@v1.3.3-0.20170609024000-252e610103e7/daemon/graphdriver/zfs/zfs_solaris.go (about)

     1  // +build solaris,cgo
     2  
     3  package zfs
     4  
     5  /*
     6  #include <sys/statvfs.h>
     7  #include <stdlib.h>
     8  
     9  static inline struct statvfs *getstatfs(char *s) {
    10          struct statvfs *buf;
    11          int err;
    12          buf = (struct statvfs *)malloc(sizeof(struct statvfs));
    13          err = statvfs(s, buf);
    14          return buf;
    15  }
    16  */
    17  import "C"
    18  import (
    19  	"path/filepath"
    20  	"strings"
    21  	"unsafe"
    22  
    23  	"github.com/Sirupsen/logrus"
    24  	"github.com/docker/docker/daemon/graphdriver"
    25  )
    26  
    27  func checkRootdirFs(rootdir string) error {
    28  
    29  	cs := C.CString(filepath.Dir(rootdir))
    30  	buf := C.getstatfs(cs)
    31  
    32  	// on Solaris buf.f_basetype contains ['z', 'f', 's', 0 ... ]
    33  	if (buf.f_basetype[0] != 122) || (buf.f_basetype[1] != 102) || (buf.f_basetype[2] != 115) ||
    34  		(buf.f_basetype[3] != 0) {
    35  		logrus.Debugf("[zfs] no zfs dataset found for rootdir '%s'", rootdir)
    36  		C.free(unsafe.Pointer(buf))
    37  		return graphdriver.ErrPrerequisites
    38  	}
    39  
    40  	C.free(unsafe.Pointer(buf))
    41  	C.free(unsafe.Pointer(cs))
    42  	return nil
    43  }
    44  
    45  /* rootfs is introduced to comply with the OCI spec
    46  which states that root filesystem must be mounted at <CID>/rootfs/ instead of <CID>/
    47  */
    48  func getMountpoint(id string) string {
    49  	maxlen := 12
    50  
    51  	// we need to preserve filesystem suffix
    52  	suffix := strings.SplitN(id, "-", 2)
    53  
    54  	if len(suffix) > 1 {
    55  		return filepath.Join(id[:maxlen]+"-"+suffix[1], "rootfs", "root")
    56  	}
    57  
    58  	return filepath.Join(id[:maxlen], "rootfs", "root")
    59  }