... | ... |
@@ -3,63 +3,14 @@ package devmapper |
3 | 3 |
import ( |
4 | 4 |
"fmt" |
5 | 5 |
"github.com/dotcloud/docker/utils" |
6 |
- "unsafe" |
|
7 | 6 |
) |
8 | 7 |
|
9 |
-func ioctlLoopCtlGetFree(fd uintptr) (int, error) { |
|
10 |
- index, _, err := sysSyscall(sysSysIoctl, fd, LoopCtlGetFree, 0) |
|
11 |
- if err != 0 { |
|
12 |
- return 0, err |
|
13 |
- } |
|
14 |
- return int(index), nil |
|
15 |
-} |
|
16 |
- |
|
17 |
-func ioctlLoopSetFd(loopFd, sparseFd uintptr) error { |
|
18 |
- if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopSetFd, sparseFd); err != 0 { |
|
19 |
- return err |
|
20 |
- } |
|
21 |
- return nil |
|
22 |
-} |
|
23 |
- |
|
24 |
-func ioctlLoopSetStatus64(loopFd uintptr, loopInfo *LoopInfo64) error { |
|
25 |
- _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopSetStatus64, uintptr(unsafe.Pointer(loopInfo))) |
|
26 |
- if err != 0 { |
|
27 |
- return err |
|
28 |
- } |
|
29 |
- return nil |
|
30 |
-} |
|
31 |
- |
|
32 |
-func ioctlLoopClrFd(loopFd uintptr) error { |
|
33 |
- _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopClrFd, 0) |
|
34 |
- if err != 0 { |
|
35 |
- return err |
|
36 |
- } |
|
37 |
- return nil |
|
8 |
+func stringToLoopName(src string) [LoNameSize]uint8 { |
|
9 |
+ var dst [LoNameSize]uint8 |
|
10 |
+ copy(dst[:], src[:]) |
|
11 |
+ return dst |
|
38 | 12 |
} |
39 | 13 |
|
40 |
-// //func dmGetLoopbackBackingFileFct(fd uintptr) (uint64, uint64, sysErrno) { |
|
41 |
-// func ioctlLoopGetStatus64(loopFd uintptr) (*LoopInfo64, error) { |
|
42 |
-// var lo64 C.struct_loop_info64 |
|
43 |
-// _, _, err := sysSyscall(sysSysIoctl, fd, C.LOOP_GET_STATUS64, uintptr(unsafe.Pointer(&lo64))) |
|
44 |
-// return uint64(lo64.lo_device), uint64(lo64.lo_inode), sysErrno(err) |
|
45 |
-// } |
|
46 |
- |
|
47 |
-// func dmLoopbackSetCapacityFct(fd uintptr) sysErrno { |
|
48 |
-// _, _, err := sysSyscall(sysSysIoctl, fd, C.LOOP_SET_CAPACITY, 0) |
|
49 |
-// return sysErrno(err) |
|
50 |
-// } |
|
51 |
- |
|
52 |
-// func dmGetBlockSizeFct(fd uintptr) (int64, sysErrno) { |
|
53 |
-// var size int64 |
|
54 |
-// _, _, err := sysSyscall(sysSysIoctl, fd, C.BLKGETSIZE64, uintptr(unsafe.Pointer(&size))) |
|
55 |
-// return size, sysErrno(err) |
|
56 |
-// } |
|
57 |
- |
|
58 |
-// func getBlockSizeFct(fd uintptr, size *uint64) sysErrno { |
|
59 |
-// _, _, err := sysSyscall(sysSysIoctl, fd, C.BLKGETSIZE64, uintptr(unsafe.Pointer(&size))) |
|
60 |
-// return sysErrno(err) |
|
61 |
-// } |
|
62 |
- |
|
63 | 14 |
func getNextFreeLoopbackIndex() (int, error) { |
64 | 15 |
f, err := osOpenFile("/dev/loop-control", osORdOnly, 0644) |
65 | 16 |
if err != nil { |
... | ... |
@@ -125,12 +76,6 @@ func openNextAvailableLoopback(index int, sparseFile *osFile) (loopFile *osFile, |
125 | 125 |
return loopFile, nil |
126 | 126 |
} |
127 | 127 |
|
128 |
-func stringToLoopName(src string) [LoNameSize]uint8 { |
|
129 |
- var dst [LoNameSize]uint8 |
|
130 |
- copy(dst[:], src[:]) |
|
131 |
- return dst |
|
132 |
-} |
|
133 |
- |
|
134 | 128 |
// attachLoopDevice attaches the given sparse file to the next |
135 | 129 |
// available loopback device. It returns an opened *osFile. |
136 | 130 |
func attachLoopDevice(sparseName string) (loop *osFile, err error) { |
... | ... |
@@ -178,15 +178,17 @@ func (t *Task) GetNextTarget(next uintptr) (nextPtr uintptr, start uint64, |
178 | 178 |
} |
179 | 179 |
|
180 | 180 |
func getLoopbackBackingFile(file *osFile) (uint64, uint64, error) { |
181 |
- dev, inode, err := DmGetLoopbackBackingFile(file.Fd()) |
|
182 |
- if err != 0 { |
|
181 |
+ loopInfo, err := ioctlLoopGetStatus64(file.Fd()) |
|
182 |
+ if err != nil { |
|
183 |
+ utils.Errorf("Error get loopback backing file: %s\n", err) |
|
183 | 184 |
return 0, 0, ErrGetLoopbackBackingFile |
184 | 185 |
} |
185 |
- return dev, inode, nil |
|
186 |
+ return loopInfo.loDevice, loopInfo.loInode, nil |
|
186 | 187 |
} |
187 | 188 |
|
188 | 189 |
func LoopbackSetCapacity(file *osFile) error { |
189 |
- if err := DmLoopbackSetCapacity(file.Fd()); err != 0 { |
|
190 |
+ if err := ioctlLoopSetCapacity(file.Fd(), 0); err != nil { |
|
191 |
+ utils.Errorf("Error loopbackSetCapacity: %s", err) |
|
190 | 192 |
return ErrLoopbackSetCapacity |
191 | 193 |
} |
192 | 194 |
return nil |
... | ... |
@@ -276,8 +278,9 @@ func RemoveDevice(name string) error { |
276 | 276 |
} |
277 | 277 |
|
278 | 278 |
func GetBlockDeviceSize(file *osFile) (uint64, error) { |
279 |
- size, errno := DmGetBlockSize(file.Fd()) |
|
280 |
- if size == -1 || errno != 0 { |
|
279 |
+ size, err := ioctlBlkGetSize64(file.Fd()) |
|
280 |
+ if err != nil { |
|
281 |
+ utils.Errorf("Error getblockdevicesize: %s", err) |
|
281 | 282 |
return 0, ErrGetBlockSize |
282 | 283 |
} |
283 | 284 |
return uint64(size), nil |
... | ... |
@@ -33,7 +33,8 @@ import ( |
33 | 33 |
) |
34 | 34 |
|
35 | 35 |
type ( |
36 |
- CDmTask C.struct_dm_task |
|
36 |
+ CDmTask C.struct_dm_task |
|
37 |
+ |
|
37 | 38 |
CLoopInfo64 C.struct_loop_info64 |
38 | 39 |
LoopInfo64 struct { |
39 | 40 |
loDevice uint64 /* ioctl r/o */ |
... | ... |
@@ -54,39 +55,40 @@ type ( |
54 | 54 |
|
55 | 55 |
// FIXME: Make sure the values are defined in C |
56 | 56 |
const ( |
57 |
- LoopSetFd = C.LOOP_SET_FD |
|
58 |
- LoopCtlGetFree = C.LOOP_CTL_GET_FREE |
|
59 |
- LoopSetStatus64 = C.LOOP_SET_STATUS64 |
|
60 |
- LoopClrFd = C.LOOP_CLR_FD |
|
57 |
+ LoopSetFd = C.LOOP_SET_FD |
|
58 |
+ LoopCtlGetFree = C.LOOP_CTL_GET_FREE |
|
59 |
+ LoopGetStatus64 = C.LOOP_GET_STATUS64 |
|
60 |
+ LoopSetStatus64 = C.LOOP_SET_STATUS64 |
|
61 |
+ LoopClrFd = C.LOOP_CLR_FD |
|
62 |
+ LoopSetCapacity = C.LOOP_SET_CAPACITY |
|
63 |
+ |
|
61 | 64 |
LoFlagsAutoClear = C.LO_FLAGS_AUTOCLEAR |
62 | 65 |
LoFlagsReadOnly = C.LO_FLAGS_READ_ONLY |
63 | 66 |
LoFlagsPartScan = C.LO_FLAGS_PARTSCAN |
64 | 67 |
LoKeySize = C.LO_KEY_SIZE |
65 | 68 |
LoNameSize = C.LO_NAME_SIZE |
69 |
+ |
|
70 |
+ BlkGetSize64 = C.BLKGETSIZE64 |
|
66 | 71 |
) |
67 | 72 |
|
68 | 73 |
var ( |
69 |
- DmGetBlockSize = dmGetBlockSizeFct |
|
70 |
- DmGetLibraryVersion = dmGetLibraryVersionFct |
|
71 |
- DmGetNextTarget = dmGetNextTargetFct |
|
72 |
- DmLogInitVerbose = dmLogInitVerboseFct |
|
73 |
- DmSetDevDir = dmSetDevDirFct |
|
74 |
- DmTaskAddTarget = dmTaskAddTargetFct |
|
75 |
- DmTaskCreate = dmTaskCreateFct |
|
76 |
- DmTaskDestroy = dmTaskDestroyFct |
|
77 |
- DmTaskGetInfo = dmTaskGetInfoFct |
|
78 |
- DmTaskRun = dmTaskRunFct |
|
79 |
- DmTaskSetAddNode = dmTaskSetAddNodeFct |
|
80 |
- DmTaskSetCookie = dmTaskSetCookieFct |
|
81 |
- DmTaskSetMessage = dmTaskSetMessageFct |
|
82 |
- DmTaskSetName = dmTaskSetNameFct |
|
83 |
- DmTaskSetRo = dmTaskSetRoFct |
|
84 |
- DmTaskSetSector = dmTaskSetSectorFct |
|
85 |
- DmUdevWait = dmUdevWaitFct |
|
86 |
- GetBlockSize = getBlockSizeFct |
|
87 |
- LogWithErrnoInit = logWithErrnoInitFct |
|
88 |
- DmGetLoopbackBackingFile = dmGetLoopbackBackingFileFct |
|
89 |
- DmLoopbackSetCapacity = dmLoopbackSetCapacityFct |
|
74 |
+ DmGetLibraryVersion = dmGetLibraryVersionFct |
|
75 |
+ DmGetNextTarget = dmGetNextTargetFct |
|
76 |
+ DmLogInitVerbose = dmLogInitVerboseFct |
|
77 |
+ DmSetDevDir = dmSetDevDirFct |
|
78 |
+ DmTaskAddTarget = dmTaskAddTargetFct |
|
79 |
+ DmTaskCreate = dmTaskCreateFct |
|
80 |
+ DmTaskDestroy = dmTaskDestroyFct |
|
81 |
+ DmTaskGetInfo = dmTaskGetInfoFct |
|
82 |
+ DmTaskRun = dmTaskRunFct |
|
83 |
+ DmTaskSetAddNode = dmTaskSetAddNodeFct |
|
84 |
+ DmTaskSetCookie = dmTaskSetCookieFct |
|
85 |
+ DmTaskSetMessage = dmTaskSetMessageFct |
|
86 |
+ DmTaskSetName = dmTaskSetNameFct |
|
87 |
+ DmTaskSetRo = dmTaskSetRoFct |
|
88 |
+ DmTaskSetSector = dmTaskSetSectorFct |
|
89 |
+ DmUdevWait = dmUdevWaitFct |
|
90 |
+ LogWithErrnoInit = logWithErrnoInitFct |
|
90 | 91 |
) |
91 | 92 |
|
92 | 93 |
func free(p *C.char) { |
... | ... |
@@ -185,28 +187,6 @@ func dmGetNextTargetFct(task *CDmTask, next uintptr, start, length *uint64, targ |
185 | 185 |
return uintptr(nextp) |
186 | 186 |
} |
187 | 187 |
|
188 |
-func dmGetLoopbackBackingFileFct(fd uintptr) (uint64, uint64, sysErrno) { |
|
189 |
- var lo64 C.struct_loop_info64 |
|
190 |
- _, _, err := sysSyscall(sysSysIoctl, fd, C.LOOP_GET_STATUS64, uintptr(unsafe.Pointer(&lo64))) |
|
191 |
- return uint64(lo64.lo_device), uint64(lo64.lo_inode), sysErrno(err) |
|
192 |
-} |
|
193 |
- |
|
194 |
-func dmLoopbackSetCapacityFct(fd uintptr) sysErrno { |
|
195 |
- _, _, err := sysSyscall(sysSysIoctl, fd, C.LOOP_SET_CAPACITY, 0) |
|
196 |
- return sysErrno(err) |
|
197 |
-} |
|
198 |
- |
|
199 |
-func dmGetBlockSizeFct(fd uintptr) (int64, sysErrno) { |
|
200 |
- var size int64 |
|
201 |
- _, _, err := sysSyscall(sysSysIoctl, fd, C.BLKGETSIZE64, uintptr(unsafe.Pointer(&size))) |
|
202 |
- return size, sysErrno(err) |
|
203 |
-} |
|
204 |
- |
|
205 |
-func getBlockSizeFct(fd uintptr, size *uint64) sysErrno { |
|
206 |
- _, _, err := sysSyscall(sysSysIoctl, fd, C.BLKGETSIZE64, uintptr(unsafe.Pointer(&size))) |
|
207 |
- return sysErrno(err) |
|
208 |
-} |
|
209 |
- |
|
210 | 188 |
func dmUdevWaitFct(cookie uint) int { |
211 | 189 |
return int(C.dm_udev_wait(C.uint32_t(cookie))) |
212 | 190 |
} |
213 | 191 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,58 @@ |
0 |
+package devmapper |
|
1 |
+ |
|
2 |
+import ( |
|
3 |
+ "unsafe" |
|
4 |
+) |
|
5 |
+ |
|
6 |
+func ioctlLoopCtlGetFree(fd uintptr) (int, error) { |
|
7 |
+ index, _, err := sysSyscall(sysSysIoctl, fd, LoopCtlGetFree, 0) |
|
8 |
+ if err != 0 { |
|
9 |
+ return 0, err |
|
10 |
+ } |
|
11 |
+ return int(index), nil |
|
12 |
+} |
|
13 |
+ |
|
14 |
+func ioctlLoopSetFd(loopFd, sparseFd uintptr) error { |
|
15 |
+ if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopSetFd, sparseFd); err != 0 { |
|
16 |
+ return err |
|
17 |
+ } |
|
18 |
+ return nil |
|
19 |
+} |
|
20 |
+ |
|
21 |
+func ioctlLoopSetStatus64(loopFd uintptr, loopInfo *LoopInfo64) error { |
|
22 |
+ if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopSetStatus64, uintptr(unsafe.Pointer(loopInfo))); err != 0 { |
|
23 |
+ return err |
|
24 |
+ } |
|
25 |
+ return nil |
|
26 |
+} |
|
27 |
+ |
|
28 |
+func ioctlLoopClrFd(loopFd uintptr) error { |
|
29 |
+ if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopClrFd, 0); err != 0 { |
|
30 |
+ return err |
|
31 |
+ } |
|
32 |
+ return nil |
|
33 |
+} |
|
34 |
+ |
|
35 |
+func ioctlLoopGetStatus64(loopFd uintptr) (*LoopInfo64, error) { |
|
36 |
+ loopInfo := &LoopInfo64{} |
|
37 |
+ |
|
38 |
+ if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopGetStatus64, uintptr(unsafe.Pointer(loopInfo))); err != 0 { |
|
39 |
+ return nil, err |
|
40 |
+ } |
|
41 |
+ return loopInfo, nil |
|
42 |
+} |
|
43 |
+ |
|
44 |
+func ioctlLoopSetCapacity(loopFd uintptr, value int) error { |
|
45 |
+ if _, _, err := sysSyscall(sysSysIoctl, loopFd, LoopSetCapacity, uintptr(value)); err != 0 { |
|
46 |
+ return err |
|
47 |
+ } |
|
48 |
+ return nil |
|
49 |
+} |
|
50 |
+ |
|
51 |
+func ioctlBlkGetSize64(fd uintptr) (int64, error) { |
|
52 |
+ var size int64 |
|
53 |
+ if _, _, err := sysSyscall(sysSysIoctl, fd, BlkGetSize64, uintptr(unsafe.Pointer(&size))); err != 0 { |
|
54 |
+ return 0, err |
|
55 |
+ } |
|
56 |
+ return size, nil |
|
57 |
+} |