summaryrefslogtreecommitdiff
path: root/0010-lvm-Add-a-function-to-activate-LVs-in-shared-mode.patch
blob: b2e4add98472829a269bfddcb2437a3d2014a7af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
From 6bdbafc79e5bcdf2087148c6caa88a6c50c1e94a Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 24 Apr 2023 11:57:18 +0200
Subject: [PATCH] lvm: Add a function to activate LVs in shared mode

Needed by the new blivet feature to support shared LVM setups.
---
 src/lib/plugin_apis/lvm.api         | 16 +++++++++
 src/plugins/lvm-dbus.c              | 51 ++++++++++++++++++++-------
 src/plugins/lvm.c                   | 53 ++++++++++++++++++++++-------
 src/plugins/lvm.h                   |  1 +
 src/python/gi/overrides/BlockDev.py |  5 ++-
 tests/lvm_dbus_tests.py             | 18 +++++++---
 tests/lvm_test.py                   | 18 +++++++---
 7 files changed, 124 insertions(+), 38 deletions(-)

diff --git a/src/lib/plugin_apis/lvm.api b/src/lib/plugin_apis/lvm.api
index b8cde70b..640eee49 100644
--- a/src/lib/plugin_apis/lvm.api
+++ b/src/lib/plugin_apis/lvm.api
@@ -1057,6 +1057,22 @@ gboolean bd_lvm_lvresize (const gchar *vg_name, const gchar *lv_name, guint64 si
  */
 gboolean bd_lvm_lvactivate (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, const BDExtraArg **extra, GError **error);
 
+/**
+ * bd_lvm_lvactivate_shared:
+ * @vg_name: name of the VG containing the to-be-activated LV
+ * @lv_name: name of the to-be-activated LV
+ * @ignore_skip: whether to ignore the skip flag or not
+ * @shared: whether to activate the LV in shared mode
+ * @extra: (allow-none) (array zero-terminated=1): extra options for the LV activation
+ *                                                 (just passed to LVM as is)
+ * @error: (out): place to store error (if any)
+ *
+ * Returns: whether the @vg_name/@lv_name LV was successfully activated or not
+ *
+ * Tech category: %BD_LVM_TECH_BASIC-%BD_LVM_TECH_MODE_MODIFY
+ */
+gboolean bd_lvm_lvactivate_shared (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, gboolean shared, const BDExtraArg **extra, GError **error);
+
 /**
  * bd_lvm_lvdeactivate:
  * @vg_name: name of the VG containing the to-be-deactivated LV
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
index 28f3bb25..46e09833 100644
--- a/src/plugins/lvm-dbus.c
+++ b/src/plugins/lvm-dbus.c
@@ -2163,6 +2163,27 @@ gboolean bd_lvm_lvresize (const gchar *vg_name, const gchar *lv_name, guint64 si
     return (*error == NULL);
 }
 
+static gboolean _lvm_lvactivate (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, gboolean shared, const BDExtraArg **extra, GError **error) {
+    GVariant *params = NULL;
+    GVariantBuilder builder;
+    GVariant *extra_params = NULL;
+
+    if (shared)
+        params = g_variant_new ("(t)", (guint64) 1 << 6);
+    else
+        params = g_variant_new ("(t)", (guint64) 0);
+
+    if (ignore_skip) {
+        g_variant_builder_init (&builder, G_VARIANT_TYPE_DICTIONARY);
+        g_variant_builder_add (&builder, "{sv}", "-K", g_variant_new ("s", ""));
+        extra_params = g_variant_builder_end (&builder);
+        g_variant_builder_clear (&builder);
+    }
+    call_lv_method_sync (vg_name, lv_name, "Activate", params, extra_params, extra, TRUE, error);
+
+    return (*error == NULL);
+}
+
 /**
  * bd_lvm_lvactivate:
  * @vg_name: name of the VG containing the to-be-activated LV
@@ -2177,19 +2198,25 @@ gboolean bd_lvm_lvresize (const gchar *vg_name, const gchar *lv_name, guint64 si
  * Tech category: %BD_LVM_TECH_BASIC-%BD_LVM_TECH_MODE_MODIFY
  */
 gboolean bd_lvm_lvactivate (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, const BDExtraArg **extra, GError **error) {
-    GVariant *params = g_variant_new ("(t)", (guint64) 0);
-    GVariantBuilder builder;
-    GVariant *extra_params = NULL;
-
-    if (ignore_skip) {
-        g_variant_builder_init (&builder, G_VARIANT_TYPE_DICTIONARY);
-        g_variant_builder_add (&builder, "{sv}", "-K", g_variant_new ("s", ""));
-        extra_params = g_variant_builder_end (&builder);
-        g_variant_builder_clear (&builder);
-    }
-    call_lv_method_sync (vg_name, lv_name, "Activate", params, extra_params, extra, TRUE, error);
+    return _lvm_lvactivate (vg_name, lv_name, ignore_skip, FALSE, extra, error);
+}
 
-    return (*error == NULL);
+/**
+ * bd_lvm_lvactivate_shared:
+ * @vg_name: name of the VG containing the to-be-activated LV
+ * @lv_name: name of the to-be-activated LV
+ * @ignore_skip: whether to ignore the skip flag or not
+ * @shared: whether to activate the LV in shared mode
+ * @extra: (allow-none) (array zero-terminated=1): extra options for the LV activation
+ *                                                 (just passed to LVM as is)
+ * @error: (out): place to store error (if any)
+ *
+ * Returns: whether the @vg_name/@lv_name LV was successfully activated or not
+ *
+ * Tech category: %BD_LVM_TECH_BASIC-%BD_LVM_TECH_MODE_MODIFY
+ */
+gboolean bd_lvm_lvactivate_shared (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, gboolean shared, const BDExtraArg **extra, GError **error) {
+    return _lvm_lvactivate (vg_name, lv_name, ignore_skip, shared, extra, error);
 }
 
 /**
diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c
index f1e2941b..0db3bf4a 100644
--- a/src/plugins/lvm.c
+++ b/src/plugins/lvm.c
@@ -1644,6 +1644,28 @@ gboolean bd_lvm_lvresize (const gchar *vg_name, const gchar *lv_name, guint64 si
     return success;
 }
 
+static gboolean _lvm_lvactivate (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, gboolean shared, const BDExtraArg **extra, GError **error) {
+    const gchar *args[5] = {"lvchange", NULL, NULL, NULL, NULL};
+    guint8 next_arg = 2;
+    gboolean success = FALSE;
+
+    if (shared)
+        args[1] = "-asy";
+    else
+        args[1] = "-ay";
+
+    if (ignore_skip) {
+        args[next_arg] = "-K";
+        next_arg++;
+    }
+    args[next_arg] = g_strdup_printf ("%s/%s", vg_name, lv_name);
+
+    success = call_lvm_and_report_error (args, extra, TRUE, error);
+    g_free ((gchar *) args[next_arg]);
+
+    return success;
+}
+
 /**
  * bd_lvm_lvactivate:
  * @vg_name: name of the VG containing the to-be-activated LV
@@ -1658,20 +1680,25 @@ gboolean bd_lvm_lvresize (const gchar *vg_name, const gchar *lv_name, guint64 si
  * Tech category: %BD_LVM_TECH_BASIC-%BD_LVM_TECH_MODE_MODIFY
  */
 gboolean bd_lvm_lvactivate (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, const BDExtraArg **extra, GError **error) {
-    const gchar *args[5] = {"lvchange", "-ay", NULL, NULL, NULL};
-    guint8 next_arg = 2;
-    gboolean success = FALSE;
-
-    if (ignore_skip) {
-        args[next_arg] = "-K";
-        next_arg++;
-    }
-    args[next_arg] = g_strdup_printf ("%s/%s", vg_name, lv_name);
-
-    success = call_lvm_and_report_error (args, extra, TRUE, error);
-    g_free ((gchar *) args[next_arg]);
+    return _lvm_lvactivate (vg_name, lv_name, ignore_skip, FALSE, extra, error);
+}
 
-    return success;
+/**
+ * bd_lvm_lvactivate_shared:
+ * @vg_name: name of the VG containing the to-be-activated LV
+ * @lv_name: name of the to-be-activated LV
+ * @ignore_skip: whether to ignore the skip flag or not
+ * @shared: whether to activate the LV in shared mode
+ * @extra: (allow-none) (array zero-terminated=1): extra options for the LV activation
+ *                                                 (just passed to LVM as is)
+ * @error: (out): place to store error (if any)
+ *
+ * Returns: whether the @vg_name/@lv_name LV was successfully activated or not
+ *
+ * Tech category: %BD_LVM_TECH_BASIC-%BD_LVM_TECH_MODE_MODIFY
+ */
+gboolean bd_lvm_lvactivate_shared (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, gboolean shared, const BDExtraArg **extra, GError **error) {
+    return _lvm_lvactivate (vg_name, lv_name, ignore_skip, shared, extra, error);
 }
 
 /**
diff --git a/src/plugins/lvm.h b/src/plugins/lvm.h
index fabf091f..c85c043d 100644
--- a/src/plugins/lvm.h
+++ b/src/plugins/lvm.h
@@ -277,6 +277,7 @@ gboolean bd_lvm_lvremove (const gchar *vg_name, const gchar *lv_name, gboolean f
 gboolean bd_lvm_lvrename (const gchar *vg_name, const gchar *lv_name, const gchar *new_name, const BDExtraArg **extra, GError **error);
 gboolean bd_lvm_lvresize (const gchar *vg_name, const gchar *lv_name, guint64 size, const BDExtraArg **extra, GError **error);
 gboolean bd_lvm_lvactivate (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, const BDExtraArg **extra, GError **error);
+gboolean bd_lvm_lvactivate_shared (const gchar *vg_name, const gchar *lv_name, gboolean ignore_skip, gboolean shared, const BDExtraArg **extra, GError **error);
 gboolean bd_lvm_lvdeactivate (const gchar *vg_name, const gchar *lv_name, const BDExtraArg **extra, GError **error);
 gboolean bd_lvm_lvsnapshotcreate (const gchar *vg_name, const gchar *origin_name, const gchar *snapshot_name, guint64 size, const BDExtraArg **extra, GError **error);
 gboolean bd_lvm_lvsnapshotmerge (const gchar *vg_name, const gchar *snapshot_name, const BDExtraArg **extra, GError **error);
diff --git a/src/python/gi/overrides/BlockDev.py b/src/python/gi/overrides/BlockDev.py
index 795e0de4..3e074260 100644
--- a/src/python/gi/overrides/BlockDev.py
+++ b/src/python/gi/overrides/BlockDev.py
@@ -605,11 +605,10 @@ def lvm_lvresize(vg_name, lv_name, size, extra=None, **kwargs):
     return _lvm_lvresize(vg_name, lv_name, size, extra)
 __all__.append("lvm_lvresize")
 
-_lvm_lvactivate = BlockDev.lvm_lvactivate
 @override(BlockDev.lvm_lvactivate)
-def lvm_lvactivate(vg_name, lv_name, ignore_skip=False, extra=None, **kwargs):
+def lvm_lvactivate(vg_name, lv_name, ignore_skip=False, shared=False, extra=None, **kwargs):
     extra = _get_extra(extra, kwargs)
-    return _lvm_lvactivate(vg_name, lv_name, ignore_skip, extra)
+    return BlockDev.lvm_lvactivate_shared(vg_name, lv_name, ignore_skip, shared, extra)
 __all__.append("lvm_lvactivate")
 
 _lvm_lvdeactivate = BlockDev.lvm_lvdeactivate
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index fc12b55d..a821636e 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -873,15 +873,15 @@ class LvmTestLVactivateDeactivate(LvmPVVGLVTestCase):
         self.assertTrue(succ)
 
         with self.assertRaises(GLib.GError):
-            BlockDev.lvm_lvactivate("nonexistingVG", "testLV", True, None)
+            BlockDev.lvm_lvactivate("nonexistingVG", "testLV", True)
 
         with self.assertRaises(GLib.GError):
-            BlockDev.lvm_lvactivate("testVG", "nonexistingLV", True, None)
+            BlockDev.lvm_lvactivate("testVG", "nonexistingLV", True)
 
         with self.assertRaises(GLib.GError):
-            BlockDev.lvm_lvactivate("nonexistingVG", "nonexistingLV", True, None)
+            BlockDev.lvm_lvactivate("nonexistingVG", "nonexistingLV", True)
 
-        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True, None)
+        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True)
         self.assertTrue(succ)
 
         with self.assertRaises(GLib.GError):
@@ -896,7 +896,15 @@ class LvmTestLVactivateDeactivate(LvmPVVGLVTestCase):
         succ = BlockDev.lvm_lvdeactivate("testVG", "testLV", None)
         self.assertTrue(succ)
 
-        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True, None)
+        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True)
+        self.assertTrue(succ)
+
+        succ = BlockDev.lvm_lvdeactivate("testVG", "testLV", None)
+        self.assertTrue(succ)
+
+        # try activating in shared mode, unfortunately no way to check whether it really
+        # works or not
+        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True, True)
         self.assertTrue(succ)
 
         succ = BlockDev.lvm_lvdeactivate("testVG", "testLV", None)
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index 7ede4b59..63f43afb 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -807,15 +807,15 @@ class LvmTestLVactivateDeactivate(LvmPVVGLVTestCase):
         self.assertTrue(succ)
 
         with self.assertRaises(GLib.GError):
-            BlockDev.lvm_lvactivate("nonexistingVG", "testLV", True, None)
+            BlockDev.lvm_lvactivate("nonexistingVG", "testLV", True)
 
         with self.assertRaises(GLib.GError):
-            BlockDev.lvm_lvactivate("testVG", "nonexistingLV", True, None)
+            BlockDev.lvm_lvactivate("testVG", "nonexistingLV", True)
 
         with self.assertRaises(GLib.GError):
-            BlockDev.lvm_lvactivate("nonexistingVG", "nonexistingLV", True, None)
+            BlockDev.lvm_lvactivate("nonexistingVG", "nonexistingLV", True)
 
-        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True, None)
+        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True)
         self.assertTrue(succ)
 
         with self.assertRaises(GLib.GError):
@@ -830,7 +830,15 @@ class LvmTestLVactivateDeactivate(LvmPVVGLVTestCase):
         succ = BlockDev.lvm_lvdeactivate("testVG", "testLV", None)
         self.assertTrue(succ)
 
-        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True, None)
+        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True)
+        self.assertTrue(succ)
+
+        succ = BlockDev.lvm_lvdeactivate("testVG", "testLV", None)
+        self.assertTrue(succ)
+
+        # try activating in shared mode, unfortunately no way to check whether it really
+        # works or not
+        succ = BlockDev.lvm_lvactivate("testVG", "testLV", True, True)
         self.assertTrue(succ)
 
         succ = BlockDev.lvm_lvdeactivate("testVG", "testLV", None)
-- 
2.41.0