Browse code

Small fixes

Guillaume J. Charmes authored on 2013/10/04 10:00:24
Showing 4 changed files
... ...
@@ -12,62 +12,3 @@ type DeviceSet interface {
12 12
 	HasActivatedDevice(hash string) bool
13 13
 	Shutdown() error
14 14
 }
15
-
16
-type DeviceSetWrapper struct {
17
-	wrapped DeviceSet
18
-	prefix  string
19
-}
20
-
21
-func (wrapper *DeviceSetWrapper) wrap(hash string) string {
22
-	if hash != "" {
23
-		hash = wrapper.prefix + "-" + hash
24
-	}
25
-	return hash
26
-}
27
-
28
-func (wrapper *DeviceSetWrapper) AddDevice(hash, baseHash string) error {
29
-	return wrapper.wrapped.AddDevice(wrapper.wrap(hash), wrapper.wrap(baseHash))
30
-}
31
-
32
-func (wrapper *DeviceSetWrapper) SetInitialized(hash string) error {
33
-	return wrapper.wrapped.SetInitialized(wrapper.wrap(hash))
34
-}
35
-
36
-func (wrapper *DeviceSetWrapper) DeactivateDevice(hash string) error {
37
-	return wrapper.wrapped.DeactivateDevice(wrapper.wrap(hash))
38
-}
39
-
40
-func (wrapper *DeviceSetWrapper) Shutdown() error {
41
-	return nil
42
-}
43
-
44
-func (wrapper *DeviceSetWrapper) RemoveDevice(hash string) error {
45
-	return wrapper.wrapped.RemoveDevice(wrapper.wrap(hash))
46
-}
47
-
48
-func (wrapper *DeviceSetWrapper) MountDevice(hash, path string) error {
49
-	return wrapper.wrapped.MountDevice(wrapper.wrap(hash), path)
50
-}
51
-
52
-func (wrapper *DeviceSetWrapper) UnmountDevice(hash, path string) error {
53
-	return wrapper.wrapped.UnmountDevice(wrapper.wrap(hash), path)
54
-}
55
-
56
-func (wrapper *DeviceSetWrapper) HasDevice(hash string) bool {
57
-	return wrapper.wrapped.HasDevice(wrapper.wrap(hash))
58
-}
59
-
60
-func (wrapper *DeviceSetWrapper) HasInitializedDevice(hash string) bool {
61
-	return wrapper.wrapped.HasInitializedDevice(wrapper.wrap(hash))
62
-}
63
-
64
-func (wrapper *DeviceSetWrapper) HasActivatedDevice(hash string) bool {
65
-	return wrapper.wrapped.HasActivatedDevice(wrapper.wrap(hash))
66
-}
67
-
68
-func NewDeviceSetWrapper(wrapped DeviceSet, prefix string) DeviceSet {
69
-	return &DeviceSetWrapper{
70
-		wrapped: wrapped,
71
-		prefix:  prefix,
72
-	}
73
-}
... ...
@@ -442,6 +442,7 @@ func (devices *DeviceSetDM) registerDevice(id int, hash string, size uint64) (*D
442 442
 }
443 443
 
