Browse code

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>

Vivek Goyal authored on 2015/04/22 07:14:59
Showing 4 changed files
... ...
@@ -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
+}
... ...
@@ -8,3 +8,7 @@ func dmTaskDeferredRemoveFct(task *CDmTask) int {
8 8
 	// Error. Nobody should be calling it.
9 9
 	return -1
10 10
 }
11
+
12
+func dmTaskGetInfoWithDeferredFct(task *CDmTask, info *Info) int {
13
+	return -1
14
+}