diff --git a/components/engine/pkg/devicemapper/devmapper.go b/components/engine/pkg/devicemapper/devmapper.go index cc02562c16..f0a289e098 100644 --- a/components/engine/pkg/devicemapper/devmapper.go +++ b/components/engine/pkg/devicemapper/devmapper.go @@ -332,7 +332,6 @@ func RemoveDevice(name string) error { if err := task.setCookie(cookie, 0); err != nil { return fmt.Errorf("devicemapper: Can not set cookie: %s", err) } - defer UdevWait(cookie) dmSawBusy = false // reset before the task is run if err = task.run(); err != nil { @@ -342,7 +341,7 @@ func RemoveDevice(name string) error { return fmt.Errorf("devicemapper: Error running RemoveDevice %s", err) } - return nil + return UdevWait(cookie) } // RemoveDeviceDeferred is a useful helper for cleaning up a device, but deferred. @@ -368,6 +367,10 @@ func RemoveDeviceDeferred(name string) error { return fmt.Errorf("devicemapper: Can not set cookie: %s", err) } + if err = task.run(); err != nil { + return fmt.Errorf("devicemapper: Error running RemoveDeviceDeferred %s", err) + } + // libdevmapper and udev relies on System V semaphore for synchronization, // semaphores created in `task.setCookie` will be cleaned up in `UdevWait`. // So these two function call must come in pairs, otherwise semaphores will @@ -377,13 +380,8 @@ func RemoveDeviceDeferred(name string) error { // this call will not wait for the deferred removal's final executing, since no // udev event will be generated, and the semaphore's value will not be incremented // by udev, what UdevWait is just cleaning up the semaphore. - defer UdevWait(cookie) - if err = task.run(); err != nil { - return fmt.Errorf("devicemapper: Error running RemoveDeviceDeferred %s", err) - } - - return nil + return UdevWait(cookie) } // CancelDeferredRemove cancels a deferred remove for a device. @@ -477,13 +475,12 @@ func CreatePool(poolName string, dataFile, metadataFile *os.File, poolBlockSize if err := task.setCookie(cookie, flags); err != nil { return fmt.Errorf("devicemapper: Can't set cookie %s", err) } - defer UdevWait(cookie) if err := task.run(); err != nil { return fmt.Errorf("devicemapper: Error running deviceCreate (CreatePool) %s", err) } - return nil + return UdevWait(cookie) } // ReloadPool is the programmatic example of "dmsetup reload". @@ -663,13 +660,12 @@ func ResumeDevice(name string) error { if err := task.setCookie(cookie, 0); err != nil { return fmt.Errorf("devicemapper: Can't set cookie %s", err) } - defer UdevWait(cookie) if err := task.run(); err != nil { return fmt.Errorf("devicemapper: Error running deviceResume %s", err) } - return nil + return UdevWait(cookie) } // CreateDevice creates a device with the specified poolName with the specified device id. @@ -762,13 +758,11 @@ func activateDevice(poolName string, name string, deviceID int, size uint64, ext return fmt.Errorf("devicemapper: Can't set cookie %s", err) } - defer UdevWait(cookie) - if err := task.run(); err != nil { return fmt.Errorf("devicemapper: Error running deviceCreate (ActivateDevice) %s", err) } - return nil + return UdevWait(cookie) } // CreateSnapDeviceRaw creates a snapshot device. Caller needs to suspend and resume the origin device if it is active.