444 444
 func (devices *DeviceSetDM) activateDeviceIfNeeded(hash string) error {
445
+	utils.Debugf("activateDeviceIfNeeded()")
445 446
 	info := devices.Devices[hash]
446 447
 	if info == nil {
447 448
 		return fmt.Errorf("Unknown device %s", hash)
... ...
@@ -14,14 +14,13 @@ package devmapper
14 14
 #include <linux/fs.h>
15 15
 #include <errno.h>
16 16
 
17
-static char *
18
-attach_loop_device(const char *filename, int *loop_fd_out)
17
+char*			attach_loop_device(const char *filename, int *loop_fd_out)
19 18
 {
20
-  struct loop_info64 loopinfo = { 0 };
21
-  struct stat st;
22
-  char buf[64];
23
-  int i, loop_fd, fd, start_index;
24
-  char *loopname;
19
+  struct loop_info64	loopinfo = {0};
20
+  struct stat		st;
21
+  char			buf[64];
22
+  int			i, loop_fd, fd, start_index;
23
+  char*			loopname;
25 24
 
26 25
   *loop_fd_out = -1;
27 26
 
... ...
@@ -37,6 +36,7 @@ attach_loop_device(const char *filename, int *loop_fd_out)
37 37
 
38 38
   fd = open(filename, O_RDWR);
39 39
   if (fd < 0) {
40
+    perror("open");
40 41
     return NULL;
41 42
   }
42 43
 
... ...
@@ -44,6 +44,7 @@ attach_loop_device(const char *filename, int *loop_fd_out)
44 44
   for (i = start_index ; loop_fd < 0 ; i++ ) {
45 45
     if (sprintf(buf, "/dev/loop%d", i) < 0) {
46 46
       close(fd);
47
+	perror("sprintf");
47 48
       return NULL;
48 49
     }
49 50
 
... ...
@@ -55,12 +56,14 @@ attach_loop_device(const char *filename, int *loop_fd_out)
55 55
     loop_fd = open(buf, O_RDWR);
56 56
     if (loop_fd < 0 && errno == ENOENT) {
57 57
       close(fd);
58
+      perror("open");
58 59
       fprintf (stderr, "no available loopback device!");
59 60
       return NULL;
60 61
     } else if (loop_fd < 0)
61 62
       continue;
62 63
 
63 64
     if (ioctl (loop_fd, LOOP_SET_FD, (void *)(size_t)fd) < 0) {
65
+      perror("ioctl");
64 66
       close(loop_fd);
65 67
       loop_fd = -1;
66 68
       if (errno != EBUSY) {
... ...
@@ -78,7 +81,10 @@ attach_loop_device(const char *filename, int *loop_fd_out)
78 78
     loopinfo.lo_flags = LO_FLAGS_AUTOCLEAR;
79 79
 
80 80
     if (ioctl(loop_fd, LOOP_SET_STATUS64, &loopinfo) < 0) {
81
-      ioctl(loop_fd, LOOP_CLR_FD, 0);
81
+      perror("ioctl1");
82
+      if (ioctl(loop_fd, LOOP_CLR_FD, 0) < 0) {
83
+        perror("ioctl2");
84
+      }
82 85
       close(loop_fd);
83 86
       fprintf (stderr, "cannot set up loopback device info");
84 87
       return NULL;
... ...
@@ -105,39 +111,19 @@ get_block_size(int fd)
105 105
   return (int64_t)size;
106 106
 }
107 107
 
108
-
109 108
 */
110 109
 import "C"
111 110
 
112 111
 import (
112
+	"errors"
113 113
 	"fmt"
114 114
 	"github.com/dotcloud/docker/utils"
115 115
 	"os"
116 116
 	"runtime"
117
+	"syscall"
117 118
 	"unsafe"
118 119
 )
119 120
 
120
-func SetDevDir(dir string) error {
121
-	c_dir := C.CString(dir)
122
-	defer C.free(unsafe.Pointer(c_dir))
123
-
124
-	if res := C.dm_set_dev_dir(c_dir); res != 1 {
125
-		utils.Debugf("Error dm_set_dev_dir")
126
-		return fmt.Errorf("dm_set_dev_dir failed")
127
-	}
128
-	return nil
129
-}
130
-
131
-func GetLibraryVersion() (string, error) {
132
-	buffer := make([]byte, 128)
133
-	if res := C.dm_get_library_version((*C.char)(unsafe.Pointer(&buffer)), 128); res != 1 {
134
-		return "", fmt.Errorf("dm_get_library_version failed")
135
-	}
136
-	return string(buffer), nil
137
-}
138
-
139
-type TaskType int
140
-
141 121
 const (
142 122
 	DeviceCreate TaskType = iota
143 123
 	DeviceReload
... ...
@@ -160,22 +146,41 @@ const (
160 160
 	DeviceSetGeometry
161 161
 )
162 162
 
163
-type Task struct {
164
-	unmanaged *C.struct_dm_task
165
-}
163
+var (
164
+	ErrTaskRun              = errors.New("dm_task_run failed")
165
+	ErrTaskSetName          = errors.New("dm_task_set_name failed")
166
+	ErrTaskSetMessage       = errors.New("dm_task_set_message failed")
167
+	ErrTaskSetAddNode       = errors.New("dm_task_set_add_node failed")
168
+	ErrTaskSetRO            = errors.New("dm_task_set_ro failed")
169
+	ErrTaskAddTarget        = errors.New("dm_task_add_target failed")
170
+	ErrGetDriverVersion     = errors.New("dm_task_get_driver_version failed")
171
+	ErrAttachLoopbackDevice = errors.New("loopback mounting failed")
172
+	ErrGetBlockSize         = errors.New("Can't get block size")
173
+	ErrUdevWait             = errors.New("wait on udev cookie failed")
174
+	ErrSetDevDir            = errors.New("dm_set_dev_dir failed")
175
+	ErrGetLibraryVersion    = errors.New("dm_get_library_version failed")
176
+	ErrCreateRemoveTask     = errors.New("Can't create task of type DeviceRemove")
177
+	ErrRunRemoveDevice      = errors.New("running removeDevice failed")
178
+)
166 179
 
167
-type Info struct {
168
-	Exists        int
169
-	Suspended     int
170
-	LiveTable     int
171
-	InactiveTable int
172
-	OpenCount     int32
173
-	EventNr       uint32
174
-	Major         uint32
175
-	Minor         uint32
176
-	ReadOnly      int
177
-	TargetCount   int32
178
-}
180
+type (
181
+	Task struct {
182
+		unmanaged *C.struct_dm_task
183
+	}
184
+	Info struct {
185
+		Exists        int
186
+		Suspended     int
187
+		LiveTable     int
188
+		InactiveTable int
189
+		OpenCount     int32
190
+		EventNr       uint32
191
+		Major         uint32
192
+		Minor         uint32
193
+		ReadOnly      int
194
+		TargetCount   int32
195
+	}
196
+	TaskType int
197
+)
179 198
 
180 199
 func (t *Task) destroy() {
181 200
 	if t != nil {
... ...
@@ -196,37 +201,37 @@ func TaskCreate(tasktype TaskType) *Task {
196 196
 
197 197
 func (t *Task) Run() error {
198 198
 	if res := C.dm_task_run(t.unmanaged); res != 1 {
199
-		return fmt.Errorf("dm_task_run failed")
199
+		return ErrTaskRun
200 200
 	}
201 201
 	return nil
202 202
 }
203 203
 
204 204
 func (t *Task) SetName(name string) error {
205 205
 	c_name := C.CString(name)
206
-	defer C.free(unsafe.Pointer(c_name))
206
+	defer free(c_name)
207 207
 
208 208
 	if res := C.dm_task_set_name(t.unmanaged, c_name); res != 1 {
209 209
 		if os.Getenv("DEBUG") != "" {
210 210
 			C.perror(C.CString(fmt.Sprintf("[debug] Error dm_task_set_name(%s, %#v)", name, t.unmanaged)))
211 211
 		}
212
-		return fmt.Errorf("dm_task_set_name failed")
212
+		return ErrTaskSetName
213 213
 	}
214 214
 	return nil
215 215
 }
216 216
 
217 217
 func (t *Task) SetMessage(message string) error {
218 218
 	c_message := C.CString(message)
219
-	defer C.free(unsafe.Pointer(c_message))
219
+	defer free(c_message)
220 220
 
221 221
 	if res := C.dm_task_set_message(t.unmanaged, c_message); res != 1 {
222
-		return fmt.Errorf("dm_task_set_message failed")
222
+		return ErrTaskSetMessage
223 223
 	}
224 224
 	return nil
225 225
 }
226 226
 
227 227
 func (t *Task) SetSector(sector uint64) error {
228 228
 	if res := C.dm_task_set_sector(t.unmanaged, C.uint64_t(sector)); res != 1 {
229
-		return fmt.Errorf("dm_task_set_add_node failed")
229
+		return ErrTaskSetAddNode
230 230
 	}
231 231
 	return nil
232 232
 }
... ...
@@ -234,7 +239,7 @@ func (t *Task) SetSector(sector uint64) error {
234 234
 func (t *Task) SetCookie(cookie *uint32, flags uint16) error {
235 235
 	c_cookie := C.uint32_t(*cookie)
236 236
 	if res := C.dm_task_set_cookie(t.unmanaged, &c_cookie, C.uint16_t(flags)); res != 1 {
237
-		return fmt.Errorf("dm_task_set_add_node failed")
237
+		return ErrTaskSetAddNode
238 238
 	}
239 239
 	*cookie = uint32(c_cookie)
240 240
 	return nil
... ...
@@ -242,30 +247,30 @@ func (t *Task) SetCookie(cookie *uint32, flags uint16) error {
242 242
 
243 243
 func (t *Task) SetRo() error {
244 244
 	if res := C.dm_task_set_ro(t.unmanaged); res != 1 {
245
-		return fmt.Errorf("dm_task_set_ro failed")
245
+		return ErrTaskSetRO
246 246
 	}
247 247
 	return nil
248 248
 }
249 249
 
250 250
 func (t *Task) AddTarget(start uint64, size uint64, ttype string, params string) error {
251 251
 	c_ttype := C.CString(ttype)
252
-	defer C.free(unsafe.Pointer(c_ttype))
252
+	defer free(c_ttype)
253 253
 
254 254
 	c_params := C.CString(params)
255
-	defer C.free(unsafe.Pointer(c_params))
255
+	defer free(c_params)
256 256
 
257 257
 	if res := C.dm_task_add_target(t.unmanaged, C.uint64_t(start), C.uint64_t(size), c_ttype, c_params); res != 1 {
258
-		return fmt.Errorf("dm_task_add_target failed")
258
+		return ErrTaskAddTarget
259 259
 	}
260 260
 	return nil
261 261
 }
262 262
 
263 263
 func (t *Task) GetDriverVersion() (string, error) {
264
-	buffer := (*C.char)(C.malloc(128))
265
-	defer C.free(unsafe.Pointer(buffer))
264
+	buffer := C.CString(string(make([]byte, 128)))
265
+	defer free(buffer)
266 266
 
267 267
 	if res := C.dm_task_get_driver_version(t.unmanaged, buffer, 128); res != 1 {
268
-		return "", fmt.Errorf("dm_task_get_driver_version")
268
+		return "", ErrGetDriverVersion
269 269
 	}
270 270
 	return C.GoString(buffer), nil
271 271
 }
... ...
@@ -273,7 +278,7 @@ func (t *Task) GetDriverVersion() (string, error) {
273 273
 func (t *Task) GetInfo() (*Info, error) {
274 274
 	c_info := C.struct_dm_info{}
275 275
 	if res := C.dm_task_get_info(t.unmanaged, &c_info); res != 1 {
276
-		return nil, fmt.Errorf("dm_task_get_driver_version")
276
+		return nil, ErrGetDriverVersion
277 277
 	}
278 278
 	return &Info{
279 279
 		Exists:        int(c_info.exists),
... ...
@@ -301,29 +306,40 @@ func (t *Task) GetNextTarget(next uintptr) (uintptr, uint64, uint64, string, str
301 301
 
302 302
 func AttachLoopDevice(filename string) (*os.File, error) {
303 303
 	c_filename := C.CString(filename)
304
-	defer C.free(unsafe.Pointer(c_filename))
304
+	defer free(c_filename)
305 305
 
306 306
 	var fd C.int
307 307
 	res := C.attach_loop_device(c_filename, &fd)
308 308
 	if res == nil {
309
-		return nil, fmt.Errorf("error loopback mounting")
309
+		return nil, ErrAttachLoopbackDevice
310 310
 	}
311
-	defer C.free(unsafe.Pointer(res))
311
+	defer free(res)
312
+
312 313
 	return os.NewFile(uintptr(fd), C.GoString(res)), nil
313 314
 }
314 315
 
316
+func getBlockSize(fd uintptr) int {
317
+	var size uint64
318
+
319
+	if _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, C.BLKGETSIZE64, uintptr(unsafe.Pointer(&size))); err != 0 {
320
+		utils.Debugf("Error ioctl: %s", err)
321
+		return -1
322
+	}
323
+	return int(size)
324
+}
325
+
315 326
 func GetBlockDeviceSize(file *os.File) (uint64, error) {
316 327
 	if size := C.get_block_size(C.int(file.Fd())); size == -1 {
317
-		return 0, fmt.Errorf("Can't get block size")
328
+		return 0, ErrGetBlockSize
318 329
 	} else {
319 330
 		return uint64(size), nil
320 331
 	}
321 332
 }
322 333
 
323 334
 func UdevWait(cookie uint32) error {
324
-	res := C.dm_udev_wait(C.uint32_t(cookie))
325
-	if res != 1 {
326
-		return fmt.Errorf("Failed to wait on udev cookie %d", cookie)
335
+	if res := C.dm_udev_wait(C.uint32_t(cookie)); res != 1 {
336
+		utils.Debugf("Failed to wait on udev cookie %d", cookie)
337
+		return ErrUdevWait
327 338
 	}
328 339
 	return nil
329 340
 }
... ...
@@ -332,17 +348,43 @@ func LogInitVerbose(level int) {
332 332
 	C.dm_log_init_verbose(C.int(level))
333 333
 }
334 334
 
335
+func SetDevDir(dir string) error {
336
+	c_dir := C.CString(dir)
337
+	defer free(c_dir)
338
+
339
+	if res := C.dm_set_dev_dir(c_dir); res != 1 {
340
+		utils.Debugf("Error dm_set_dev_dir")
341
+		return ErrSetDevDir
342
+	}
343
+	return nil
344
+}
345
+
346
+func GetLibraryVersion() (string, error) {
347
+	buffer := C.CString(string(make([]byte, 128)))
348
+	defer free(buffer)
349
+
350
+	if res := C.dm_get_library_version(buffer, 128); res != 1 {
351
+		return "", ErrGetLibraryVersion
352
+	}
353
+	return C.GoString(buffer), nil
354
+}
355
+
335 356
 // Useful helper for cleanup
336 357
 func RemoveDevice(name string) error {
337 358
 	task := TaskCreate(DeviceRemove)
338 359
 	if task == nil {
339
-		return fmt.Errorf("Can't create task of type DeviceRemove")
360
+		return ErrCreateRemoveTask
340 361
 	}
341 362
 	if err := task.SetName(name); err != nil {
342
-		return fmt.Errorf("Can't set task name %s", name)
363
+		utils.Debugf("Can't set task name %s", name)
364
+		return err
343 365
 	}
344 366
 	if err := task.Run(); err != nil {
345
-		return fmt.Errorf("Error running removeDevice")
367
+		return ErrRunRemoveDevice
346 368
 	}
347 369
 	return nil
348 370
 }
371
+
372
+func free(p *C.char) {
373
+	C.free(unsafe.Pointer(p))
374
+}
... ...
@@ -319,3 +319,62 @@ func TestParseLxcConfOpt(t *testing.T) {
319 319
 		}
320 320
 	}
321 321
 }
322
+
323
+type DeviceSetWrapper struct {
324
+	wrapped DeviceSet
325
+	prefix  string
326
+}
327
+
328
+func (wrapper *DeviceSetWrapper) wrap(hash string) string {
329
+	if hash != "" {
330
+		hash = wrapper.prefix + "-" + hash
331
+	}
332
+	return hash
333
+}
334
+
335
+func (wrapper *DeviceSetWrapper) AddDevice(hash, baseHash string) error {
336
+	return wrapper.wrapped.AddDevice(wrapper.wrap(hash), wrapper.wrap(baseHash))
337
+}
338
+
339
+func (wrapper *DeviceSetWrapper) SetInitialized(hash string) error {
340
+	return wrapper.wrapped.SetInitialized(wrapper.wrap(hash))
341
+}
342
+
343
+func (wrapper *DeviceSetWrapper) DeactivateDevice(hash string) error {
344
+	return wrapper.wrapped.DeactivateDevice(wrapper.wrap(hash))
345
+}
346
+
347
+func (wrapper *DeviceSetWrapper) Shutdown() error {
348
+	return nil
349
+}
350
+
351
+func (wrapper *DeviceSetWrapper) RemoveDevice(hash string) error {
352
+	return wrapper.wrapped.RemoveDevice(wrapper.wrap(hash))
353
+}
354
+
355
+func (wrapper *DeviceSetWrapper) MountDevice(hash, path string) error {
356
+	return wrapper.wrapped.MountDevice(wrapper.wrap(hash), path)
357
+}
358
+
359
+func (wrapper *DeviceSetWrapper) UnmountDevice(hash, path string) error {
360
+	return wrapper.wrapped.UnmountDevice(wrapper.wrap(hash), path)
361
+}
362
+
363
+func (wrapper *DeviceSetWrapper) HasDevice(hash string) bool {
364
+	return wrapper.wrapped.HasDevice(wrapper.wrap(hash))
365
+}
366
+
367
+func (wrapper *DeviceSetWrapper) HasInitializedDevice(hash string) bool {
368
+	return wrapper.wrapped.HasInitializedDevice(wrapper.wrap(hash))
369
+}
370
+
371
+func (wrapper *DeviceSetWrapper) HasActivatedDevice(hash string) bool {
372
+	return wrapper.wrapped.HasActivatedDevice(wrapper.wrap(hash))
373
+}
374
+
375
+func NewDeviceSetWrapper(wrapped DeviceSet, prefix string) DeviceSet {
376
+	return &DeviceSetWrapper{
377
+		wrapped: wrapped,
378
+		prefix:  prefix,
379
+	}
380
+}