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>
| ... | ... |
@@ -87,16 +87,17 @@ type ( |
| 87 | 87 |
Device []uint64 |
| 88 | 88 |
} |
| 89 | 89 |
Info struct {
|
| 90 |
- Exists int |
|
| 91 |
- Suspended int |
|
| 92 |
- LiveTable int |
|
| 93 |
- InactiveTable int |
|
| 94 |
- OpenCount int32 |
|
| 95 |
- EventNr uint32 |
|
| 96 |
- Major uint32 |
|
| 97 |
- Minor uint32 |
|
| 98 |
- ReadOnly int |
|
| 99 |
- TargetCount int32 |
|
| 90 |
+ Exists int |
|
| 91 |
+ Suspended int |
|
| 92 |
+ LiveTable int |
|
| 93 |
+ InactiveTable int |
|
| 94 |
+ OpenCount int32 |
|
| 95 |
+ EventNr uint32 |
|
| 96 |
+ Major uint32 |
|
| 97 |
+ Minor uint32 |
|
| 98 |
+ ReadOnly int |
|
| 99 |
+ TargetCount int32 |
|
| 100 |
+ DeferredRemove int |
|
| 100 | 101 |
} |
| 101 | 102 |
TaskType int |
| 102 | 103 |
AddNodeType int |
| ... | ... |
@@ -222,6 +223,14 @@ func (t *Task) GetInfo() (*Info, error) {
|
| 222 | 222 |
return info, nil |
| 223 | 223 |
} |
| 224 | 224 |
|
| 225 |
+func (t *Task) GetInfoWithDeferred() (*Info, error) {
|
|
| 226 |
+ info := &Info{}
|
|
| 227 |
+ if res := DmTaskGetInfoWithDeferred(t.unmanaged, info); res != 1 {
|
|
| 228 |
+ return nil, ErrTaskGetInfo |
|
| 229 |
+ } |
|
| 230 |
+ return info, nil |
|
| 231 |
+} |
|
| 232 |
+ |
|
| 225 | 233 |
func (t *Task) GetDriverVersion() (string, error) {
|
| 226 | 234 |
res := DmTaskGetDriverVersion(t.unmanaged) |
| 227 | 235 |
if res == "" {
|
| ... | ... |
@@ -531,6 +540,17 @@ func GetInfo(name string) (*Info, error) {
|
| 531 | 531 |
return task.GetInfo() |
| 532 | 532 |
} |
| 533 | 533 |
|
| 534 |
+func GetInfoWithDeferred(name string) (*Info, error) {
|
|
| 535 |
+ task, err := TaskCreateNamed(DeviceInfo, name) |
|
| 536 |
+ if task == nil {
|
|
| 537 |
+ return nil, err |
|
| 538 |
+ } |
|
| 539 |
+ if err := task.Run(); err != nil {
|
|
| 540 |
+ return nil, err |
|
| 541 |
+ } |
|
| 542 |
+ return task.GetInfoWithDeferred() |
|
| 543 |
+} |
|
| 544 |
+ |
|
| 534 | 545 |
func GetDriverVersion() (string, error) {
|
| 535 | 546 |
task := TaskCreate(DeviceVersion) |
| 536 | 547 |
if task == nil {
|
| ... | ... |
@@ -90,29 +90,30 @@ const ( |
| 90 | 90 |
) |
| 91 | 91 |
|
| 92 | 92 |
var ( |
| 93 |
- DmGetLibraryVersion = dmGetLibraryVersionFct |
|
| 94 |
- DmGetNextTarget = dmGetNextTargetFct |
|
| 95 |
- DmLogInitVerbose = dmLogInitVerboseFct |
|
| 96 |
- DmSetDevDir = dmSetDevDirFct |
|
| 97 |
- DmTaskAddTarget = dmTaskAddTargetFct |
|
| 98 |
- DmTaskCreate = dmTaskCreateFct |
|
| 99 |
- DmTaskDestroy = dmTaskDestroyFct |
|
| 100 |
- DmTaskGetDeps = dmTaskGetDepsFct |
|
| 101 |
- DmTaskGetInfo = dmTaskGetInfoFct |
|
| 102 |
- DmTaskGetDriverVersion = dmTaskGetDriverVersionFct |
|
| 103 |
- DmTaskRun = dmTaskRunFct |
|
| 104 |
- DmTaskSetAddNode = dmTaskSetAddNodeFct |
|
| 105 |
- DmTaskSetCookie = dmTaskSetCookieFct |
|
| 106 |
- DmTaskSetMessage = dmTaskSetMessageFct |
|
| 107 |
- DmTaskSetName = dmTaskSetNameFct |
|
| 108 |
- DmTaskSetRo = dmTaskSetRoFct |
|
| 109 |
- DmTaskSetSector = dmTaskSetSectorFct |
|
| 110 |
- DmUdevWait = dmUdevWaitFct |
|
| 111 |
- DmUdevSetSyncSupport = dmUdevSetSyncSupportFct |
|
| 112 |
- DmUdevGetSyncSupport = dmUdevGetSyncSupportFct |
|
| 113 |
- DmCookieSupported = dmCookieSupportedFct |
|
| 114 |
- LogWithErrnoInit = logWithErrnoInitFct |
|
| 115 |
- DmTaskDeferredRemove = dmTaskDeferredRemoveFct |
|
| 93 |
+ DmGetLibraryVersion = dmGetLibraryVersionFct |
|
| 94 |
+ DmGetNextTarget = dmGetNextTargetFct |
|
| 95 |
+ DmLogInitVerbose = dmLogInitVerboseFct |
|
| 96 |
+ DmSetDevDir = dmSetDevDirFct |
|
| 97 |
+ DmTaskAddTarget = dmTaskAddTargetFct |
|
| 98 |
+ DmTaskCreate = dmTaskCreateFct |
|
| 99 |
+ DmTaskDestroy = dmTaskDestroyFct |
|
| 100 |
+ DmTaskGetDeps = dmTaskGetDepsFct |
|
| 101 |
+ DmTaskGetInfo = dmTaskGetInfoFct |
|
| 102 |
+ DmTaskGetDriverVersion = dmTaskGetDriverVersionFct |
|
| 103 |
+ DmTaskRun = dmTaskRunFct |
|
| 104 |
+ DmTaskSetAddNode = dmTaskSetAddNodeFct |
|
| 105 |
+ DmTaskSetCookie = dmTaskSetCookieFct |
|
| 106 |
+ DmTaskSetMessage = dmTaskSetMessageFct |
|
| 107 |
+ DmTaskSetName = dmTaskSetNameFct |
|
| 108 |
+ DmTaskSetRo = dmTaskSetRoFct |
|
| 109 |
+ DmTaskSetSector = dmTaskSetSectorFct |
|
| 110 |
+ DmUdevWait = dmUdevWaitFct |
|
| 111 |
+ DmUdevSetSyncSupport = dmUdevSetSyncSupportFct |
|
| 112 |
+ DmUdevGetSyncSupport = dmUdevGetSyncSupportFct |
|
| 113 |
+ DmCookieSupported = dmCookieSupportedFct |
|
| 114 |
+ LogWithErrnoInit = logWithErrnoInitFct |
|
| 115 |
+ DmTaskDeferredRemove = dmTaskDeferredRemoveFct |
|
| 116 |
+ DmTaskGetInfoWithDeferred = dmTaskGetInfoWithDeferredFct |
|
| 116 | 117 |
) |
| 117 | 118 |
|
| 118 | 119 |
func free(p *C.char) {
|
| ... | ... |
@@ -13,3 +13,21 @@ const LibraryDeferredRemovalSupport = true |
| 13 | 13 |
func dmTaskDeferredRemoveFct(task *CDmTask) int {
|
| 14 | 14 |
return int(C.dm_task_deferred_remove((*C.struct_dm_task)(task))) |
| 15 | 15 |
} |
| 16 |
+ |
|
| 17 |
+func dmTaskGetInfoWithDeferredFct(task *CDmTask, info *Info) int {
|
|
| 18 |
+ Cinfo := C.struct_dm_info{}
|
|
| 19 |
+ defer func() {
|
|
| 20 |
+ info.Exists = int(Cinfo.exists) |
|
| 21 |
+ info.Suspended = int(Cinfo.suspended) |
|
| 22 |
+ info.LiveTable = int(Cinfo.live_table) |
|
| 23 |
+ info.InactiveTable = int(Cinfo.inactive_table) |
|
| 24 |
+ info.OpenCount = int32(Cinfo.open_count) |
|
| 25 |
+ info.EventNr = uint32(Cinfo.event_nr) |
|
| 26 |
+ info.Major = uint32(Cinfo.major) |
|
| 27 |
+ info.Minor = uint32(Cinfo.minor) |
|
| 28 |
+ info.ReadOnly = int(Cinfo.read_only) |
|
| 29 |
+ info.TargetCount = int32(Cinfo.target_count) |
|
| 30 |
+ info.DeferredRemove = int(Cinfo.deferred_remove) |
|
| 31 |
+ }() |
|
| 32 |
+ return int(C.dm_task_get_info((*C.struct_dm_task)(task), &Cinfo)) |
|
| 33 |
+} |