From 9bf6b5fe54625adb498fef2024798fea3add780b Mon Sep 17 00:00:00 2001 From: Hongxu Jia Date: Wed, 8 Dec 2021 10:01:20 +0800 Subject: libblockdev: Do not include duplicate entries in bd_lvm_lvs output We use "-o segtypes" for the "lvs" command which means multisegment LVs will be twice in the output. [1] ... $ lvs --noheadings --nosuffix --nameprefixes --unquoted --units=b -a -o vg_name,lv_name,lv_uuid,lv_size,lv_attr,segtype,origin,pool_lv,data_lv,metadata_lv,role,move_pv,data_percent,metadata_percent,copy_percent,lv_tags OUTPUT: |LVM2_VG_NAME=rootvg LVM2_LV_NAME=RCSMW-ARM_CXP2020233_2_R20A154 LVM2_LV_UUID=TgjM5V-jhXX-tPTf-gPMa-c3w6-QEjo-7qkmVg LVM2_LV_SIZE=71303168 LVM2_LV_ATTR=wi-ao--- LVM2_SEGTYPE=linear LVM2_ORIGIN= LVM2_POOL_LV= LVM2_DATA_LV= LVM2_METADATA_LV= LVM2_LV_ROLE=public LVM2_MOVE_PV= LVM2_DATA_PERCENT= LVM2_METADATA_PERCENT= LVM2_COPY_PERCENT= LVM2_LV_TAGS= |LVM2_VG_NAME=rootvg LVM2_LV_NAME=RCSMW-ARM_CXP2020233_2_R20A154 LVM2_LV_UUID=TgjM5V-jhXX-tPTf-gPMa-c3w6-QEjo-7qkmVg LVM2_LV_SIZE=71303168 LVM2_LV_ATTR=wi-ao--- LVM2_SEGTYPE=linear LVM2_ORIGIN= LVM2_POOL_LV= LVM2_DATA_LV= LVM2_METADATA_LV= LVM2_LV_ROLE=public LVM2_MOVE_PV= LVM2_DATA_PERCENT= LVM2_METADATA_PERCENT= LVM2_COPY_PERCENT= LVM2_LV_TAGS= ... See [2] [1] https://github.com/storaged-project/libblockdev/pull/671 [2] https://github.com/storaged-project/libblockdev/issues/667 Signed-off-by: Hongxu Jia Signed-off-by: Khem Raj --- ...include-duplicate-entries-in-bd_lvm_lvs-o.patch | 100 +++++++++++++++++++++ .../libblockdev/libblockdev_2.26.bb | 4 +- 2 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 meta-oe/recipes-extended/libblockdev/files/0001-lvm-Do-not-include-duplicate-entries-in-bd_lvm_lvs-o.patch diff --git a/meta-oe/recipes-extended/libblockdev/files/0001-lvm-Do-not-include-duplicate-entries-in-bd_lvm_lvs-o.patch b/meta-oe/recipes-extended/libblockdev/files/0001-lvm-Do-not-include-duplicate-entries-in-bd_lvm_lvs-o.patch new file mode 100644 index 0000000000..e608358bf7 --- /dev/null +++ b/meta-oe/recipes-extended/libblockdev/files/0001-lvm-Do-not-include-duplicate-entries-in-bd_lvm_lvs-o.patch @@ -0,0 +1,100 @@ +From d10fb2c0ee60c97f4dfeab4506a347c26cb389df Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +Date: Tue, 7 Dec 2021 15:50:45 +0800 +Subject: [PATCH] lvm: Do not include duplicate entries in bd_lvm_lvs output + +We use "-o segtypes" for the "lvs" command which means multisegment +LVs will be twice in the output. + +Signed-off-by: Vojtech Trefny + +Upstream-Status: Backport [https://github.com/storaged-project/libblockdev/pull/671] +Signed-off-by: Hongxu Jia +--- + src/plugins/lvm.c | 17 +++++++++++++++-- + tests/lvm_test.py | 41 +++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 56 insertions(+), 2 deletions(-) + +diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c +index 2be1dbd..acd5b84 100644 +--- a/src/plugins/lvm.c ++++ b/src/plugins/lvm.c +@@ -1810,8 +1810,21 @@ BDLVMLVdata** bd_lvm_lvs (const gchar *vg_name, GError **error) { + if (table && (num_items == 15)) { + /* valid line, try to parse and record it */ + lvdata = get_lv_data_from_table (table, TRUE); +- if (lvdata) +- g_ptr_array_add (lvs, lvdata); ++ if (lvdata) { ++ /* ignore duplicate entries in lvs output, these are caused by multi segments LVs */ ++ for (gsize i = 0; i < lvs->len; i++) { ++ if (g_strcmp0 (((BDLVMLVdata *) g_ptr_array_index (lvs, i))->lv_name, lvdata->lv_name) == 0) { ++ g_debug("Duplicate LV entry for '%s' found in lvs output", ++ lvdata->lv_name); ++ bd_lvm_lvdata_free (lvdata); ++ lvdata = NULL; ++ break; ++ } ++ } ++ ++ if (lvdata) ++ g_ptr_array_add (lvs, lvdata); ++ } + } else + if (table) + g_hash_table_destroy (table); +diff --git a/tests/lvm_test.py b/tests/lvm_test.py +index eb94c91..ab0de21 100644 +--- a/tests/lvm_test.py ++++ b/tests/lvm_test.py +@@ -915,6 +915,47 @@ class LvmTestLVs(LvmPVVGLVTestCase): + lvs = BlockDev.lvm_lvs("testVG") + self.assertEqual(len(lvs), 1) + ++class LvmTestLVsMultiSegment(LvmPVVGLVTestCase): ++ def _clean_up(self): ++ try: ++ BlockDev.lvm_lvremove("testVG", "testLV2", True, None) ++ except: ++ pass ++ ++ LvmPVVGLVTestCase._clean_up(self) ++ ++ def test_lvs(self): ++ """Verify that it's possible to gather info about LVs""" ++ ++ succ = BlockDev.lvm_pvcreate(self.loop_dev, 0, 0, None) ++ self.assertTrue(succ) ++ ++ succ = BlockDev.lvm_vgcreate("testVG", [self.loop_dev], 0, None) ++ self.assertTrue(succ) ++ ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 10 * 1024**2) ++ self.assertTrue(succ) ++ ++ lvs = BlockDev.lvm_lvs("testVG") ++ self.assertEqual(len(lvs), 1) ++ self.assertListEqual([lv.lv_name for lv in lvs], ["testLV"]) ++ ++ # add second LV ++ succ = BlockDev.lvm_lvcreate("testVG", "testLV2", 10 * 1024**2) ++ self.assertTrue(succ) ++ ++ lvs = BlockDev.lvm_lvs("testVG") ++ self.assertEqual(len(lvs), 2) ++ self.assertListEqual([lv.lv_name for lv in lvs], ["testLV", "testLV2"]) ++ ++ # by resizing the first LV we will create two segments ++ succ = BlockDev.lvm_lvresize("testVG", "testLV", 20 * 1024**2, None) ++ self.assertTrue(succ) ++ ++ lvs = BlockDev.lvm_lvs("testVG") ++ self.assertEqual(len(lvs), 2) ++ self.assertListEqual([lv.lv_name for lv in lvs], ["testLV", "testLV2"]) ++ + class LvmPVVGthpoolTestCase(LvmPVVGTestCase): + def _clean_up(self): + try: +-- +2.27.0 + diff --git a/meta-oe/recipes-extended/libblockdev/libblockdev_2.26.bb b/meta-oe/recipes-extended/libblockdev/libblockdev_2.26.bb index c884b11339..b9c3bbb407 100644 --- a/meta-oe/recipes-extended/libblockdev/libblockdev_2.26.bb +++ b/meta-oe/recipes-extended/libblockdev/libblockdev_2.26.bb @@ -10,7 +10,9 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=c07cb499d259452f324bb90c3067d85c" inherit autotools gobject-introspection pkgconfig -SRC_URI = "git://github.com/storaged-project/libblockdev;branch=2.x-branch;protocol=https" +SRC_URI = "git://github.com/storaged-project/libblockdev;branch=2.x-branch;protocol=https \ + file://0001-lvm-Do-not-include-duplicate-entries-in-bd_lvm_lvs-o.patch \ +" SRCREV = "47ff12242c89e36a33259d18b7068b26c3bb1c64" S = "${WORKDIR}/git" -- cgit 1.2.3-korg