1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Merge pull request #33877 from rhvgoyal/sync-removal

devicemapper: Wait for device removal if deferredRemoval=true and deferredDeletion=…
This commit is contained in:
Sebastiaan van Stijn 2017-07-12 17:35:45 -07:00 committed by GitHub
commit e04dbe5ac2
2 changed files with 33 additions and 8 deletions

View file

@ -2087,7 +2087,16 @@ func (devices *DeviceSet) deleteDevice(info *devInfo, syncDelete bool) error {
} }
// Try to deactivate device in case it is active. // Try to deactivate device in case it is active.
if err := devices.deactivateDevice(info); err != nil { // If deferred removal is enabled and deferred deletion is disabled
// then make sure device is removed synchronously. There have been
// some cases of device being busy for short duration and we would
// rather busy wait for device removal to take care of these cases.
deferredRemove := devices.deferredRemove
if !devices.deferredDelete {
deferredRemove = false
}
if err := devices.deactivateDeviceMode(info, deferredRemove); err != nil {
logrus.Debugf("devmapper: Error deactivating device: %s", err) logrus.Debugf("devmapper: Error deactivating device: %s", err)
return err return err
} }
@ -2144,6 +2153,11 @@ func (devices *DeviceSet) deactivatePool() error {
} }
func (devices *DeviceSet) deactivateDevice(info *devInfo) error { func (devices *DeviceSet) deactivateDevice(info *devInfo) error {
return devices.deactivateDeviceMode(info, devices.deferredRemove)
}
func (devices *DeviceSet) deactivateDeviceMode(info *devInfo, deferredRemove bool) error {
var err error
logrus.Debugf("devmapper: deactivateDevice START(%s)", info.Hash) logrus.Debugf("devmapper: deactivateDevice START(%s)", info.Hash)
defer logrus.Debugf("devmapper: deactivateDevice END(%s)", info.Hash) defer logrus.Debugf("devmapper: deactivateDevice END(%s)", info.Hash)
@ -2156,14 +2170,17 @@ func (devices *DeviceSet) deactivateDevice(info *devInfo) error {
return nil return nil
} }
if devices.deferredRemove { if deferredRemove {
if err := devicemapper.RemoveDeviceDeferred(info.Name()); err != nil { err = devicemapper.RemoveDeviceDeferred(info.Name())
return err
}
} else { } else {
if err := devices.removeDevice(info.Name()); err != nil { err = devices.removeDevice(info.Name())
return err }
}
// This function's semantics is such that it does not return an
// error if device does not exist. So if device went away by
// the time we actually tried to remove it, do not return error.
if err != devicemapper.ErrEnxio {
return err
} }
return nil return nil
} }

View file

@ -336,10 +336,14 @@ func RemoveDevice(name string) error {
defer UdevWait(cookie) defer UdevWait(cookie)
dmSawBusy = false // reset before the task is run dmSawBusy = false // reset before the task is run
dmSawEnxio = false
if err = task.run(); err != nil { if err = task.run(); err != nil {
if dmSawBusy { if dmSawBusy {
return ErrBusy return ErrBusy
} }
if dmSawEnxio {
return ErrEnxio
}
return fmt.Errorf("devicemapper: Error running RemoveDevice %s", err) return fmt.Errorf("devicemapper: Error running RemoveDevice %s", err)
} }
@ -380,7 +384,11 @@ func RemoveDeviceDeferred(name string) error {
// by udev, what UdevWait is just cleaning up the semaphore. // by udev, what UdevWait is just cleaning up the semaphore.
defer UdevWait(cookie) defer UdevWait(cookie)
dmSawEnxio = false
if err = task.run(); err != nil { if err = task.run(); err != nil {
if dmSawEnxio {
return ErrEnxio
}
return fmt.Errorf("devicemapper: Error running RemoveDeviceDeferred %s", err) return fmt.Errorf("devicemapper: Error running RemoveDeviceDeferred %s", err)
} }