| ... | ... |
@@ -44,11 +44,11 @@ var ( |
| 44 | 44 |
ErrTaskSetName = errors.New("dm_task_set_name failed")
|
| 45 | 45 |
ErrTaskSetMessage = errors.New("dm_task_set_message failed")
|
| 46 | 46 |
ErrTaskSetAddNode = errors.New("dm_task_set_add_node failed")
|
| 47 |
- ErrTaskSetRO = errors.New("dm_task_set_ro failed")
|
|
| 47 |
+ ErrTaskSetRo = errors.New("dm_task_set_ro failed")
|
|
| 48 | 48 |
ErrTaskAddTarget = errors.New("dm_task_add_target failed")
|
| 49 | 49 |
ErrTaskSetSector = errors.New("dm_task_set_sector failed")
|
| 50 |
- ErrGetInfo = errors.New("dm_task_get_info failed")
|
|
| 51 |
- ErrGetDriverVersion = errors.New("dm_task_get_driver_version failed")
|
|
| 50 |
+ ErrTaskGetInfo = errors.New("dm_task_get_info failed")
|
|
| 51 |
+ ErrTaskGetDriverVersion = errors.New("dm_task_get_driver_version failed")
|
|
| 52 | 52 |
ErrTaskSetCookie = errors.New("dm_task_set_cookie failed")
|
| 53 | 53 |
ErrNilCookie = errors.New("cookie ptr can't be nil")
|
| 54 | 54 |
ErrAttachLoopbackDevice = errors.New("loopback mounting failed")
|
| ... | ... |
@@ -58,6 +58,7 @@ var ( |
| 58 | 58 |
ErrGetLibraryVersion = errors.New("dm_get_library_version failed")
|
| 59 | 59 |
ErrCreateRemoveTask = errors.New("Can't create task of type DeviceRemove")
|
| 60 | 60 |
ErrRunRemoveDevice = errors.New("running removeDevice failed")
|
| 61 |
+ ErrInvalidAddNode = errors.New("Invalide AddNoce type")
|
|
| 61 | 62 |
) |
| 62 | 63 |
|
| 63 | 64 |
type ( |
| ... | ... |
@@ -136,6 +137,9 @@ func (t *Task) SetCookie(cookie *uint, flags uint16) error {
|
| 136 | 136 |
} |
| 137 | 137 |
|
| 138 | 138 |
func (t *Task) SetAddNode(addNode AddNodeType) error {
|
| 139 |
+ if addNode != AddNodeOnResume && addNode != AddNodeOnCreate {
|
|
| 140 |
+ return ErrInvalidAddNode |
|
| 141 |
+ } |
|
| 139 | 142 |
if res := DmTaskSetAddNode(t.unmanaged, addNode); res != 1 {
|
| 140 | 143 |
return ErrTaskSetAddNode |
| 141 | 144 |
} |
| ... | ... |
@@ -144,7 +148,7 @@ func (t *Task) SetAddNode(addNode AddNodeType) error {
|
| 144 | 144 |
|
| 145 | 145 |
func (t *Task) SetRo() error {
|
| 146 | 146 |
if res := DmTaskSetRo(t.unmanaged); res != 1 {
|
| 147 |
- return ErrTaskSetRO |
|
| 147 |
+ return ErrTaskSetRo |
|
| 148 | 148 |
} |
| 149 | 149 |
return nil |
| 150 | 150 |
} |
| ... | ... |
@@ -157,18 +161,10 @@ func (t *Task) AddTarget(start, size uint64, ttype, params string) error {
|
| 157 | 157 |
return nil |
| 158 | 158 |
} |
| 159 | 159 |
|
| 160 |
-func (t *Task) GetDriverVersion() (string, error) {
|
|
| 161 |
- var version string |
|
| 162 |
- if res := DmTaskGetDriverVersion(t.unmanaged, &version); res != 1 {
|
|
| 163 |
- return "", ErrGetDriverVersion |
|
| 164 |
- } |
|
| 165 |
- return version, nil |
|
| 166 |
-} |
|
| 167 |
- |
|
| 168 | 160 |
func (t *Task) GetInfo() (*Info, error) {
|
| 169 | 161 |
info := &Info{}
|
| 170 | 162 |
if res := DmTaskGetInfo(t.unmanaged, info); res != 1 {
|
| 171 |
- return nil, ErrGetInfo |
|
| 163 |
+ return nil, ErrTaskGetInfo |
|
| 172 | 164 |
} |
| 173 | 165 |
return info, nil |
| 174 | 166 |
} |
| ... | ... |
@@ -190,24 +186,6 @@ func AttachLoopDevice(filename string) (*os.File, error) {
|
| 190 | 190 |
return os.NewFile(uintptr(fd), res), nil |
| 191 | 191 |
} |
| 192 | 192 |
|
| 193 |
-func getBlockSize(fd uintptr) int {
|
|
| 194 |
- var size uint64 |
|
| 195 |
- |
|
| 196 |
- if err := SysGetBlockSize(fd, &size); err != 0 {
|
|
| 197 |
- utils.Debugf("Error ioctl (getBlockSize: %s)", err)
|
|
| 198 |
- return -1 |
|
| 199 |
- } |
|
| 200 |
- return int(size) |
|
| 201 |
-} |
|
| 202 |
- |
|
| 203 |
-func GetBlockDeviceSize(file *os.File) (uint64, error) {
|
|
| 204 |
- size := DmGetBlockSize(file.Fd()) |
|
| 205 |
- if size == -1 {
|
|
| 206 |
- return 0, ErrGetBlockSize |
|
| 207 |
- } |
|
| 208 |
- return uint64(size), nil |
|
| 209 |
-} |
|
| 210 |
- |
|
| 211 | 193 |
func UdevWait(cookie uint) error {
|
| 212 | 194 |
if res := DmUdevWait(cookie); res != 1 {
|
| 213 | 195 |
utils.Debugf("Failed to wait on udev cookie %d", cookie)
|
| ... | ... |
@@ -259,6 +237,14 @@ func RemoveDevice(name string) error {
|
| 259 | 259 |
return nil |
| 260 | 260 |
} |
| 261 | 261 |
|
| 262 |
+func GetBlockDeviceSize(file *os.File) (uint64, error) {
|
|
| 263 |
+ size, errno := DmGetBlockSize(file.Fd()) |
|
| 264 |
+ if size == -1 || errno != 0 {
|
|
| 265 |
+ return 0, ErrGetBlockSize |
|
| 266 |
+ } |
|
| 267 |
+ return uint64(size), nil |
|
| 268 |
+} |
|
| 269 |
+ |
|
| 262 | 270 |
// This is the programmatic example of "dmsetup create" |
| 263 | 271 |
func createPool(poolName string, dataFile *os.File, metadataFile *os.File) error {
|
| 264 | 272 |
task, err := createTask(DeviceCreate, poolName) |
| ... | ... |
@@ -282,7 +268,7 @@ func createPool(poolName string, dataFile *os.File, metadataFile *os.File) error |
| 282 | 282 |
} |
| 283 | 283 |
|
| 284 | 284 |
if err := task.Run(); err != nil {
|
| 285 |
- return fmt.Errorf("Error running DeviceCreate")
|
|
| 285 |
+ return fmt.Errorf("Error running DeviceCreate (createPool)")
|
|
| 286 | 286 |
} |
| 287 | 287 |
|
| 288 | 288 |
UdevWait(cookie) |
| ... | ... |
@@ -462,7 +448,7 @@ func activateDevice(poolName string, name string, deviceId int, size uint64) err |
| 462 | 462 |
} |
| 463 | 463 |
|
| 464 | 464 |
if err := task.Run(); err != nil {
|
| 465 |
- return fmt.Errorf("Error running DeviceCreate")
|
|
| 465 |
+ return fmt.Errorf("Error running DeviceCreate (activateDevice)")
|
|
| 466 | 466 |
} |
| 467 | 467 |
|
| 468 | 468 |
UdevWait(cookie) |
| ... | ... |
@@ -506,7 +492,7 @@ func (devices *DeviceSet) createSnapDevice(poolName string, deviceId int, baseNa |
| 506 | 506 |
if doSuspend {
|
| 507 | 507 |
resumeDevice(baseName) |
| 508 | 508 |
} |
| 509 |
- return fmt.Errorf("Error running DeviceCreate")
|
|
| 509 |
+ return fmt.Errorf("Error running DeviceCreate (createSnapDevice)")
|
|
| 510 | 510 |
} |
| 511 | 511 |
|
| 512 | 512 |
if doSuspend {
|
| ... | ... |
@@ -36,11 +36,11 @@ func TestTaskRun(t *testing.T) {
|
| 36 | 36 |
|
| 37 | 37 |
task = taskCreate(t, DeviceInfo) |
| 38 | 38 |
// Perform the RUN |
| 39 |
- if err := task.Run(); err == nil {
|
|
| 39 |
+ if err := task.Run(); err != ErrTaskRun {
|
|
| 40 | 40 |
t.Fatalf("An error should have occured while running task.")
|
| 41 | 41 |
} |
| 42 | 42 |
// Make sure GetInfo also fails |
| 43 |
- if _, err := task.GetInfo(); err == nil {
|
|
| 43 |
+ if _, err := task.GetInfo(); err != ErrTaskGetInfo {
|
|
| 44 | 44 |
t.Fatalf("GetInfo should fail if task.Run() failed.")
|
| 45 | 45 |
} |
| 46 | 46 |
} |
| ... | ... |
@@ -56,6 +56,7 @@ func TestTaskSetName(t *testing.T) {
|
| 56 | 56 |
// Test failure |
| 57 | 57 |
DmTaskSetName = dmTaskSetNameFail |
| 58 | 58 |
defer func() { DmTaskSetName = dmTaskSetNameFct }()
|
| 59 |
+ |
|
| 59 | 60 |
if err := task.SetName("test"); err != ErrTaskSetName {
|
| 60 | 61 |
t.Fatalf("An error should have occured while runnign SetName.")
|
| 61 | 62 |
} |
| ... | ... |
@@ -72,6 +73,7 @@ func TestTaskSetMessage(t *testing.T) {
|
| 72 | 72 |
// Test failure |
| 73 | 73 |
DmTaskSetMessage = dmTaskSetMessageFail |
| 74 | 74 |
defer func() { DmTaskSetMessage = dmTaskSetMessageFct }()
|
| 75 |
+ |
|
| 75 | 76 |
if err := task.SetMessage("test"); err != ErrTaskSetMessage {
|
| 76 | 77 |
t.Fatalf("An error should have occured while runnign SetMessage.")
|
| 77 | 78 |
} |
| ... | ... |
@@ -120,22 +122,84 @@ func TestTaskSetCookie(t *testing.T) {
|
| 120 | 120 |
|
| 121 | 121 |
func TestTaskSetAddNode(t *testing.T) {
|
| 122 | 122 |
task := taskCreate(t, DeviceInfo) |
| 123 |
+ |
|
| 124 |
+ // Test success |
|
| 123 | 125 |
if err := task.SetAddNode(0); err != nil {
|
| 124 | 126 |
t.Fatal(err) |
| 125 | 127 |
} |
| 128 |
+ |
|
| 129 |
+ // Test failure |
|
| 130 |
+ if err := task.SetAddNode(-1); err != ErrInvalidAddNode {
|
|
| 131 |
+ t.Fatalf("An error should have occured running SetAddNode with wrong node.")
|
|
| 132 |
+ } |
|
| 133 |
+ |
|
| 134 |
+ DmTaskSetAddNode = dmTaskSetAddNodeFail |
|
| 135 |
+ defer func() { DmTaskSetAddNode = dmTaskSetAddNodeFct }()
|
|
| 136 |
+ |
|
| 137 |
+ if err := task.SetAddNode(0); err != ErrTaskSetAddNode {
|
|
| 138 |
+ t.Fatalf("An error should have occured running SetAddNode.")
|
|
| 139 |
+ } |
|
| 126 | 140 |
} |
| 127 | 141 |
|
| 128 | 142 |
func TestTaskSetRo(t *testing.T) {
|
| 129 | 143 |
task := taskCreate(t, DeviceInfo) |
| 144 |
+ |
|
| 145 |
+ // Test success |
|
| 130 | 146 |
if err := task.SetRo(); err != nil {
|
| 131 | 147 |
t.Fatal(err) |
| 132 | 148 |
} |
| 149 |
+ |
|
| 150 |
+ // Test failure |
|
| 151 |
+ DmTaskSetRo = dmTaskSetRoFail |
|
| 152 |
+ defer func() { DmTaskSetRo = dmTaskSetRoFct }()
|
|
| 153 |
+ |
|
| 154 |
+ if err := task.SetRo(); err != ErrTaskSetRo {
|
|
| 155 |
+ t.Fatalf("An error should have occured running SetRo.")
|
|
| 156 |
+ } |
|
| 133 | 157 |
} |
| 134 | 158 |
|
| 135 | 159 |
func TestTaskAddTarget(t *testing.T) {
|
| 136 |
- // task := taskCreate(t, DeviceInfo) |
|
| 160 |
+ task := taskCreate(t, DeviceInfo) |
|
| 161 |
+ |
|
| 162 |
+ // Test success |
|
| 163 |
+ if err := task.AddTarget(0, 128, "thinp", ""); err != nil {
|
|
| 164 |
+ t.Fatal(err) |
|
| 165 |
+ } |
|
| 166 |
+ |
|
| 167 |
+ // Test failure |
|
| 168 |
+ DmTaskAddTarget = dmTaskAddTargetFail |
|
| 169 |
+ defer func() { DmTaskAddTarget = dmTaskAddTargetFct }()
|
|
| 170 |
+ |
|
| 171 |
+ if err := task.AddTarget(0, 128, "thinp", ""); err != ErrTaskAddTarget {
|
|
| 172 |
+ t.Fatalf("An error should have occured running AddTarget.")
|
|
| 173 |
+ } |
|
| 137 | 174 |
} |
| 138 | 175 |
|
| 176 |
+// func TestTaskGetInfo(t *testing.T) {
|
|
| 177 |
+// task := taskCreate(t, DeviceInfo) |
|
| 178 |
+ |
|
| 179 |
+// // Test success |
|
| 180 |
+// if _, err := task.GetInfo(); err != nil {
|
|
| 181 |
+// t.Fatal(err) |
|
| 182 |
+// } |
|
| 183 |
+ |
|
| 184 |
+// // Test failure |
|
| 185 |
+// DmTaskGetInfo = dmTaskGetInfoFail |
|
| 186 |
+// defer func() { DmTaskGetInfo = dmTaskGetInfoFct }()
|
|
| 187 |
+ |
|
| 188 |
+// if _, err := task.GetInfo(); err != ErrTaskGetInfo {
|
|
| 189 |
+// t.Fatalf("An error should have occured running GetInfo.")
|
|
| 190 |
+// } |
|
| 191 |
+// } |
|
| 192 |
+ |
|
| 193 |
+// func TestTaskGetNextTarget(t *testing.T) {
|
|
| 194 |
+// task := taskCreate(t, DeviceInfo) |
|
| 195 |
+ |
|
| 196 |
+// if next, _, _, _, _ := task.GetNextTarget(0); next == 0 {
|
|
| 197 |
+// t.Fatalf("The next target should not be 0.")
|
|
| 198 |
+// } |
|
| 199 |
+// } |
|
| 200 |
+ |
|
| 139 | 201 |
/// Utils |
| 140 | 202 |
func taskCreate(t *testing.T, taskType TaskType) *Task {
|
| 141 | 203 |
task := TaskCreate(taskType) |
| ... | ... |
@@ -116,15 +116,6 @@ char* attach_loop_device(const char *filename, int *loop_fd_out) |
| 116 | 116 |
return (NULL); |
| 117 | 117 |
} |
| 118 | 118 |
|
| 119 |
-static int64_t get_block_size(int fd) |
|
| 120 |
-{
|
|
| 121 |
- uint64_t size; |
|
| 122 |
- |
|
| 123 |
- if (ioctl(fd, BLKGETSIZE64, &size) == -1) |
|
| 124 |
- return -1; |
|
| 125 |
- return ((int64_t)size); |
|
| 126 |
-} |
|
| 127 |
- |
|
| 128 | 119 |
extern void DevmapperLogCallback(int level, char *file, int line, int dm_errno_or_class, char *str); |
| 129 | 120 |
|
| 130 | 121 |
static void log_cb(int level, const char *file, int line, |
| ... | ... |
@@ -158,27 +149,26 @@ type ( |
| 158 | 158 |
) |
| 159 | 159 |
|
| 160 | 160 |
var ( |
| 161 |
- DmTaskDestory = dmTaskDestroyFct |
|
| 162 |
- DmTaskCreate = dmTaskCreateFct |
|
| 163 |
- DmTaskRun = dmTaskRunFct |
|
| 164 |
- DmTaskSetName = dmTaskSetNameFct |
|
| 165 |
- DmTaskSetMessage = dmTaskSetMessageFct |
|
| 166 |
- DmTaskSetSector = dmTaskSetSectorFct |
|
| 167 |
- DmTaskSetCookie = dmTaskSetCookieFct |
|
| 168 |
- DmTaskSetAddNode = dmTaskSetAddNodeFct |
|
| 169 |
- DmTaskSetRo = dmTaskSetRoFct |
|
| 170 |
- DmTaskAddTarget = dmTaskAddTargetFct |
|
| 171 |
- DmTaskGetDriverVersion = dmTaskGetDriverVersionFct |
|
| 172 |
- DmTaskGetInfo = dmTaskGetInfoFct |
|
| 173 |
- DmGetNextTarget = dmGetNextTargetFct |
|
| 174 |
- DmAttachLoopDevice = dmAttachLoopDeviceFct |
|
| 175 |
- SysGetBlockSize = sysGetBlockSizeFct |
|
| 176 |
- DmGetBlockSize = dmGetBlockSizeFct |
|
| 177 |
- DmUdevWait = dmUdevWaitFct |
|
| 178 |
- DmLogInitVerbose = dmLogInitVerboseFct |
|
| 179 |
- LogWithErrnoInit = logWithErrnoInitFct |
|
| 180 |
- DmSetDevDir = dmSetDevDirFct |
|
| 181 |
- DmGetLibraryVersion = dmGetLibraryVersionFct |
|
| 161 |
+ DmTaskDestory = dmTaskDestroyFct |
|
| 162 |
+ DmTaskCreate = dmTaskCreateFct |
|
| 163 |
+ DmTaskRun = dmTaskRunFct |
|
| 164 |
+ DmTaskSetName = dmTaskSetNameFct |
|
| 165 |
+ DmTaskSetMessage = dmTaskSetMessageFct |
|
| 166 |
+ DmTaskSetSector = dmTaskSetSectorFct |
|
| 167 |
+ DmTaskSetCookie = dmTaskSetCookieFct |
|
| 168 |
+ DmTaskSetAddNode = dmTaskSetAddNodeFct |
|
| 169 |
+ DmTaskSetRo = dmTaskSetRoFct |
|
| 170 |
+ DmTaskAddTarget = dmTaskAddTargetFct |
|
| 171 |
+ DmTaskGetInfo = dmTaskGetInfoFct |
|
| 172 |
+ DmGetNextTarget = dmGetNextTargetFct |
|
| 173 |
+ DmGetBlockSize = dmGetBlockSizeFct |
|
| 174 |
+ DmAttachLoopDevice = dmAttachLoopDeviceFct |
|
| 175 |
+ DmUdevWait = dmUdevWaitFct |
|
| 176 |
+ DmLogInitVerbose = dmLogInitVerboseFct |
|
| 177 |
+ DmSetDevDir = dmSetDevDirFct |
|
| 178 |
+ DmGetLibraryVersion = dmGetLibraryVersionFct |
|
| 179 |
+ LogWithErrnoInit = logWithErrnoInitFct |
|
| 180 |
+ GetBlockSize = getBlockSizeFct |
|
| 182 | 181 |
) |
| 183 | 182 |
|
| 184 | 183 |
func free(p *C.char) {
|
| ... | ... |
@@ -249,14 +239,11 @@ func dmTaskAddTargetFct(task *CDmTask, |
| 249 | 249 |
C.uint64_t(start), C.uint64_t(size), Cttype, Cparams)) |
| 250 | 250 |
} |
| 251 | 251 |
|
| 252 |
-func dmTaskGetDriverVersionFct(task *CDmTask, version *string) int {
|
|
| 253 |
- buffer := C.CString(string(make([]byte, 128))) |
|
| 254 |
- defer free(buffer) |
|
| 255 |
- defer func() {
|
|
| 256 |
- *version = C.GoString(buffer) |
|
| 257 |
- }() |
|
| 258 |
- return int(C.dm_task_get_driver_version((*C.struct_dm_task)(task), |
|
| 259 |
- buffer, 128)) |
|
| 252 |
+func dmGetBlockSizeFct(fd uintptr) (int64, syscall.Errno) {
|
|
| 253 |
+ var size int64 |
|
| 254 |
+ _, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, C.BLKGETSIZE64, |
|
| 255 |
+ uintptr(unsafe.Pointer(&size))) |
|
| 256 |
+ return size, err |
|
| 260 | 257 |
} |
| 261 | 258 |
|
| 262 | 259 |
func dmTaskGetInfoFct(task *CDmTask, info *Info) int {
|
| ... | ... |
@@ -308,18 +295,12 @@ func dmAttachLoopDeviceFct(filename string, fd *int) string {
|
| 308 | 308 |
return C.GoString(ret) |
| 309 | 309 |
} |
| 310 | 310 |
|
| 311 |
-// sysGetBlockSizeFct retrieves the block size from IOCTL |
|
| 312 |
-func sysGetBlockSizeFct(fd uintptr, size *uint64) syscall.Errno {
|
|
| 311 |
+func getBlockSizeFct(fd uintptr, size *uint64) syscall.Errno {
|
|
| 313 | 312 |
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, C.BLKGETSIZE64, |
| 314 | 313 |
uintptr(unsafe.Pointer(&size))) |
| 315 | 314 |
return err |
| 316 | 315 |
} |
| 317 | 316 |
|
| 318 |
-// dmGetBlockSizeFct retrieves the block size from library call |
|
| 319 |
-func dmGetBlockSizeFct(fd uintptr) int64 {
|
|
| 320 |
- return int64(C.get_block_size(C.int(fd))) |
|
| 321 |
-} |
|
| 322 |
- |
|
| 323 | 317 |
func dmUdevWaitFct(cookie uint) int {
|
| 324 | 318 |
return int(C.dm_udev_wait(C.uint32_t(cookie))) |
| 325 | 319 |
} |