ソースを参照

Move reflink to os dependent file. OSX docker client fully functionnal.

Guillaume J. Charmes 11 年 前
コミット
74ea136a49
3 ファイル変更67 行追加42 行削除
  1. 14 0
      reflink_copy_darwin.go
  2. 53 0
      reflink_copy_linux.go
  3. 0 42
      utils.go

+ 14 - 0
reflink_copy_darwin.go

@@ -0,0 +1,14 @@
+package docker
+
+import (
+	"os"
+	"io"
+)
+
+func CopyFile(dstFile, srcFile *os.File) error {
+	// No BTRFS reflink suppport, Fall back to normal copy
+
+	// FIXME: Check the return of Copy and compare with dstFile.Stat().Size
+	_, err := io.Copy(dstFile, srcFile)
+	return err
+}

+ 53 - 0
reflink_copy_linux.go

@@ -0,0 +1,53 @@
+package docker
+
+// FIXME: This could be easily rewritten in pure Go
+
+/*
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#include <errno.h>
+
+// See linux.git/fs/btrfs/ioctl.h
+#define BTRFS_IOCTL_MAGIC 0x94
+#define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int)
+
+int
+btrfs_reflink(int fd_out, int fd_in)
+{
+  int res;
+  res = ioctl(fd_out, BTRFS_IOC_CLONE, fd_in);
+  if (res < 0)
+    return errno;
+  return 0;
+}
+
+*/
+import "C"
+
+import (
+	"os"
+	"io"
+	"syscall"
+)
+
+// FIXME: Move this to btrfs package?
+
+func BtrfsReflink(fd_out, fd_in uintptr) error {
+	res := C.btrfs_reflink(C.int(fd_out), C.int(fd_in))
+	if res != 0 {
+		return syscall.Errno(res)
+	}
+	return nil
+}
+
+func CopyFile(dstFile, srcFile *os.File) error {
+	err := BtrfsReflink(dstFile.Fd(), srcFile.Fd())
+	if err == nil {
+		return nil
+	}
+
+	// Fall back to normal copy
+	// FIXME: Check the return of Copy and compare with dstFile.Stat().Size
+	_, err = io.Copy(dstFile, srcFile)
+	return err
+}

+ 0 - 42
utils.go

@@ -1,37 +1,13 @@
 package docker
 
-/*
-#include <sys/ioctl.h>
-#include <linux/fs.h>
-#include <errno.h>
-
-// See linux.git/fs/btrfs/ioctl.h
-#define BTRFS_IOCTL_MAGIC 0x94
-#define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int)
-
-int
-btrfs_reflink(int fd_out, int fd_in)
-{
-  int res;
-  res = ioctl(fd_out, BTRFS_IOC_CLONE, fd_in);
-  if (res < 0)
-    return errno;
-  return 0;
-}
-
-*/
-import "C"
 import (
 	"fmt"
 	"github.com/dotcloud/docker/archive"
 	"github.com/dotcloud/docker/namesgenerator"
 	"github.com/dotcloud/docker/utils"
-	"io"
 	"io/ioutil"
-	"os"
 	"strconv"
 	"strings"
-	"syscall"
 )
 
 type Change struct {
@@ -346,13 +322,6 @@ func migratePortMappings(config *Config, hostConfig *HostConfig) error {
 	return nil
 }
 
-func BtrfsReflink(fd_out, fd_in uintptr) error {
-	res := C.btrfs_reflink(C.int(fd_out), C.int(fd_in))
-	if res != 0 {
-		return syscall.Errno(res)
-	}
-	return nil
-}
 
 // Links come in the format of
 // name:alias
@@ -386,14 +355,3 @@ func (c *checker) Exists(name string) bool {
 func generateRandomName(runtime *Runtime) (string, error) {
 	return namesgenerator.GenerateRandomName(&checker{runtime})
 }
-
-func CopyFile(dstFile, srcFile *os.File) error {
-	err := BtrfsReflink(dstFile.Fd(), srcFile.Fd())
-	if err == nil {
-		return nil
-	}
-
-	// Fall back to normal copy
-	_, err = io.Copy(dstFile, srcFile)
-	return err
-}