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

Merge pull request #24740 from jizhilong/devmapper-deferred-remove

devmapper: prevent libdevmapper from deleting /dev/mapper/docker-xxx symbolic links in RemoveDeviceDeferred
This commit is contained in:
Michael Crosby 2016-08-23 10:23:37 -07:00 committed by GitHub
commit 684d3f0c9c

View file

@ -358,6 +358,27 @@ func RemoveDeviceDeferred(name string) error {
return ErrTaskDeferredRemove return ErrTaskDeferredRemove
} }
// set a task cookie and disable library fallback, or else libdevmapper will
// disable udev dm rules and delete the symlink under /dev/mapper by itself,
// even if the removal is deferred by the kernel.
var cookie uint
var flags uint16
flags = DmUdevDisableLibraryFallback
if err := task.setCookie(&cookie, flags); err != nil {
return fmt.Errorf("devicemapper: Can not set cookie: %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
// be leaked, and the limit of number of semaphores defined in `/proc/sys/kernel/sem`
// will be reached, which will eventually make all follwing calls to 'task.SetCookie'
// fail.
// 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 { if err = task.run(); err != nil {
return fmt.Errorf("devicemapper: Error running RemoveDeviceDeferred %s", err) return fmt.Errorf("devicemapper: Error running RemoveDeviceDeferred %s", err)
} }