devicemapper: Create a method to get device info with deferred remove field

Deferred reove functionality was added to library later. So in old version
of library it did not report deferred_remove field. 

Create a new function which also gets deferred_remove field and it will be
called only on newer version of library. 

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
This commit is contained in:
Vivek Goyal 2015-04-21 18:14:59 -04:00
parent 48536e29e5
commit e2bca8900c
4 changed files with 76 additions and 33 deletions

View file

@ -87,16 +87,17 @@ type (
Device []uint64 Device []uint64
} }
Info struct { Info struct {
Exists int Exists int
Suspended int Suspended int
LiveTable int LiveTable int
InactiveTable int InactiveTable int
OpenCount int32 OpenCount int32
EventNr uint32 EventNr uint32
Major uint32 Major uint32
Minor uint32 Minor uint32
ReadOnly int ReadOnly int
TargetCount int32 TargetCount int32
DeferredRemove int
} }
TaskType int TaskType int
AddNodeType int AddNodeType int
@ -222,6 +223,14 @@ func (t *Task) GetInfo() (*Info, error) {
return info, nil return info, nil
} }
func (t *Task) GetInfoWithDeferred() (*Info, error) {
info := &Info{}
if res := DmTaskGetInfoWithDeferred(t.unmanaged, info); res != 1 {
return nil, ErrTaskGetInfo
}
return info, nil
}
func (t *Task) GetDriverVersion() (string, error) { func (t *Task) GetDriverVersion() (string, error) {
res := DmTaskGetDriverVersion(t.unmanaged) res := DmTaskGetDriverVersion(t.unmanaged)
if res == "" { if res == "" {
@ -531,6 +540,17 @@ func GetInfo(name string) (*Info, error) {
return task.GetInfo() return task.GetInfo()
} }
func GetInfoWithDeferred(name string) (*Info, error) {
task, err := TaskCreateNamed(DeviceInfo, name)
if task == nil {
return nil, err
}
if err := task.Run(); err != nil {
return nil, err
}
return task.GetInfoWithDeferred()
}
func GetDriverVersion() (string, error) { func GetDriverVersion() (string, error) {
task := TaskCreate(DeviceVersion) task := TaskCreate(DeviceVersion)
if task == nil { if task == nil {

View file

@ -90,29 +90,30 @@ const (
) )
var ( var (
DmGetLibraryVersion = dmGetLibraryVersionFct DmGetLibraryVersion = dmGetLibraryVersionFct
DmGetNextTarget = dmGetNextTargetFct DmGetNextTarget = dmGetNextTargetFct
DmLogInitVerbose = dmLogInitVerboseFct DmLogInitVerbose = dmLogInitVerboseFct
DmSetDevDir = dmSetDevDirFct DmSetDevDir = dmSetDevDirFct
DmTaskAddTarget = dmTaskAddTargetFct DmTaskAddTarget = dmTaskAddTargetFct
DmTaskCreate = dmTaskCreateFct DmTaskCreate = dmTaskCreateFct
DmTaskDestroy = dmTaskDestroyFct DmTaskDestroy = dmTaskDestroyFct
DmTaskGetDeps = dmTaskGetDepsFct DmTaskGetDeps = dmTaskGetDepsFct
DmTaskGetInfo = dmTaskGetInfoFct DmTaskGetInfo = dmTaskGetInfoFct
DmTaskGetDriverVersion = dmTaskGetDriverVersionFct DmTaskGetDriverVersion = dmTaskGetDriverVersionFct
DmTaskRun = dmTaskRunFct DmTaskRun = dmTaskRunFct
DmTaskSetAddNode = dmTaskSetAddNodeFct DmTaskSetAddNode = dmTaskSetAddNodeFct
DmTaskSetCookie = dmTaskSetCookieFct DmTaskSetCookie = dmTaskSetCookieFct
DmTaskSetMessage = dmTaskSetMessageFct DmTaskSetMessage = dmTaskSetMessageFct
DmTaskSetName = dmTaskSetNameFct DmTaskSetName = dmTaskSetNameFct
DmTaskSetRo = dmTaskSetRoFct DmTaskSetRo = dmTaskSetRoFct
DmTaskSetSector = dmTaskSetSectorFct DmTaskSetSector = dmTaskSetSectorFct
DmUdevWait = dmUdevWaitFct DmUdevWait = dmUdevWaitFct
DmUdevSetSyncSupport = dmUdevSetSyncSupportFct DmUdevSetSyncSupport = dmUdevSetSyncSupportFct
DmUdevGetSyncSupport = dmUdevGetSyncSupportFct DmUdevGetSyncSupport = dmUdevGetSyncSupportFct
DmCookieSupported = dmCookieSupportedFct DmCookieSupported = dmCookieSupportedFct
LogWithErrnoInit = logWithErrnoInitFct LogWithErrnoInit = logWithErrnoInitFct
DmTaskDeferredRemove = dmTaskDeferredRemoveFct DmTaskDeferredRemove = dmTaskDeferredRemoveFct
DmTaskGetInfoWithDeferred = dmTaskGetInfoWithDeferredFct
) )
func free(p *C.char) { func free(p *C.char) {

View file

@ -13,3 +13,21 @@ const LibraryDeferredRemovalSupport = true
func dmTaskDeferredRemoveFct(task *CDmTask) int { func dmTaskDeferredRemoveFct(task *CDmTask) int {
return int(C.dm_task_deferred_remove((*C.struct_dm_task)(task))) 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))
}

View file

@ -8,3 +8,7 @@ func dmTaskDeferredRemoveFct(task *CDmTask) int {
// Error. Nobody should be calling it. // Error. Nobody should be calling it.
return -1 return -1
} }
func dmTaskGetInfoWithDeferredFct(task *CDmTask, info *Info) int {
return -1
}