Browse code

Use loopback types and constants from x/sys/unix to implement pkg/loopback without cgo

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>

Tobias Klauser authored on 2019/08/09 22:38:32
Showing 4 changed files
... ...
@@ -1,4 +1,4 @@
1
-// +build linux,cgo
1
+// +build linux
2 2
 
3 3
 package loopback // import "github.com/docker/docker/pkg/loopback"
4 4
 
... ...
@@ -116,10 +116,10 @@ func AttachLoopDevice(sparseName string) (loop *os.File, err error) {
116 116
 	}
117 117
 
118 118
 	// Set the status of the loopback device
119
-	loopInfo := &loopInfo64{
120
-		loFileName: stringToLoopName(loopFile.Name()),
121
-		loOffset:   0,
122
-		loFlags:    LoFlagsAutoClear,
119
+	loopInfo := &unix.LoopInfo64{
120
+		File_name: stringToLoopName(loopFile.Name()),
121
+		Offset:    0,
122
+		Flags:     LoFlagsAutoClear,
123 123
 	}
124 124
 
125 125
 	if err := ioctlLoopSetStatus64(loopFile.Fd(), loopInfo); err != nil {
... ...
@@ -1,4 +1,4 @@
1
-// +build linux,cgo
1
+// +build linux
2 2
 
3 3
 package loopback // import "github.com/docker/docker/pkg/loopback"
4 4
 
... ...
@@ -17,32 +17,32 @@ func ioctlLoopCtlGetFree(fd uintptr) (int, error) {
17 17
 }
18 18
 
19 19
 func ioctlLoopSetFd(loopFd, sparseFd uintptr) error {
20
-	return unix.IoctlSetInt(int(loopFd), LoopSetFd, int(sparseFd))
20
+	return unix.IoctlSetInt(int(loopFd), unix.LOOP_SET_FD, int(sparseFd))
21 21
 }
22 22
 
23
-func ioctlLoopSetStatus64(loopFd uintptr, loopInfo *loopInfo64) error {
24
-	if _, _, err := unix.Syscall(unix.SYS_IOCTL, loopFd, LoopSetStatus64, uintptr(unsafe.Pointer(loopInfo))); err != 0 {
23
+func ioctlLoopSetStatus64(loopFd uintptr, loopInfo *unix.LoopInfo64) error {
24
+	if _, _, err := unix.Syscall(unix.SYS_IOCTL, loopFd, unix.LOOP_SET_STATUS64, uintptr(unsafe.Pointer(loopInfo))); err != 0 {
25 25
 		return err
26 26
 	}
27 27
 	return nil
28 28
 }
29 29
 
30 30
 func ioctlLoopClrFd(loopFd uintptr) error {
31
-	if _, _, err := unix.Syscall(unix.SYS_IOCTL, loopFd, LoopClrFd, 0); err != 0 {
31
+	if _, _, err := unix.Syscall(unix.SYS_IOCTL, loopFd, unix.LOOP_CLR_FD, 0); err != 0 {
32 32
 		return err
33 33
 	}
34 34
 	return nil
35 35
 }
36 36
 
37
-func ioctlLoopGetStatus64(loopFd uintptr) (*loopInfo64, error) {
38
-	loopInfo := &loopInfo64{}
37
+func ioctlLoopGetStatus64(loopFd uintptr) (*unix.LoopInfo64, error) {
38
+	loopInfo := &unix.LoopInfo64{}
39 39
 
40
-	if _, _, err := unix.Syscall(unix.SYS_IOCTL, loopFd, LoopGetStatus64, uintptr(unsafe.Pointer(loopInfo))); err != 0 {
40
+	if _, _, err := unix.Syscall(unix.SYS_IOCTL, loopFd, unix.LOOP_GET_STATUS64, uintptr(unsafe.Pointer(loopInfo))); err != 0 {
41 41
 		return nil, err
42 42
 	}
43 43
 	return loopInfo, nil
44 44
 }
45 45
 
46 46
 func ioctlLoopSetCapacity(loopFd uintptr, value int) error {
47
-	return unix.IoctlSetInt(int(loopFd), LoopSetCapacity, value)
47
+	return unix.IoctlSetInt(int(loopFd), unix.LOOP_SET_CAPACITY, value)
48 48
 }
... ...
@@ -1,52 +1,24 @@
1
-// +build linux,cgo
1
+// +build linux
2 2
 
3 3
 package loopback // import "github.com/docker/docker/pkg/loopback"
4 4
 
5
-/*
6
-#include <linux/loop.h> // FIXME: present only for defines, maybe we can remove it?
7
-
8
-#ifndef LOOP_CTL_GET_FREE
9
-  #define LOOP_CTL_GET_FREE 0x4C82
10
-#endif
11
-
12
-#ifndef LO_FLAGS_PARTSCAN
13
-  #define LO_FLAGS_PARTSCAN 8
14
-#endif
15
-
16
-*/
17
-import "C"
18
-
19
-type loopInfo64 struct {
20
-	loDevice         uint64 /* ioctl r/o */
21
-	loInode          uint64 /* ioctl r/o */
22
-	loRdevice        uint64 /* ioctl r/o */
23
-	loOffset         uint64
24
-	loSizelimit      uint64 /* bytes, 0 == max available */
25
-	loNumber         uint32 /* ioctl r/o */
26
-	loEncryptType    uint32
27
-	loEncryptKeySize uint32 /* ioctl w/o */
28
-	loFlags          uint32 /* ioctl r/o */
29
-	loFileName       [LoNameSize]uint8
30
-	loCryptName      [LoNameSize]uint8
31
-	loEncryptKey     [LoKeySize]uint8 /* ioctl w/o */
32
-	loInit           [2]uint64
33
-}
5
+import "golang.org/x/sys/unix"
34 6
 
35 7
 // IOCTL consts
36 8
 const (
37
-	LoopSetFd       = C.LOOP_SET_FD
38
-	LoopCtlGetFree  = C.LOOP_CTL_GET_FREE
39
-	LoopGetStatus64 = C.LOOP_GET_STATUS64
40
-	LoopSetStatus64 = C.LOOP_SET_STATUS64
41
-	LoopClrFd       = C.LOOP_CLR_FD
42
-	LoopSetCapacity = C.LOOP_SET_CAPACITY
9
+	LoopSetFd       = unix.LOOP_SET_FD
10
+	LoopCtlGetFree  = unix.LOOP_CTL_GET_FREE
11
+	LoopGetStatus64 = unix.LOOP_GET_STATUS64
12
+	LoopSetStatus64 = unix.LOOP_SET_STATUS64
13
+	LoopClrFd       = unix.LOOP_CLR_FD
14
+	LoopSetCapacity = unix.LOOP_SET_CAPACITY
43 15
 )
44 16
 
45 17
 // LOOP consts.
46 18
 const (
47
-	LoFlagsAutoClear = C.LO_FLAGS_AUTOCLEAR
48
-	LoFlagsReadOnly  = C.LO_FLAGS_READ_ONLY
49
-	LoFlagsPartScan  = C.LO_FLAGS_PARTSCAN
50
-	LoKeySize        = C.LO_KEY_SIZE
51
-	LoNameSize       = C.LO_NAME_SIZE
19
+	LoFlagsAutoClear = unix.LO_FLAGS_AUTOCLEAR
20
+	LoFlagsReadOnly  = unix.LO_FLAGS_READ_ONLY
21
+	LoFlagsPartScan  = unix.LO_FLAGS_PARTSCAN
22
+	LoKeySize        = unix.LO_KEY_SIZE
23
+	LoNameSize       = unix.LO_NAME_SIZE
52 24
 )
... ...
@@ -16,7 +16,7 @@ func getLoopbackBackingFile(file *os.File) (uint64, uint64, error) {
16 16
 		logrus.Errorf("Error get loopback backing file: %s", err)
17 17
 		return 0, 0, ErrGetLoopbackBackingFile
18 18
 	}
19
-	return loopInfo.loDevice, loopInfo.loInode, nil
19
+	return loopInfo.Device, loopInfo.Inode, nil
20 20
 }
21 21
 
22 22
 // SetCapacity reloads the size for the loopback device.