|
@@ -64,7 +64,8 @@ var (
|
|
|
ErrLoopbackSetCapacity = errors.New("Unable set loopback capacity")
|
|
|
ErrBusy = errors.New("Device is Busy")
|
|
|
|
|
|
- dmSawBusy bool
|
|
|
+ dmSawBusy bool
|
|
|
+ dmSawExist bool
|
|
|
)
|
|
|
|
|
|
type (
|
|
@@ -467,23 +468,33 @@ func resumeDevice(name string) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func createDevice(poolName string, deviceId int) error {
|
|
|
- utils.Debugf("[devmapper] createDevice(poolName=%v, deviceId=%v)", poolName, deviceId)
|
|
|
- task, err := createTask(DeviceTargetMsg, poolName)
|
|
|
- if task == nil {
|
|
|
- return err
|
|
|
- }
|
|
|
+func createDevice(poolName string, deviceId *int) error {
|
|
|
+ utils.Debugf("[devmapper] createDevice(poolName=%v, deviceId=%v)", poolName, *deviceId)
|
|
|
|
|
|
- if err := task.SetSector(0); err != nil {
|
|
|
- return fmt.Errorf("Can't set sector")
|
|
|
- }
|
|
|
+ for {
|
|
|
+ task, err := createTask(DeviceTargetMsg, poolName)
|
|
|
+ if task == nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
- if err := task.SetMessage(fmt.Sprintf("create_thin %d", deviceId)); err != nil {
|
|
|
- return fmt.Errorf("Can't set message")
|
|
|
- }
|
|
|
+ if err := task.SetSector(0); err != nil {
|
|
|
+ return fmt.Errorf("Can't set sector")
|
|
|
+ }
|
|
|
|
|
|
- if err := task.Run(); err != nil {
|
|
|
- return fmt.Errorf("Error running createDevice")
|
|
|
+ if err := task.SetMessage(fmt.Sprintf("create_thin %d", *deviceId)); err != nil {
|
|
|
+ return fmt.Errorf("Can't set message")
|
|
|
+ }
|
|
|
+
|
|
|
+ dmSawExist = false
|
|
|
+ if err := task.Run(); err != nil {
|
|
|
+ if dmSawExist {
|
|
|
+ // Already exists, try next id
|
|
|
+ *deviceId++
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ return fmt.Errorf("Error running createDevice")
|
|
|
+ }
|
|
|
+ break
|
|
|
}
|
|
|
return nil
|
|
|
}
|
|
@@ -553,7 +564,7 @@ func activateDevice(poolName string, name string, deviceId int, size uint64) err
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func createSnapDevice(poolName string, deviceId int, baseName string, baseDeviceId int) error {
|
|
|
+func createSnapDevice(poolName string, deviceId *int, baseName string, baseDeviceId int) error {
|
|
|
devinfo, _ := getInfo(baseName)
|
|
|
doSuspend := devinfo != nil && devinfo.Exists != 0
|
|
|
|
|
@@ -563,33 +574,44 @@ func createSnapDevice(poolName string, deviceId int, baseName string, baseDevice
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- task, err := createTask(DeviceTargetMsg, poolName)
|
|
|
- if task == nil {
|
|
|
- if doSuspend {
|
|
|
- resumeDevice(baseName)
|
|
|
+ for {
|
|
|
+ task, err := createTask(DeviceTargetMsg, poolName)
|
|
|
+ if task == nil {
|
|
|
+ if doSuspend {
|
|
|
+ resumeDevice(baseName)
|
|
|
+ }
|
|
|
+ return err
|
|
|
}
|
|
|
- return err
|
|
|
- }
|
|
|
|
|
|
- if err := task.SetSector(0); err != nil {
|
|
|
- if doSuspend {
|
|
|
- resumeDevice(baseName)
|
|
|
+ if err := task.SetSector(0); err != nil {
|
|
|
+ if doSuspend {
|
|
|
+ resumeDevice(baseName)
|
|
|
+ }
|
|
|
+ return fmt.Errorf("Can't set sector")
|
|
|
}
|
|
|
- return fmt.Errorf("Can't set sector")
|
|
|
- }
|
|
|
|
|
|
- if err := task.SetMessage(fmt.Sprintf("create_snap %d %d", deviceId, baseDeviceId)); err != nil {
|
|
|
- if doSuspend {
|
|
|
- resumeDevice(baseName)
|
|
|
+ if err := task.SetMessage(fmt.Sprintf("create_snap %d %d", *deviceId, baseDeviceId)); err != nil {
|
|
|
+ if doSuspend {
|
|
|
+ resumeDevice(baseName)
|
|
|
+ }
|
|
|
+ return fmt.Errorf("Can't set message")
|
|
|
}
|
|
|
- return fmt.Errorf("Can't set message")
|
|
|
- }
|
|
|
|
|
|
- if err := task.Run(); err != nil {
|
|
|
- if doSuspend {
|
|
|
- resumeDevice(baseName)
|
|
|
+ dmSawExist = false
|
|
|
+ if err := task.Run(); err != nil {
|
|
|
+ if dmSawExist {
|
|
|
+ // Already exists, try next id
|
|
|
+ *deviceId++
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ if doSuspend {
|
|
|
+ resumeDevice(baseName)
|
|
|
+ }
|
|
|
+ return fmt.Errorf("Error running DeviceCreate (createSnapDevice)")
|
|
|
}
|
|
|
- return fmt.Errorf("Error running DeviceCreate (createSnapDevice)")
|
|
|
+
|
|
|
+ break
|
|
|
}
|
|
|
|
|
|
if doSuspend {
|