From: Joe Harvell <joe.harvell(a)tekcomms.com>
Modify the virStorageBackendLogicalMakeVol parsing to use only
the 'stripes' output as the value for 'nextents' rather than assuming
there is at least 1 extent and then adjusting "only if" the 'segtype'
was 'striped'. This avoids the chance that 'mirror' segtypes cause
issues with the parsed output.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/storage/storage_backend_logical.c | 47 ++++++++++++++++-------------------
1 file changed, 22 insertions(+), 25 deletions(-)
diff --git a/src/storage/storage_backend_logical.c
b/src/storage/storage_backend_logical.c
index bf67faf..3010f58 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -64,8 +64,6 @@ virStorageBackendLogicalSetActive(virStoragePoolObjPtr pool,
}
-#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_STRIPED "striped"
-
struct virStorageBackendLogicalPoolVolData {
virStoragePoolObjPtr pool;
virStorageVolDefPtr vol;
@@ -181,7 +179,7 @@ virStorageBackendLogicalMakeVol(char **const groups,
bool is_new_vol = false;
unsigned long long size, length;
int nextents, ret = -1;
- const char *attrs = groups[9];
+ const char *attrs = groups[8];
/* Skip inactive volume */
if (attrs[4] != 'a')
@@ -259,13 +257,11 @@ virStorageBackendLogicalMakeVol(char **const groups,
VIR_STORAGE_VOL_OPEN_DEFAULT, 0) < 0)
goto cleanup;
- nextents = 1;
- if (STREQ(groups[4], VIR_STORAGE_VOL_LOGICAL_SEGTYPE_STRIPED)) {
- if (virStrToLong_i(groups[5], NULL, 10, &nextents) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("malformed volume extent stripes value"));
- goto cleanup;
- }
+ nextents = 0;
+ if (virStrToLong_i(groups[4], NULL, 10, &nextents) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed volume extent stripes value"));
+ goto cleanup;
}
/* Finally fill in extents information */
@@ -273,24 +269,25 @@ virStorageBackendLogicalMakeVol(char **const groups,
vol->source.nextent + nextents) < 0)
goto cleanup;
- if (virStrToLong_ull(groups[6], NULL, 10, &length) < 0) {
+ if (virStrToLong_ull(groups[5], NULL, 10, &length) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("malformed volume extent length
value"));
goto cleanup;
}
- if (virStrToLong_ull(groups[7], NULL, 10, &size) < 0) {
+ if (virStrToLong_ull(groups[6], NULL, 10, &size) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("malformed volume extent size
value"));
goto cleanup;
}
- if (virStrToLong_ull(groups[8], NULL, 10, &vol->target.allocation) < 0) {
+ if (virStrToLong_ull(groups[7], NULL, 10, &vol->target.allocation) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("malformed volume allocation
value"));
goto cleanup;
}
- /* Now parse the "devices" field separately */
- if (virStorageBackendLogicalParseVolDevice(vol, groups, nextents,
+ /* If we have extents, then parse the "devices" field separately */
+ if (nextents &&
+ virStorageBackendLogicalParseVolDevice(vol, groups, nextents,
size, length) < 0)
goto cleanup;
@@ -312,14 +309,14 @@ virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
{
/*
* # lvs --separator # --noheadings --units b --unbuffered --nosuffix --options \
- *
"lv_name,origin,uuid,devices,segtype,stripes,seg_size,vg_extent_size,size,lv_attr"
VGNAME
+ *
"lv_name,origin,uuid,devices,stripes,seg_size,vg_extent_size,size,lv_attr"
VGNAME
*
- *
RootLV##06UgP5-2rhb-w3Bo-3mdR-WeoL-pytO-SAa2ky#/dev/hda2(0)#linear#1#5234491392#33554432#5234491392#-wi-ao
- *
SwapLV##oHviCK-8Ik0-paqS-V20c-nkhY-Bm1e-zgzU0M#/dev/hda2(156)#linear#1#1040187392#33554432#1040187392#-wi-ao
- *
Test2##3pg3he-mQsA-5Sui-h0i6-HNmc-Cz7W-QSndcR#/dev/hda2(219)#linear#1#1073741824#33554432#1073741824#owi-a-
- *
Test3##UB5hFw-kmlm-LSoX-EI1t-ioVd-h7GL-M0W8Ht#/dev/hda2(251)#linear#1#2181038080#33554432#2181038080#-wi-a-
- *
Test3#Test2#UB5hFw-kmlm-LSoX-EI1t-ioVd-h7GL-M0W8Ht#/dev/hda2(187)#linear#1#1040187392#33554432#1040187392#swi-a-
- *
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#/dev/sdc1(10240),/dev/sdd1(0)#striped#2#42949672960#4194304#-wi-a-
+ *
RootLV##06UgP5-2rhb-w3Bo-3mdR-WeoL-pytO-SAa2ky#/dev/hda2(0)#1#5234491392#33554432#5234491392#-wi-ao
+ *
SwapLV##oHviCK-8Ik0-paqS-V20c-nkhY-Bm1e-zgzU0M#/dev/hda2(156)#1#1040187392#33554432#1040187392#-wi-ao
+ *
Test2##3pg3he-mQsA-5Sui-h0i6-HNmc-Cz7W-QSndcR#/dev/hda2(219)#1#1073741824#33554432#1073741824#owi-a-
+ *
Test3##UB5hFw-kmlm-LSoX-EI1t-ioVd-h7GL-M0W8Ht#/dev/hda2(251)#1#2181038080#33554432#2181038080#-wi-a-
+ *
Test3#Test2#UB5hFw-kmlm-LSoX-EI1t-ioVd-h7GL-M0W8Ht#/dev/hda2(187)#1#1040187392#33554432#1040187392#swi-a-
+ *
test_stripes##fSLSZH-zAS2-yAIb-n4mV-Al9u-HA3V-oo9K1B#/dev/sdc1(10240),/dev/sdd1(0)#2#42949672960#4194304#-wi-a-
*
* Pull out name, origin, & uuid, device, device extent start #,
* segment size, extent size, size, attrs
@@ -336,10 +333,10 @@ virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
* striped, so "," is not a suitable separator either (rhbz 727474).
*/
const char *regexes[] = {
-
"^\\s*(\\S+)#(\\S*)#(\\S+)#(\\S+)#(\\S+)#([0-9]+)#(\\S+)#([0-9]+)#([0-9]+)#(\\S+)#?\\s*$"
+
"^\\s*(\\S+)#(\\S*)#(\\S+)#(\\S+)#([0-9]+)#(\\S+)#([0-9]+)#([0-9]+)#(\\S+)#?\\s*$"
};
int vars[] = {
- 10
+ 9
};
int ret = -1;
virCommandPtr cmd;
@@ -355,7 +352,7 @@ virStorageBackendLogicalFindLVs(virStoragePoolObjPtr pool,
"--unbuffered",
"--nosuffix",
"--options",
-
"lv_name,origin,uuid,devices,segtype,stripes,seg_size,vg_extent_size,size,lv_attr",
+
"lv_name,origin,uuid,devices,stripes,seg_size,vg_extent_size,size,lv_attr",
pool->def->source.name,
NULL);
if (virCommandRunRegex(cmd,
--
2.5.0