98fe4bd8f1
dm_task_deferred_remove is not supported by all distributions, due to out-dated versions of devicemapper. However, in the case where the devicemapper library was updated without rebuilding Docker (which can happen in some distributions) then we should attempt to dynamically load the relevant object rather than try to link to it. This can only be done if Docker was built dynamically, for obvious reasons. In order to avoid having issues arise when dlsym(3) was unnecessary, gate the whole dlsym(3) logic behind a buildflag that we disable by default (libdm_dlsym_deferred_remove). Signed-off-by: Aleksa Sarai <asarai@suse.de>
35 lines
1.1 KiB
Go
35 lines
1.1 KiB
Go
// +build linux,cgo,!static_build
|
|
// +build !libdm_dlsym_deferred_remove,!libdm_no_deferred_remove
|
|
|
|
package devicemapper // import "github.com/docker/docker/pkg/devicemapper"
|
|
|
|
/*
|
|
#include <libdevmapper.h>
|
|
*/
|
|
import "C"
|
|
|
|
// LibraryDeferredRemovalSupport tells if the feature is supported by the
|
|
// current Docker invocation.
|
|
const LibraryDeferredRemovalSupport = true
|
|
|
|
func dmTaskDeferredRemoveFct(task *cdmTask) int {
|
|
return int(C.dm_task_deferred_remove((*C.struct_dm_task)(task)))
|
|
}
|
|
|
|
func dmTaskGetInfoWithDeferredFct(task *cdmTask, info *Info) int {
|
|
Cinfo := C.struct_dm_info{}
|
|
defer func() {
|
|
info.Exists = int(Cinfo.exists)
|
|
info.Suspended = int(Cinfo.suspended)
|
|
info.LiveTable = int(Cinfo.live_table)
|
|
info.InactiveTable = int(Cinfo.inactive_table)
|
|
info.OpenCount = int32(Cinfo.open_count)
|
|
info.EventNr = uint32(Cinfo.event_nr)
|
|
info.Major = uint32(Cinfo.major)
|
|
info.Minor = uint32(Cinfo.minor)
|
|
info.ReadOnly = int(Cinfo.read_only)
|
|
info.TargetCount = int32(Cinfo.target_count)
|
|
info.DeferredRemove = int(Cinfo.deferred_remove)
|
|
}()
|
|
return int(C.dm_task_get_info((*C.struct_dm_task)(task), &Cinfo))
|
|
}
|