import libblockdev-2.28-4.el9

This commit is contained in:
CentOS Sources 2023-05-09 05:17:35 +00:00 committed by Stepan Oksanichenko
parent fc5e826b4c
commit 5ff90eea81
21 changed files with 7290 additions and 2042 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/libblockdev-2.25.tar.gz
SOURCES/libblockdev-2.28.tar.gz

View File

@ -1 +1 @@
c16d236f95a7a88b1d0f5309fdc8823999d297d1 SOURCES/libblockdev-2.25.tar.gz
d32fce132c75d94ad9c033a636906d63027ffba5 SOURCES/libblockdev-2.28.tar.gz

View File

@ -1,27 +0,0 @@
From 2da13152619ee7233650339797657b45088b2219 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 18 Aug 2020 09:44:29 +0200
Subject: [PATCH] dm: Fix comparing DM RAID member devices UUID
There is no "UUID" property in UDev we must use the "ID_FS_UUID"
one.
This comparison works only because most DM RAID members don't have
UUID so the check is skipped, but it fails for DDF RAID members
which have a special GUID/UUID in UDev database.
---
src/plugins/dm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/dm.c b/src/plugins/dm.c
index a6412028..4ab0d2a4 100644
--- a/src/plugins/dm.c
+++ b/src/plugins/dm.c
@@ -482,7 +482,7 @@ static gboolean raid_dev_matches_spec (struct raid_dev *raid_dev, const gchar *n
context = udev_new ();
device = udev_device_new_from_subsystem_sysname (context, "block", dev_name);
- dev_uuid = udev_device_get_property_value (device, "UUID");
+ dev_uuid = udev_device_get_property_value (device, "ID_FS_UUID");
major_str = udev_device_get_property_value (device, "MAJOR");
minor_str = udev_device_get_property_value (device, "MINOR");

View File

@ -1,7 +1,7 @@
From e364883416785d51ff8eb132b63bd802ab0ccfe9 Mon Sep 17 00:00:00 2001
From 94d707dd225104ba14422eeb43c73b1f742b12da Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 13 Jul 2021 13:22:05 +0200
Subject: [PATCH 1/8] lvm: Allow configuring global "device filter" for LVM
Subject: [PATCH 1/7] lvm: Allow configuring global "device filter" for LVM
commands
Starting with 2.03.12 LVM introduces a new system for telling LVM
@ -14,17 +14,17 @@ for our users, this commit introduces a new function to configure
this globally, which we already do for the --config option.
---
src/lib/plugin_apis/lvm.api | 23 +++
src/plugins/lvm-dbus.c | 74 ++++++++-
src/plugins/lvm-dbus.c | 75 ++++++++-
src/plugins/lvm.c | 97 ++++++++++--
src/plugins/lvm.h | 4 +
tests/library_test.py | 304 ++++++++++++++++++++----------------
tests/lvm_dbus_tests.py | 47 +++++-
tests/lvm_test.py | 50 ++++++
tests/overrides_test.py | 23 ++-
8 files changed, 469 insertions(+), 153 deletions(-)
8 files changed, 470 insertions(+), 153 deletions(-)
diff --git a/src/lib/plugin_apis/lvm.api b/src/lib/plugin_apis/lvm.api
index 563c104..62f602f 100644
index c695c111..23f68b81 100644
--- a/src/lib/plugin_apis/lvm.api
+++ b/src/lib/plugin_apis/lvm.api
@@ -601,6 +601,7 @@ typedef enum {
@ -65,7 +65,7 @@ index 563c104..62f602f 100644
* bd_lvm_cache_get_default_md_size:
* @cache_size: size of the cache to determine MD size for
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
index 144551f..d1726ed 100644
index 51572c9a..b47ed0ef 100644
--- a/src/plugins/lvm-dbus.c
+++ b/src/plugins/lvm-dbus.c
@@ -35,6 +35,8 @@
@ -77,7 +77,13 @@ index 144551f..d1726ed 100644
#define LVM_BUS_NAME "com.redhat.lvmdbus1"
#define LVM_OBJ_PREFIX "/com/redhat/lvmdbus1"
#define MANAGER_OBJ "/com/redhat/lvmdbus1/Manager"
@@ -247,6 +249,14 @@ static volatile guint avail_features = 0;
@@ -241,11 +243,20 @@ static gboolean setup_dbus_connection (GError **error) {
return TRUE;
}
+static volatile guint avail_deps = 0;
static volatile guint avail_dbus_deps = 0;
static volatile guint avail_features = 0;
static volatile guint avail_module_deps = 0;
static GMutex deps_check_lock;
@ -92,16 +98,16 @@ index 144551f..d1726ed 100644
#define DBUS_DEPS_LVMDBUSD 0
#define DBUS_DEPS_LVMDBUSD_MASK (1 << DBUS_DEPS_LVMDBUSD)
#define DBUS_DEPS_LAST 1
@@ -385,6 +395,8 @@ gboolean bd_lvm_is_tech_avail (BDLVMTech tech, guint64 mode, GError **error) {
return check_dbus_deps (&avail_dbus_deps, DBUS_DEPS_LVMDBUSD_MASK, dbus_deps, DBUS_DEPS_LAST, &deps_check_lock, error) &&
check_features (&avail_features, FEATURES_VDO_MASK, features, FEATURES_LAST, &deps_check_lock, error) &&
check_module_deps (&avail_module_deps, MODULE_DEPS_VDO_MASK, module_deps, MODULE_DEPS_LAST, &deps_check_lock, error);
@@ -378,6 +389,8 @@ gboolean bd_lvm_is_tech_avail (BDLVMTech tech, guint64 mode, GError **error) {
return check_dbus_deps (&avail_dbus_deps, DBUS_DEPS_LVMDBUSD_MASK, dbus_deps, DBUS_DEPS_LAST, &deps_check_lock, error) &&
check_features (&avail_features, FEATURES_VDO_MASK, features, FEATURES_LAST, &deps_check_lock, error) &&
check_module_deps (&avail_module_deps, MODULE_DEPS_VDO_MASK, module_deps, MODULE_DEPS_LAST, &deps_check_lock, error);
+ case BD_LVM_TECH_DEVICES:
+ return check_deps (&avail_deps, DEPS_LVMDEVICES_MASK, deps, DEPS_LAST, &deps_check_lock, error);
default:
/* everything is supported by this implementation of the plugin */
return check_dbus_deps (&avail_dbus_deps, DBUS_DEPS_LVMDBUSD_MASK, dbus_deps, DBUS_DEPS_LAST, &deps_check_lock, error);
@@ -522,6 +534,7 @@ static gboolean unbox_params_and_add (GVariant *params, GVariantBuilder *builder
@@ -515,6 +528,7 @@ static gboolean unbox_params_and_add (GVariant *params, GVariantBuilder *builder
static GVariant* call_lvm_method (const gchar *obj, const gchar *intf, const gchar *method, GVariant *params, GVariant *extra_params, const BDExtraArg **extra_args, guint64 *task_id, guint64 *progress_id, gboolean lock_config, GError **error) {
GVariant *config = NULL;
@ -109,7 +115,7 @@ index 144551f..d1726ed 100644
GVariant *param = NULL;
GVariantIter iter;
GVariantBuilder builder;
@@ -543,8 +556,8 @@ static GVariant* call_lvm_method (const gchar *obj, const gchar *intf, const gch
@@ -536,8 +550,8 @@ static GVariant* call_lvm_method (const gchar *obj, const gchar *intf, const gch
if (lock_config)
g_mutex_lock (&global_config_lock);
@ -120,7 +126,7 @@ index 144551f..d1726ed 100644
/* add the global config to the extra_params */
g_variant_builder_init (&extra_builder, G_VARIANT_TYPE_DICTIONARY);
@@ -565,6 +578,11 @@ static GVariant* call_lvm_method (const gchar *obj, const gchar *intf, const gch
@@ -558,6 +572,11 @@ static GVariant* call_lvm_method (const gchar *obj, const gchar *intf, const gch
g_variant_builder_add (&extra_builder, "{sv}", "--config", config);
added_extra = TRUE;
}
@ -132,7 +138,7 @@ index 144551f..d1726ed 100644
if (added_extra)
config_extra_params = g_variant_builder_end (&extra_builder);
@@ -2651,6 +2669,58 @@ gchar* bd_lvm_get_global_config (GError **error UNUSED) {
@@ -2654,6 +2673,58 @@ gchar* bd_lvm_get_global_config (GError **error UNUSED) {
return ret;
}
@ -192,7 +198,7 @@ index 144551f..d1726ed 100644
* bd_lvm_cache_get_default_md_size:
* @cache_size: size of the cache to determine MD size for
diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c
index 2be1dbd..c0d8198 100644
index 26af0d19..42ee0f90 100644
--- a/src/plugins/lvm.c
+++ b/src/plugins/lvm.c
@@ -34,6 +34,8 @@
@ -309,7 +315,7 @@ index 2be1dbd..c0d8198 100644
g_free (argv);
return success;
@@ -2018,6 +2041,58 @@ gchar* bd_lvm_get_global_config (GError **error UNUSED) {
@@ -2033,6 +2056,58 @@ gchar* bd_lvm_get_global_config (GError **error UNUSED) {
return ret;
}
@ -369,7 +375,7 @@ index 2be1dbd..c0d8198 100644
* bd_lvm_cache_get_default_md_size:
* @cache_size: size of the cache to determine MD size for
diff --git a/src/plugins/lvm.h b/src/plugins/lvm.h
index 2162d76..8063693 100644
index 2162d769..8063693f 100644
--- a/src/plugins/lvm.h
+++ b/src/plugins/lvm.h
@@ -216,6 +216,7 @@ typedef enum {
@ -391,7 +397,7 @@ index 2162d76..8063693 100644
const gchar* bd_lvm_cache_get_mode_str (BDLVMCacheMode mode, GError **error);
BDLVMCacheMode bd_lvm_cache_get_mode_from_str (const gchar *mode_str, GError **error);
diff --git a/tests/library_test.py b/tests/library_test.py
index 08e44fd..efd17bd 100644
index 08e44fdc..efd17bd2 100644
--- a/tests/library_test.py
+++ b/tests/library_test.py
@@ -13,18 +13,178 @@ class LibraryOpsTestCase(unittest.TestCase):
@ -739,10 +745,10 @@ index 08e44fd..efd17bd 100644
def test_dep_checks_disabled(self):
"""Verify that disabling runtime dep checks works"""
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index 4882da8..35ace37 100644
index 3fb7946a..ae26c6d2 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -33,6 +33,11 @@ class LVMTestCase(unittest.TestCase):
@@ -50,6 +50,11 @@ class LVMTestCase(unittest.TestCase):
else:
BlockDev.reinit([cls.ps, cls.ps2], True, None)
@ -754,7 +760,7 @@ index 4882da8..35ace37 100644
@classmethod
def _get_lvm_version(cls):
_ret, out, _err = run_command("lvm version")
@@ -44,8 +49,7 @@ class LVMTestCase(unittest.TestCase):
@@ -61,8 +66,7 @@ class LVMTestCase(unittest.TestCase):
@unittest.skipUnless(lvm_dbus_running, "LVM DBus not running")
class LvmNoDevTestCase(LVMTestCase):
@ -764,7 +770,7 @@ index 4882da8..35ace37 100644
self._log = ""
@tag_test(TestTags.NOSTORAGE)
@@ -227,6 +231,45 @@ class LvmNoDevTestCase(LVMTestCase):
@@ -250,6 +254,45 @@ class LvmNoDevTestCase(LVMTestCase):
succ = BlockDev.lvm_set_global_config(None)
self.assertTrue(succ)
@ -811,10 +817,10 @@ index 4882da8..35ace37 100644
def test_cache_get_default_md_size(self):
"""Verify that default cache metadata size is calculated properly"""
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index eb94c91..b37a879 100644
index 7be8f1ab..11d8c94e 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -22,10 +22,17 @@ class LVMTestCase(unittest.TestCase):
@@ -39,10 +39,17 @@ class LVMTestCase(unittest.TestCase):
ps.so_name = "libbd_lvm.so.2"
cls.requested_plugins = [ps]
@ -832,7 +838,7 @@ index eb94c91..b37a879 100644
@classmethod
def _get_lvm_version(cls):
@@ -39,6 +46,8 @@ class LVMTestCase(unittest.TestCase):
@@ -56,6 +63,8 @@ class LVMTestCase(unittest.TestCase):
class LvmNoDevTestCase(LVMTestCase):
def __init__(self, *args, **kwargs):
super(LvmNoDevTestCase, self).__init__(*args, **kwargs)
@ -841,7 +847,7 @@ index eb94c91..b37a879 100644
self._log = ""
@tag_test(TestTags.NOSTORAGE)
@@ -213,6 +222,44 @@ class LvmNoDevTestCase(LVMTestCase):
@@ -236,6 +245,44 @@ class LvmNoDevTestCase(LVMTestCase):
succ = BlockDev.lvm_set_global_config(None)
self.assertTrue(succ)
@ -886,7 +892,7 @@ index eb94c91..b37a879 100644
@tag_test(TestTags.NOSTORAGE)
def test_cache_get_default_md_size(self):
"""Verify that default cache metadata size is calculated properly"""
@@ -1335,6 +1382,9 @@ class LvmPVVGcachedThpoolstatsTestCase(LvmPVVGLVTestCase):
@@ -1406,6 +1453,9 @@ class LvmPVVGcachedThpoolstatsTestCase(LvmPVVGLVTestCase):
class LVMUnloadTest(LVMTestCase):
def setUp(self):
@ -897,7 +903,7 @@ index eb94c91..b37a879 100644
# tests
self.addCleanup(BlockDev.reinit, self.requested_plugins, True, None)
diff --git a/tests/overrides_test.py b/tests/overrides_test.py
index 8e7f5a5..d3faf3c 100644
index 8e7f5a5a..d3faf3cf 100644
--- a/tests/overrides_test.py
+++ b/tests/overrides_test.py
@@ -15,10 +15,12 @@ class OverridesTest(unittest.TestCase):
@ -957,13 +963,13 @@ index 8e7f5a5..d3faf3c 100644
# load the plugins back
self.assertTrue(BlockDev.reinit(self.requested_plugins, True, None))
--
2.31.1
2.37.3
From bebd74962db6fb7b5314be411a4d02b21554d80f Mon Sep 17 00:00:00 2001
From 707de091b8848b95cc78faa4299119844aab4172 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 13 Jul 2021 13:27:32 +0200
Subject: [PATCH 2/8] lvm: Add functions for managing LVM devices file
Subject: [PATCH 2/7] lvm: Add functions for managing LVM devices file
Currently covers only --adddev and --deldev from the lvmdevices
command.
@ -978,7 +984,7 @@ command.
7 files changed, 220 insertions(+), 2 deletions(-)
diff --git a/src/lib/plugin_apis/lvm.api b/src/lib/plugin_apis/lvm.api
index 62f602f..bce2920 100644
index 23f68b81..b869afcc 100644
--- a/src/lib/plugin_apis/lvm.api
+++ b/src/lib/plugin_apis/lvm.api
@@ -1685,4 +1685,30 @@ GHashTable* bd_lvm_vdo_get_stats_full (const gchar *vg_name, const gchar *pool_n
@ -1013,10 +1019,10 @@ index 62f602f..bce2920 100644
+
#endif /* BD_LVM_API */
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
index d1726ed..44d2794 100644
index b47ed0ef..86ca28ca 100644
--- a/src/plugins/lvm-dbus.c
+++ b/src/plugins/lvm-dbus.c
@@ -3938,3 +3938,55 @@ BDLVMVDOStats* bd_lvm_vdo_get_stats (const gchar *vg_name, const gchar *pool_nam
@@ -3950,3 +3950,55 @@ BDLVMVDOStats* bd_lvm_vdo_get_stats (const gchar *vg_name, const gchar *pool_nam
return stats;
}
@ -1073,10 +1079,10 @@ index d1726ed..44d2794 100644
+ return bd_utils_exec_and_report_error (args, extra, error);
+}
diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c
index c0d8198..94c6a22 100644
index 42ee0f90..3bd8fae1 100644
--- a/src/plugins/lvm.c
+++ b/src/plugins/lvm.c
@@ -3235,3 +3235,55 @@ BDLVMVDOStats* bd_lvm_vdo_get_stats (const gchar *vg_name, const gchar *pool_nam
@@ -3250,3 +3250,55 @@ BDLVMVDOStats* bd_lvm_vdo_get_stats (const gchar *vg_name, const gchar *pool_nam
return stats;
}
@ -1133,7 +1139,7 @@ index c0d8198..94c6a22 100644
+ return bd_utils_exec_and_report_error (args, extra, error);
+}
diff --git a/src/plugins/lvm.h b/src/plugins/lvm.h
index 8063693..5ca2a9d 100644
index 8063693f..5ca2a9d7 100644
--- a/src/plugins/lvm.h
+++ b/src/plugins/lvm.h
@@ -333,4 +333,7 @@ BDLVMVDOWritePolicy bd_lvm_get_vdo_write_policy_from_str (const gchar *policy_st
@ -1145,7 +1151,7 @@ index 8063693..5ca2a9d 100644
+
#endif /* BD_LVM */
diff --git a/src/python/gi/overrides/BlockDev.py b/src/python/gi/overrides/BlockDev.py
index f768c8b..715a262 100644
index ea059060..8574ab04 100644
--- a/src/python/gi/overrides/BlockDev.py
+++ b/src/python/gi/overrides/BlockDev.py
@@ -724,6 +724,21 @@ def lvm_vdo_pool_convert(vg_name, lv_name, pool_name, virtual_size, index_memory
@ -1171,10 +1177,10 @@ index f768c8b..715a262 100644
@override(BlockDev.md_get_superblock_size)
def md_get_superblock_size(size, version=None):
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index 35ace37..fb1a9ed 100644
index ae26c6d2..82e4761d 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -10,7 +10,7 @@ import subprocess
@@ -12,7 +12,7 @@ from contextlib import contextmanager
from distutils.version import LooseVersion
from itertools import chain
@ -1183,10 +1189,10 @@ index 35ace37..fb1a9ed 100644
from gi.repository import BlockDev, GLib
import dbus
@@ -1696,3 +1696,38 @@ class LVMVDOTest(LVMTestCase):
full_stats = BlockDev.lvm_vdo_get_stats_full("testVDOVG", "vdoPool")
self.assertIn("writeAmplificationRatio", full_stats.keys())
@@ -1785,3 +1785,38 @@ class LvmConfigTestPvremove(LvmPVonlyTestCase):
BlockDev.lvm_set_global_config("")
succ = BlockDev.lvm_pvremove(self.loop_dev)
self.assertTrue(succ)
+
+
+class LvmTestDevicesFile(LvmPVonlyTestCase):
@ -1223,11 +1229,11 @@ index 35ace37..fb1a9ed 100644
+ dfile = read_file("/etc/lvm/devices/" + self.devicefile)
+ self.assertNotIn(self.loop_dev, dfile)
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index b37a879..786434f 100644
index 11d8c94e..6ddeaa6a 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -9,7 +9,7 @@ import shutil
import subprocess
@@ -11,7 +11,7 @@ import time
from contextlib import contextmanager
from distutils.version import LooseVersion
-from utils import create_sparse_tempfile, create_lio_device, delete_lio_device, fake_utils, fake_path, TestTags, tag_test, run_command
@ -1235,10 +1241,10 @@ index b37a879..786434f 100644
from gi.repository import BlockDev, GLib
@@ -1682,3 +1682,38 @@ class LVMVDOTest(LVMTestCase):
full_stats = BlockDev.lvm_vdo_get_stats_full("testVDOVG", "vdoPool")
self.assertIn("writeAmplificationRatio", full_stats.keys())
@@ -1765,3 +1765,38 @@ class LvmConfigTestPvremove(LvmPVonlyTestCase):
BlockDev.lvm_set_global_config("")
succ = BlockDev.lvm_pvremove(self.loop_dev)
self.assertTrue(succ)
+
+
+class LvmTestDevicesFile(LvmPVonlyTestCase):
@ -1275,13 +1281,13 @@ index b37a879..786434f 100644
+ dfile = read_file("/etc/lvm/devices/" + self.devicefile)
+ self.assertNotIn(self.loop_dev, dfile)
--
2.31.1
2.37.3
From 8d8cbe7169cb94b01e7064a0d00b7d86baf5e652 Mon Sep 17 00:00:00 2001
From 4c832576df8918c269db8fe2cb7eb74e45628d6c Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 15 Oct 2021 13:18:54 +0200
Subject: [PATCH 3/8] lvm: Report special error when system.devices file is not
Subject: [PATCH 3/7] lvm: Report special error when system.devices file is not
enabled
This can be disabled either in LVM by a compile time option or
@ -1298,7 +1304,7 @@ and not being supported at all.
6 files changed, 162 insertions(+)
diff --git a/src/lib/plugin_apis/lvm.api b/src/lib/plugin_apis/lvm.api
index bce2920..b96bcfd 100644
index b869afcc..b8cde70b 100644
--- a/src/lib/plugin_apis/lvm.api
+++ b/src/lib/plugin_apis/lvm.api
@@ -44,6 +44,7 @@ typedef enum {
@ -1310,10 +1316,10 @@ index bce2920..b96bcfd 100644
typedef enum {
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
index 44d2794..22204d5 100644
index 86ca28ca..7f48e422 100644
--- a/src/plugins/lvm-dbus.c
+++ b/src/plugins/lvm-dbus.c
@@ -3939,6 +3939,64 @@ BDLVMVDOStats* bd_lvm_vdo_get_stats (const gchar *vg_name, const gchar *pool_nam
@@ -3951,6 +3951,64 @@ BDLVMVDOStats* bd_lvm_vdo_get_stats (const gchar *vg_name, const gchar *pool_nam
return stats;
}
@ -1378,7 +1384,7 @@ index 44d2794..22204d5 100644
/**
* bd_lvm_devices_add:
* @device: device (PV) to add to the devices file
@@ -3957,6 +4015,12 @@ gboolean bd_lvm_devices_add (const gchar *device, const gchar *devices_file, con
@@ -3969,6 +4027,12 @@ gboolean bd_lvm_devices_add (const gchar *device, const gchar *devices_file, con
if (!bd_lvm_is_tech_avail (BD_LVM_TECH_DEVICES, 0, error))
return FALSE;
@ -1391,7 +1397,7 @@ index 44d2794..22204d5 100644
if (devices_file) {
devfile = g_strdup_printf ("--devicesfile=%s", devices_file);
args[3] = devfile;
@@ -3983,6 +4047,12 @@ gboolean bd_lvm_devices_delete (const gchar *device, const gchar *devices_file,
@@ -3995,6 +4059,12 @@ gboolean bd_lvm_devices_delete (const gchar *device, const gchar *devices_file,
if (!bd_lvm_is_tech_avail (BD_LVM_TECH_DEVICES, 0, error))
return FALSE;
@ -1405,10 +1411,10 @@ index 44d2794..22204d5 100644
devfile = g_strdup_printf ("--devicesfile=%s", devices_file);
args[3] = devfile;
diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c
index 94c6a22..605fcb0 100644
index 3bd8fae1..73d5005f 100644
--- a/src/plugins/lvm.c
+++ b/src/plugins/lvm.c
@@ -3236,6 +3236,54 @@ BDLVMVDOStats* bd_lvm_vdo_get_stats (const gchar *vg_name, const gchar *pool_nam
@@ -3251,6 +3251,54 @@ BDLVMVDOStats* bd_lvm_vdo_get_stats (const gchar *vg_name, const gchar *pool_nam
return stats;
}
@ -1463,7 +1469,7 @@ index 94c6a22..605fcb0 100644
/**
* bd_lvm_devices_add:
* @device: device (PV) to add to the devices file
@@ -3254,6 +3302,12 @@ gboolean bd_lvm_devices_add (const gchar *device, const gchar *devices_file, con
@@ -3269,6 +3317,12 @@ gboolean bd_lvm_devices_add (const gchar *device, const gchar *devices_file, con
if (!bd_lvm_is_tech_avail (BD_LVM_TECH_DEVICES, 0, error))
return FALSE;
@ -1476,7 +1482,7 @@ index 94c6a22..605fcb0 100644
if (devices_file) {
devfile = g_strdup_printf ("--devicesfile=%s", devices_file);
args[3] = devfile;
@@ -3280,6 +3334,12 @@ gboolean bd_lvm_devices_delete (const gchar *device, const gchar *devices_file,
@@ -3295,6 +3349,12 @@ gboolean bd_lvm_devices_delete (const gchar *device, const gchar *devices_file,
if (!bd_lvm_is_tech_avail (BD_LVM_TECH_DEVICES, 0, error))
return FALSE;
@ -1490,7 +1496,7 @@ index 94c6a22..605fcb0 100644
devfile = g_strdup_printf ("--devicesfile=%s", devices_file);
args[3] = devfile;
diff --git a/src/plugins/lvm.h b/src/plugins/lvm.h
index 5ca2a9d..fabf091 100644
index 5ca2a9d7..fabf091f 100644
--- a/src/plugins/lvm.h
+++ b/src/plugins/lvm.h
@@ -53,6 +53,7 @@ typedef enum {
@ -1502,10 +1508,10 @@ index 5ca2a9d..fabf091 100644
typedef enum {
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index fb1a9ed..c411c9e 100644
index 82e4761d..792c1cc8 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -1731,3 +1731,18 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1820,3 +1820,18 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
dfile = read_file("/etc/lvm/devices/" + self.devicefile)
self.assertNotIn(self.loop_dev, dfile)
@ -1525,10 +1531,10 @@ index fb1a9ed..c411c9e 100644
+ with self.assertRaisesRegex(GLib.GError, "LVM devices file not enabled."):
+ BlockDev.lvm_devices_add("", self.devicefile)
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index 786434f..315dd07 100644
index 6ddeaa6a..73fb1030 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -1717,3 +1717,18 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1800,3 +1800,18 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
dfile = read_file("/etc/lvm/devices/" + self.devicefile)
self.assertNotIn(self.loop_dev, dfile)
@ -1548,13 +1554,13 @@ index 786434f..315dd07 100644
+ with self.assertRaisesRegex(GLib.GError, "LVM devices file not enabled."):
+ BlockDev.lvm_devices_add("", self.devicefile)
--
2.31.1
2.37.3
From 81df85e7ea6e129e78074b6967f80c505d1b08f0 Mon Sep 17 00:00:00 2001
From 2fdec5f7e42de869d4b2ec80dce597d22dd57617 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 15 Oct 2021 14:21:03 +0200
Subject: [PATCH 4/8] lvm: Force enable LVM devices file for LvmTestDevicesFile
Subject: [PATCH 4/7] lvm: Force enable LVM devices file for LvmTestDevicesFile
This feauture might be disabled in lvm.conf so to be able to test
it we need to override this. The correct handling of the disabled
@ -1565,10 +1571,10 @@ state is checked in a separate test case.
2 files changed, 16 insertions(+)
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index c411c9e..9cfc647 100644
index 792c1cc8..e55535cc 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -1711,6 +1711,12 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1800,6 +1800,12 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
if not self.devices_avail:
self.skipTest("skipping LVM devices file test: not supported")
@ -1581,7 +1587,7 @@ index c411c9e..9cfc647 100644
succ = BlockDev.lvm_pvcreate(self.loop_dev)
self.assertTrue(succ)
@@ -1732,6 +1738,8 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1821,6 +1827,8 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
dfile = read_file("/etc/lvm/devices/" + self.devicefile)
self.assertNotIn(self.loop_dev, dfile)
@ -1591,10 +1597,10 @@ index c411c9e..9cfc647 100644
if not self.devices_avail:
self.skipTest("skipping LVM devices file test: not supported")
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index 315dd07..ea3b7f8 100644
index 73fb1030..907b4f59 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -1697,6 +1697,12 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1780,6 +1780,12 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
if not self.devices_avail:
self.skipTest("skipping LVM devices file test: not supported")
@ -1607,7 +1613,7 @@ index 315dd07..ea3b7f8 100644
succ = BlockDev.lvm_pvcreate(self.loop_dev)
self.assertTrue(succ)
@@ -1718,6 +1724,8 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1801,6 +1807,8 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
dfile = read_file("/etc/lvm/devices/" + self.devicefile)
self.assertNotIn(self.loop_dev, dfile)
@ -1617,13 +1623,13 @@ index 315dd07..ea3b7f8 100644
if not self.devices_avail:
self.skipTest("skipping LVM devices file test: not supported")
--
2.31.1
2.37.3
From 01237b62bb8ad67def7c937185c42152503fbc6f Mon Sep 17 00:00:00 2001
From 1809a41c0b2b99c8d6a077b5aa70834686980181 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 12 Nov 2021 14:51:39 +0100
Subject: [PATCH 5/8] tests: Fix resetting global LVM config after LVM devices
Subject: [PATCH 5/7] tests: Fix resetting global LVM config after LVM devices
file test
We need to set the config to None/NULL not to an empty string.
@ -1633,10 +1639,10 @@ We need to set the config to None/NULL not to an empty string.
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index 9cfc647..d422869 100644
index e55535cc..8ae670d5 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -1711,7 +1711,7 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1800,7 +1800,7 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
if not self.devices_avail:
self.skipTest("skipping LVM devices file test: not supported")
@ -1645,7 +1651,7 @@ index 9cfc647..d422869 100644
# force-enable the feature, it might be disabled by default
succ = BlockDev.lvm_set_global_config("devices { use_devicesfile=1 }")
@@ -1738,13 +1738,13 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1827,13 +1827,13 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
dfile = read_file("/etc/lvm/devices/" + self.devicefile)
self.assertNotIn(self.loop_dev, dfile)
@ -1662,10 +1668,10 @@ index 9cfc647..d422869 100644
# checking if the feature is enabled or disabled is hard so lets just disable
# the devices file using the global config and check lvm_devices_add fails
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index ea3b7f8..882cdf2 100644
index 907b4f59..095e4bac 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -1697,7 +1697,7 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1780,7 +1780,7 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
if not self.devices_avail:
self.skipTest("skipping LVM devices file test: not supported")
@ -1674,7 +1680,7 @@ index ea3b7f8..882cdf2 100644
# force-enable the feature, it might be disabled by default
succ = BlockDev.lvm_set_global_config("devices { use_devicesfile=1 }")
@@ -1724,13 +1724,13 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1807,13 +1807,13 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
dfile = read_file("/etc/lvm/devices/" + self.devicefile)
self.assertNotIn(self.loop_dev, dfile)
@ -1691,61 +1697,27 @@ index ea3b7f8..882cdf2 100644
# checking if the feature is enabled or disabled is hard so lets just disable
# the devices file using the global config and check lvm_devices_add fails
--
2.31.1
2.37.3
From 2f33f2af18efa0b337f8383cb6f137d6211fe7fb Mon Sep 17 00:00:00 2001
From 1c2f1d20a3cfa522b78ab007e8e4f9a5a4bb579d Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 12 Nov 2021 15:10:45 +0100
Subject: [PATCH 6/8] lvm: Do not set global config to and empty string
Subject: [PATCH 6/7] lvm: Do not set global config to and empty string
If we set it to an empty string we end up running "--config"
without a parameter and lvm will use whatever is next parameter
like the device path for pvremove.
---
src/plugins/lvm-dbus.c | 5 ++++-
src/plugins/lvm.c | 5 ++++-
tests/lvm_dbus_tests.py | 12 ++++++++++++
tests/lvm_test.py | 12 ++++++++++++
4 files changed, 32 insertions(+), 2 deletions(-)
2 files changed, 24 insertions(+)
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
index 22204d5..b7bd019 100644
--- a/src/plugins/lvm-dbus.c
+++ b/src/plugins/lvm-dbus.c
@@ -2644,7 +2644,10 @@ gboolean bd_lvm_set_global_config (const gchar *new_config, GError **error UNUSE
g_free (global_config_str);
/* now store the new one */
- global_config_str = g_strdup (new_config);
+ if (!new_config || g_strcmp0 (new_config, "") == 0)
+ global_config_str = NULL;
+ else
+ global_config_str = g_strdup (new_config);
g_mutex_unlock (&global_config_lock);
return TRUE;
diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c
index 605fcb0..124fce7 100644
--- a/src/plugins/lvm.c
+++ b/src/plugins/lvm.c
@@ -2016,7 +2016,10 @@ gboolean bd_lvm_set_global_config (const gchar *new_config, GError **error UNUSE
g_free (global_config_str);
/* now store the new one */
- global_config_str = g_strdup (new_config);
+ if (!new_config || g_strcmp0 (new_config, "") == 0)
+ global_config_str = NULL;
+ else
+ global_config_str = g_strdup (new_config);
g_mutex_unlock (&global_config_lock);
return TRUE;
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index d422869..5516afe 100644
index 8ae670d5..61c898c1 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -1754,3 +1754,15 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1843,3 +1843,15 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
with self.assertRaisesRegex(GLib.GError, "LVM devices file not enabled."):
BlockDev.lvm_devices_add("", self.devicefile)
@ -1762,10 +1734,10 @@ index d422869..5516afe 100644
+ succ = BlockDev.lvm_pvremove(self.loop_dev)
+ self.assertTrue(succ)
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index 882cdf2..e349817 100644
index 095e4bac..36ff10ec 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -1740,3 +1740,15 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
@@ -1823,3 +1823,15 @@ class LvmTestDevicesFile(LvmPVonlyTestCase):
with self.assertRaisesRegex(GLib.GError, "LVM devices file not enabled."):
BlockDev.lvm_devices_add("", self.devicefile)
@ -1782,85 +1754,13 @@ index 882cdf2..e349817 100644
+ succ = BlockDev.lvm_pvremove(self.loop_dev)
+ self.assertTrue(succ)
--
2.31.1
2.37.3
From 2a4e610027a2c2a315054b84a323ce973939ca2d Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 16 Mar 2021 12:05:37 +0100
Subject: [PATCH 7/8] vdo: Do not use g_memdup in bd_vdo_stats_copy
g_memdup is deprecated and the replacement g_memdup2 is not yet
available so lets just do the copy manually.
---
src/lib/plugin_apis/vdo.api | 17 ++++++++++++++++-
src/plugins/vdo.c | 17 ++++++++++++++++-
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/src/lib/plugin_apis/vdo.api b/src/lib/plugin_apis/vdo.api
index 936f8e0..312de4e 100644
--- a/src/lib/plugin_apis/vdo.api
+++ b/src/lib/plugin_apis/vdo.api
@@ -170,7 +170,22 @@ void bd_vdo_stats_free (BDVDOStats *stats) {
* Deprecated: 2.24: Use LVM-VDO integration instead.
*/
BDVDOStats* bd_vdo_stats_copy (BDVDOStats *stats) {
- return g_memdup (stats, sizeof (BDVDOStats));
+ if (stats == NULL)
+ return NULL;
+
+ BDVDOStats *new_stats = g_new0 (BDVDOStats, 1);
+
+ new_stats->block_size = stats->block_size;
+ new_stats->logical_block_size = stats->logical_block_size;
+ new_stats->physical_blocks = stats->physical_blocks;
+ new_stats->data_blocks_used = stats->data_blocks_used;
+ new_stats->overhead_blocks_used = stats->overhead_blocks_used;
+ new_stats->logical_blocks_used = stats->logical_blocks_used;
+ new_stats->used_percent = stats->used_percent;
+ new_stats->saving_percent = stats->saving_percent;
+ new_stats->write_amplification_ratio = stats->write_amplification_ratio;
+
+ return new_stats;
}
GType bd_vdo_stats_get_type () {
diff --git a/src/plugins/vdo.c b/src/plugins/vdo.c
index 2352394..d443099 100644
--- a/src/plugins/vdo.c
+++ b/src/plugins/vdo.c
@@ -81,7 +81,22 @@ void bd_vdo_stats_free (BDVDOStats *stats) {
}
BDVDOStats* bd_vdo_stats_copy (BDVDOStats *stats) {
- return g_memdup (stats, sizeof (BDVDOStats));
+ if (stats == NULL)
+ return NULL;
+
+ BDVDOStats *new_stats = g_new0 (BDVDOStats, 1);
+
+ new_stats->block_size = stats->block_size;
+ new_stats->logical_block_size = stats->logical_block_size;
+ new_stats->physical_blocks = stats->physical_blocks;
+ new_stats->data_blocks_used = stats->data_blocks_used;
+ new_stats->overhead_blocks_used = stats->overhead_blocks_used;
+ new_stats->logical_blocks_used = stats->logical_blocks_used;
+ new_stats->used_percent = stats->used_percent;
+ new_stats->saving_percent = stats->saving_percent;
+ new_stats->write_amplification_ratio = stats->write_amplification_ratio;
+
+ return new_stats;
}
--
2.31.1
From 577ea466e3b7af464137e087907ba980ad3994ee Mon Sep 17 00:00:00 2001
From 05cfb84777c5472550673a1f2150ca357718b3f2 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 26 Nov 2021 15:19:55 +0100
Subject: [PATCH 8/8] lvm: Use "lvmconfig full" to get valid config instead of
Subject: [PATCH 7/7] lvm: Use "lvmconfig full" to get valid config instead of
"current"
"lvmconfig current" doesn't work together with --config even if we
@ -1872,10 +1772,10 @@ be working in all cases.
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
index b7bd019..825c5e9 100644
index 7f48e422..d4b542e2 100644
--- a/src/plugins/lvm-dbus.c
+++ b/src/plugins/lvm-dbus.c
@@ -3955,9 +3955,9 @@ static gboolean _lvm_devices_enabled () {
@@ -3964,9 +3964,9 @@ static gboolean _lvm_devices_enabled () {
gint scanned = 0;
g_autofree gchar *config_arg = NULL;
@ -1888,10 +1788,10 @@ index b7bd019..825c5e9 100644
/* make sure to include the global config from us when getting the current config value */
g_mutex_lock (&global_config_lock);
diff --git a/src/plugins/lvm.c b/src/plugins/lvm.c
index 124fce7..21320f3 100644
index 73d5005f..03211f8a 100644
--- a/src/plugins/lvm.c
+++ b/src/plugins/lvm.c
@@ -3251,9 +3251,9 @@ static gboolean _lvm_devices_enabled () {
@@ -3263,9 +3263,9 @@ static gboolean _lvm_devices_enabled () {
gboolean enabled = FALSE;
gint scanned = 0;
@ -1904,5 +1804,5 @@ index 124fce7..21320f3 100644
if (ret) {
scanned = sscanf (output, "use_devicesfile=%u", &enabled);
--
2.31.1
2.37.3

View File

@ -1,4 +1,4 @@
From 37f1aff5f5f967d6a4440d176f3de877aab789ac Mon Sep 17 00:00:00 2001
From 77e6a109043e87f88d2bd2b47d1cefce0eb9f5a9 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 20 Sep 2021 16:38:16 +0200
Subject: [PATCH 1/3] Add support for creating and activating integrity devices
@ -6,31 +6,29 @@ Subject: [PATCH 1/3] Add support for creating and activating integrity devices
This adds support for create, open and close actions for standalone
integrity devices using cryptsetup.
---
configure.ac | 4 +-
configure.ac | 2 +-
src/lib/plugin_apis/crypto.api | 157 +++++++++++++++++
src/plugins/crypto.c | 261 +++++++++++++++++++++++++++-
src/plugins/crypto.h | 41 +++++
src/python/gi/overrides/BlockDev.py | 24 +++
tests/crypto_test.py | 97 ++++++++++-
6 files changed, 576 insertions(+), 8 deletions(-)
tests/crypto_test.py | 96 +++++++++-
6 files changed, 573 insertions(+), 8 deletions(-)
diff --git a/configure.ac b/configure.ac
index abe1412..13830ae 100644
index 79bd97d8..79bf8045 100644
--- a/configure.ac
+++ b/configure.ac
@@ -210,7 +210,9 @@ AS_IF([test "x$with_crypto" != "xno"],
@@ -210,7 +210,7 @@ AS_IF([test "x$with_crypto" != "xno"],
AS_IF([$PKG_CONFIG --atleast-version=2.0.3 libcryptsetup],
[AC_DEFINE([LIBCRYPTSETUP_2])], [])
AS_IF([$PKG_CONFIG --atleast-version=2.3.0 libcryptsetup],
- [AC_DEFINE([LIBCRYPTSETUP_BITLK])], [])
+ [AC_DEFINE([LIBCRYPTSETUP_23])], [])
+ AS_IF([$PKG_CONFIG --atleast-version=2.4.0 libcryptsetup],
+ [AC_DEFINE([LIBCRYPTSETUP_24])], [])
AS_IF([$PKG_CONFIG --atleast-version=2.4.0 libcryptsetup],
[AC_DEFINE([LIBCRYPTSETUP_24])], [])
AS_IF([test "x$with_escrow" != "xno"],
[LIBBLOCKDEV_PKG_CHECK_MODULES([NSS], [nss >= 3.18.0])
LIBBLOCKDEV_CHECK_HEADER([volume_key/libvolume_key.h], [$GLIB_CFLAGS $NSS_CFLAGS], [libvolume_key.h not available])],
diff --git a/src/lib/plugin_apis/crypto.api b/src/lib/plugin_apis/crypto.api
index ef0217f..40e32c8 100644
index ef0217fe..40e32c89 100644
--- a/src/lib/plugin_apis/crypto.api
+++ b/src/lib/plugin_apis/crypto.api
@@ -1,5 +1,6 @@
@ -211,7 +209,7 @@ index ef0217f..40e32c8 100644
* bd_crypto_device_seems_encrypted:
* @device: the queried device
diff --git a/src/plugins/crypto.c b/src/plugins/crypto.c
index 4fad9a8..b1b0700 100644
index 51908140..8549cf23 100644
--- a/src/plugins/crypto.c
+++ b/src/plugins/crypto.c
@@ -50,6 +50,18 @@
@ -505,7 +503,7 @@ index 4fad9a8..b1b0700 100644
/**
* bd_crypto_device_seems_encrypted:
* @device: the queried device
@@ -2472,7 +2723,7 @@ gboolean bd_crypto_escrow_device (const gchar *device, const gchar *passphrase,
@@ -2471,7 +2722,7 @@ gboolean bd_crypto_escrow_device (const gchar *device, const gchar *passphrase,
*
* Tech category: %BD_CRYPTO_TECH_BITLK-%BD_CRYPTO_TECH_MODE_OPEN_CLOSE
*/
@ -514,7 +512,7 @@ index 4fad9a8..b1b0700 100644
gboolean bd_crypto_bitlk_open (const gchar *device UNUSED, const gchar *name UNUSED, const guint8* pass_data UNUSED, gsize data_len UNUSED, gboolean read_only UNUSED, GError **error) {
/* this will return FALSE and set error, because BITLK technology is not available */
return bd_crypto_is_tech_avail (BD_CRYPTO_TECH_BITLK, BD_CRYPTO_TECH_MODE_OPEN_CLOSE, error);
@@ -2542,7 +2793,7 @@ gboolean bd_crypto_bitlk_open (const gchar *device, const gchar *name, const gui
@@ -2541,7 +2792,7 @@ gboolean bd_crypto_bitlk_open (const gchar *device, const gchar *name, const gui
*
* Tech category: %BD_CRYPTO_TECH_BITLK-%BD_CRYPTO_TECH_MODE_OPEN_CLOSE
*/
@ -524,10 +522,10 @@ index 4fad9a8..b1b0700 100644
/* this will return FALSE and set error, because BITLK technology is not available */
return bd_crypto_is_tech_avail (BD_CRYPTO_TECH_BITLK, BD_CRYPTO_TECH_MODE_OPEN_CLOSE, error);
diff --git a/src/plugins/crypto.h b/src/plugins/crypto.h
index a38724d..166e558 100644
index 1c8f47ea..6c1d40dd 100644
--- a/src/plugins/crypto.h
+++ b/src/plugins/crypto.h
@@ -116,6 +116,43 @@ void bd_crypto_luks_extra_free (BDCryptoLUKSExtra *extra);
@@ -122,6 +122,43 @@ void bd_crypto_luks_extra_free (BDCryptoLUKSExtra *extra);
BDCryptoLUKSExtra* bd_crypto_luks_extra_copy (BDCryptoLUKSExtra *extra);
BDCryptoLUKSExtra* bd_crypto_luks_extra_new (guint64 data_alignment, const gchar *data_device, const gchar *integrity, guint64 sector_size, const gchar *label, const gchar *subsystem, BDCryptoLUKSPBKDF *pbkdf);
@ -571,7 +569,7 @@ index a38724d..166e558 100644
/**
* BDCryptoLUKSInfo:
* @version: LUKS version
@@ -209,6 +246,10 @@ gboolean bd_crypto_luks_header_restore (const gchar *device, const gchar *backup
@@ -215,6 +252,10 @@ gboolean bd_crypto_luks_header_restore (const gchar *device, const gchar *backup
BDCryptoLUKSInfo* bd_crypto_luks_info (const gchar *luks_device, GError **error);
BDCryptoIntegrityInfo* bd_crypto_integrity_info (const gchar *device, GError **error);
@ -583,7 +581,7 @@ index a38724d..166e558 100644
gboolean bd_crypto_tc_open (const gchar *device, const gchar *name, const guint8* pass_data, gsize data_len, gboolean read_only, GError **error);
gboolean bd_crypto_tc_open_full (const gchar *device, const gchar *name, const guint8* pass_data, gsize data_len, const gchar **keyfiles, gboolean hidden, gboolean system, gboolean veracrypt, guint32 veracrypt_pim, gboolean read_only, GError **error);
diff --git a/src/python/gi/overrides/BlockDev.py b/src/python/gi/overrides/BlockDev.py
index 715a262..71bcd31 100644
index 8574ab04..8bd03cf8 100644
--- a/src/python/gi/overrides/BlockDev.py
+++ b/src/python/gi/overrides/BlockDev.py
@@ -276,6 +276,30 @@ def crypto_bitlk_open(device, name, passphrase, read_only=False):
@ -618,7 +616,7 @@ index 715a262..71bcd31 100644
@override(BlockDev.dm_create_linear)
def dm_create_linear(map_name, device, length, uuid=None):
diff --git a/tests/crypto_test.py b/tests/crypto_test.py
index 0aecc03..1c6832e 100644
index 5e02c00d..a8fc8579 100644
--- a/tests/crypto_test.py
+++ b/tests/crypto_test.py
@@ -2,6 +2,7 @@ import unittest
@ -629,7 +627,7 @@ index 0aecc03..1c6832e 100644
import shutil
import subprocess
import six
@@ -42,6 +43,8 @@ class CryptoTestCase(unittest.TestCase):
@@ -34,6 +35,8 @@ class CryptoTestCase(unittest.TestCase):
requested_plugins = BlockDev.plugin_specs_from_names(("crypto", "loop"))
@ -638,7 +636,7 @@ index 0aecc03..1c6832e 100644
@classmethod
def setUpClass(cls):
unittest.TestCase.setUpClass()
@@ -72,7 +75,7 @@ class CryptoTestCase(unittest.TestCase):
@@ -64,7 +67,7 @@ class CryptoTestCase(unittest.TestCase):
def _clean_up(self):
try:
@ -647,17 +645,16 @@ index 0aecc03..1c6832e 100644
except:
pass
@@ -964,7 +967,8 @@ class CryptoTestInfo(CryptoTestCase):
succ = BlockDev.crypto_luks_close("libblockdevTestLUKS")
@@ -1029,7 +1032,7 @@ class CryptoTestLuksSectorSize(CryptoTestCase):
self.assertTrue(succ)
-class CryptoTestIntegrity(CryptoTestCase):
+
+class CryptoTestLUKS2Integrity(CryptoTestCase):
@tag_test(TestTags.SLOW)
@unittest.skipUnless(HAVE_LUKS2, "LUKS 2 not supported")
def test_luks2_integrity(self):
@@ -1151,3 +1155,92 @@ class CryptoTestBitlk(CryptoTestCase):
@@ -1216,3 +1219,92 @@ class CryptoTestBitlk(CryptoTestCase):
succ = BlockDev.crypto_bitlk_close("libblockdevTestBitlk")
self.assertTrue(succ)
self.assertFalse(os.path.exists("/dev/mapper/libblockdevTestBitlk"))
@ -751,10 +748,10 @@ index 0aecc03..1c6832e 100644
+ self.assertTrue(succ)
+ self.assertFalse(os.path.exists("/dev/mapper/%s" % self._dm_name))
--
2.31.1
2.37.3
From 4dcb7a42a2cb33f7a63021d72889c9a9688adfd3 Mon Sep 17 00:00:00 2001
From ad4ac36520ec96af2a7b043189bbdf18cc3cffb9 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 30 Sep 2021 16:01:40 +0200
Subject: [PATCH 2/3] Create smaller test images for integrity tests
@ -767,10 +764,10 @@ can be smaller than 1 GiB.
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/tests/crypto_test.py b/tests/crypto_test.py
index 1c6832e..b7ec251 100644
index a8fc8579..9758bf81 100644
--- a/tests/crypto_test.py
+++ b/tests/crypto_test.py
@@ -44,6 +44,7 @@ class CryptoTestCase(unittest.TestCase):
@@ -36,6 +36,7 @@ class CryptoTestCase(unittest.TestCase):
requested_plugins = BlockDev.plugin_specs_from_names(("crypto", "loop"))
_dm_name = "libblockdevTestLUKS"
@ -778,7 +775,7 @@ index 1c6832e..b7ec251 100644
@classmethod
def setUpClass(cls):
@@ -57,8 +58,8 @@ class CryptoTestCase(unittest.TestCase):
@@ -49,8 +50,8 @@ class CryptoTestCase(unittest.TestCase):
def setUp(self):
self.addCleanup(self._clean_up)
@ -789,7 +786,7 @@ index 1c6832e..b7ec251 100644
try:
self.loop_dev = create_lio_device(self.dev_file)
except RuntimeError as e:
@@ -1160,6 +1161,7 @@ class CryptoTestBitlk(CryptoTestCase):
@@ -1224,6 +1225,7 @@ class CryptoTestBitlk(CryptoTestCase):
class CryptoTestIntegrity(CryptoTestCase):
_dm_name = "libblockdevTestIntegrity"
@ -798,10 +795,10 @@ index 1c6832e..b7ec251 100644
@unittest.skipUnless(HAVE_LUKS2, "Integrity not supported")
def test_integrity(self):
--
2.31.1
2.37.3
From 3b82f9085c0df2e58b673716cdefd747495738e2 Mon Sep 17 00:00:00 2001
From 048a803be5186b30c0f0a7e67020486990ba6b81 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 20 Oct 2021 10:27:41 +0200
Subject: [PATCH 3/3] crypto: Do not use libcryptsetup flags directly in
@ -817,7 +814,7 @@ avoid including libcryptsetup.h in our header and API files.
4 files changed, 59 insertions(+), 22 deletions(-)
diff --git a/src/lib/plugin_apis/crypto.api b/src/lib/plugin_apis/crypto.api
index 40e32c8..cf87979 100644
index 40e32c89..cf87979d 100644
--- a/src/lib/plugin_apis/crypto.api
+++ b/src/lib/plugin_apis/crypto.api
@@ -1,6 +1,5 @@
@ -851,7 +848,7 @@ index 40e32c8..cf87979 100644
#define BD_CRYPTO_TYPE_LUKS_INFO (bd_crypto_luks_info_get_type ())
diff --git a/src/plugins/crypto.c b/src/plugins/crypto.c
index b1b0700..8a4d64a 100644
index 8549cf23..35c38410 100644
--- a/src/plugins/crypto.c
+++ b/src/plugins/crypto.c
@@ -2223,6 +2223,7 @@ gboolean bd_crypto_integrity_open (const gchar *device, const gchar *name, const
@ -910,10 +907,10 @@ index b1b0700..8a4d64a 100644
g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE,
"Failed to activate device: %s", strerror_l (-ret, c_locale));
diff --git a/src/plugins/crypto.h b/src/plugins/crypto.h
index 166e558..b5f133c 100644
index 6c1d40dd..536accf9 100644
--- a/src/plugins/crypto.h
+++ b/src/plugins/crypto.h
@@ -141,16 +141,12 @@ BDCryptoIntegrityExtra* bd_crypto_integrity_extra_copy (BDCryptoIntegrityExtra *
@@ -147,16 +147,12 @@ BDCryptoIntegrityExtra* bd_crypto_integrity_extra_copy (BDCryptoIntegrityExtra *
BDCryptoIntegrityExtra* bd_crypto_integrity_extra_new (guint64 sector_size, guint64 journal_size, guint journal_watermark, guint journal_commit_time, guint64 interleave_sectors, guint64 tag_size, guint64 buffer_sectors);
typedef enum {
@ -937,10 +934,10 @@ index 166e558..b5f133c 100644
/**
diff --git a/tests/crypto_test.py b/tests/crypto_test.py
index b7ec251..673d8b8 100644
index 9758bf81..94b89131 100644
--- a/tests/crypto_test.py
+++ b/tests/crypto_test.py
@@ -1215,6 +1215,20 @@ class CryptoTestIntegrity(CryptoTestCase):
@@ -1279,6 +1279,20 @@ class CryptoTestIntegrity(CryptoTestCase):
self.assertTrue(succ)
self.assertFalse(os.path.exists("/dev/mapper/%s" % self._dm_name))
@ -962,5 +959,5 @@ index b7ec251..673d8b8 100644
@unittest.skipUnless(HAVE_LUKS2, "Integrity not supported")
def test_integrity_wipe(self):
--
2.31.1
2.37.3

View File

@ -1,97 +0,0 @@
From 5d29bc014a33d9bdc1c5fb4b8add2f38850f46a8 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 24 Feb 2021 14:44:03 +0100
Subject: [PATCH] crypto: Fix default key size for non XTS ciphers
512 bits should be default only for AES-XTS which needs two keys,
default for other modes must be 256 bits.
resolves: rhbz#1931847
---
src/plugins/crypto.c | 11 +++++++++--
src/plugins/crypto.h | 2 +-
tests/crypto_test.py | 36 ++++++++++++++++++++++++++++++++++++
3 files changed, 46 insertions(+), 3 deletions(-)
diff --git a/src/plugins/crypto.c b/src/plugins/crypto.c
index f4a2e8f0..1e7043fa 100644
--- a/src/plugins/crypto.c
+++ b/src/plugins/crypto.c
@@ -774,8 +774,15 @@ static gboolean luks_format (const gchar *device, const gchar *cipher, guint64 k
return FALSE;
}
- /* resolve requested/default key_size (should be in bytes) */
- key_size = (key_size != 0) ? (key_size / 8) : (DEFAULT_LUKS_KEYSIZE_BITS / 8);
+ if (key_size == 0) {
+ if (g_str_has_prefix (cipher_specs[1], "xts-"))
+ key_size = DEFAULT_LUKS_KEYSIZE_BITS * 2;
+ else
+ key_size = DEFAULT_LUKS_KEYSIZE_BITS;
+ }
+
+ /* key_size should be in bytes */
+ key_size = key_size / 8;
/* wait for enough random data entropy (if requested) */
if (min_entropy > 0) {
diff --git a/src/plugins/crypto.h b/src/plugins/crypto.h
index 71a1438d..a38724d9 100644
--- a/src/plugins/crypto.h
+++ b/src/plugins/crypto.h
@@ -36,7 +36,7 @@ typedef enum {
/* 20 chars * 6 bits per char (64-item charset) = 120 "bits of security" */
#define BD_CRYPTO_BACKUP_PASSPHRASE_LENGTH 20
-#define DEFAULT_LUKS_KEYSIZE_BITS 512
+#define DEFAULT_LUKS_KEYSIZE_BITS 256
#define DEFAULT_LUKS_CIPHER "aes-xts-plain64"
#define DEFAULT_LUKS2_SECTOR_SIZE 512
diff --git a/tests/crypto_test.py b/tests/crypto_test.py
index 0609a070..0aecc032 100644
--- a/tests/crypto_test.py
+++ b/tests/crypto_test.py
@@ -236,6 +236,42 @@ def test_luks2_format(self):
self.fail("Failed to get pbkdf information from:\n%s %s" % (out, err))
self.assertEqual(int(m.group(1)), 5)
+ def _get_luks1_key_size(self, device):
+ _ret, out, err = run_command("cryptsetup luksDump %s" % device)
+ m = re.search(r"MK bits:\s*(\S+)\s*", out)
+ if not m or len(m.groups()) != 1:
+ self.fail("Failed to get key size information from:\n%s %s" % (out, err))
+ key_size = m.group(1)
+ if not key_size.isnumeric():
+ self.fail("Failed to get key size information from: %s" % key_size)
+ return int(key_size)
+
+ @tag_test(TestTags.SLOW, TestTags.CORE)
+ def test_luks_format_key_size(self):
+ """Verify that formating device as LUKS works"""
+
+ # aes-xts: key size should default to 512
+ succ = BlockDev.crypto_luks_format(self.loop_dev, "aes-xts-plain64", 0, PASSWD, None, 0)
+ self.assertTrue(succ)
+
+ key_size = self._get_luks1_key_size(self.loop_dev)
+ self.assertEqual(key_size, 512)
+
+ # aes-cbc: key size should default to 256
+ succ = BlockDev.crypto_luks_format(self.loop_dev, "aes-cbc-essiv:sha256", 0, PASSWD, None, 0)
+ self.assertTrue(succ)
+
+ key_size = self._get_luks1_key_size(self.loop_dev)
+ self.assertEqual(key_size, 256)
+
+ # try specifying key size for aes-xts
+ succ = BlockDev.crypto_luks_format(self.loop_dev, "aes-xts-plain64", 256, PASSWD, None, 0)
+ self.assertTrue(succ)
+
+ key_size = self._get_luks1_key_size(self.loop_dev)
+ self.assertEqual(key_size, 256)
+
+
class CryptoTestResize(CryptoTestCase):
def _get_key_location(self, device):

View File

@ -1,178 +0,0 @@
From 98cb3b9cf2046ba6e33db6ff400449c6a4827932 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 29 Apr 2021 12:38:49 +0200
Subject: [PATCH 1/8] kbd: Fix memory leak
---
src/plugins/kbd.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/plugins/kbd.c b/src/plugins/kbd.c
index a2908ecb..d5ae0ed7 100644
--- a/src/plugins/kbd.c
+++ b/src/plugins/kbd.c
@@ -1035,6 +1035,7 @@ gboolean bd_kbd_bcache_destroy (const gchar *bcache_device, GError **error) {
if (c_set_uuid) {
path = g_strdup_printf ("/sys/fs/bcache/%s/stop", c_set_uuid);
+ g_free (c_set_uuid);
success = bd_utils_echo_str_to_file ("1", path, error);
g_free (path);
if (!success) {
From c6d226c70996f6006a3f6eff13f8264f03e95c4f Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:22:58 +0200
Subject: [PATCH 2/8] crypto: Fix memory leak
---
src/plugins/crypto.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/plugins/crypto.c b/src/plugins/crypto.c
index 1e7043fa..4fad9a85 100644
--- a/src/plugins/crypto.c
+++ b/src/plugins/crypto.c
@@ -1275,6 +1275,7 @@ gboolean bd_crypto_luks_add_key (const gchar *device, const gchar *pass, const g
success = g_file_get_contents (nkey_file, &nkey_buf, &nbuf_len, error);
if (!success) {
g_prefix_error (error, "Failed to load key from file '%s': ", nkey_file);
+ g_free (key_buf);
return FALSE;
}
} else
From 41b460fb81cf066e7ddc0bdda7f34db5e90b9f79 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:23:24 +0200
Subject: [PATCH 3/8] dm: Fix memory leak in the DM plugin and DM logging
redirect function
---
src/plugins/dm.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/plugins/dm.c b/src/plugins/dm.c
index fb4e50b5..c9a735ed 100644
--- a/src/plugins/dm.c
+++ b/src/plugins/dm.c
@@ -245,7 +245,8 @@ gchar* bd_dm_name_from_node (const gchar *dm_node, GError **error) {
g_free (sys_path);
if (!success) {
- /* errror is already populated */
+ /* error is already populated */
+ g_free (ret);
return NULL;
}
From 8d085fbb15c18ca91a5eff89192391c5a0b3bb7a Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:24:14 +0200
Subject: [PATCH 4/8] fs: Fix memory leak
---
src/plugins/fs/mount.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/plugins/fs/mount.c b/src/plugins/fs/mount.c
index 43d64e8c..46e03ca4 100644
--- a/src/plugins/fs/mount.c
+++ b/src/plugins/fs/mount.c
@@ -541,6 +541,7 @@ static gboolean run_as_user (MountFunc func, MountArgs *args, uid_t run_as_uid,
"Unknoen error while reading error.");
g_io_channel_unref (channel);
close (pipefd[0]);
+ g_free (error_msg);
return FALSE;
}
From 6c45f4ef1fc898d71cc2f13670adb508a6037c66 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:26:24 +0200
Subject: [PATCH 5/8] kbd: Fix memory leak
---
src/plugins/kbd.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/plugins/kbd.c b/src/plugins/kbd.c
index d5ae0ed7..ff8bde17 100644
--- a/src/plugins/kbd.c
+++ b/src/plugins/kbd.c
@@ -1255,6 +1255,7 @@ static gboolean get_cache_size_used (const gchar *cache_dev_sys, guint64 *size,
g_io_channel_unref (file);
if (!found) {
+ g_free (line);
g_set_error (error, BD_KBD_ERROR, BD_KBD_ERROR_BCACHE_INVAL,
"Failed to get cache usage data");
return FALSE;
From 4f4e93dfca36421eb0e0cb2dec5d48df5bc2f363 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:26:37 +0200
Subject: [PATCH 6/8] lvm-dbus: Fix memory leak
---
src/plugins/lvm-dbus.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/plugins/lvm-dbus.c b/src/plugins/lvm-dbus.c
index b7b4480e..144551f5 100644
--- a/src/plugins/lvm-dbus.c
+++ b/src/plugins/lvm-dbus.c
@@ -2927,6 +2927,7 @@ gboolean bd_lvm_cache_detach (const gchar *vg_name, const gchar *cached_lv, gboo
lv_id = g_strdup_printf ("%s/%s", vg_name, cached_lv);
call_lvm_obj_method_sync (lv_id, CACHED_LV_INTF, "DetachCachePool", params, NULL, extra, TRUE, error);
g_free (lv_id);
+ g_free (cache_pool_name);
return ((*error) == NULL);
}
From 410a10bc2cfceeb550d72456573d4722b4207ddc Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:27:22 +0200
Subject: [PATCH 7/8] mdraid: Fix memory leak
---
src/plugins/mdraid.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
index 74af744c..b97bc641 100644
--- a/src/plugins/mdraid.c
+++ b/src/plugins/mdraid.c
@@ -1332,6 +1332,7 @@ gchar* bd_md_name_from_node (const gchar *node, GError **error) {
continue;
}
node_name = g_path_get_basename (dev_path);
+ g_free (dev_path);
if (g_strcmp0 (node_name, node) == 0) {
found = TRUE;
name = g_path_get_basename (*path_p);
From 0d49e5d190e24fa89ae2795714d0276f24285b19 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:27:54 +0200
Subject: [PATCH 8/8] swap: Fix memory leak
---
src/plugins/swap.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/plugins/swap.c b/src/plugins/swap.c
index 102780a7..115f8fca 100644
--- a/src/plugins/swap.c
+++ b/src/plugins/swap.c
@@ -417,6 +417,7 @@ gboolean bd_swap_swapstatus (const gchar *device, GError **error) {
if (!real_device) {
/* the device doesn't exist and thus is not an active swap */
g_clear_error (error);
+ g_free (file_content);
return FALSE;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,296 +0,0 @@
From cc522ec3717d909370af6181c7859c62fa0167df Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 22 Feb 2021 15:40:56 +0100
Subject: [PATCH 1/2] fs: Allow using empty label for vfat with newest
dosfstools
---
src/plugins/fs/vfat.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/plugins/fs/vfat.c b/src/plugins/fs/vfat.c
index ff0c35a3..ce13f147 100644
--- a/src/plugins/fs/vfat.c
+++ b/src/plugins/fs/vfat.c
@@ -232,10 +232,21 @@ gboolean bd_fs_vfat_repair (const gchar *device, const BDExtraArg **extra, GErro
*/
gboolean bd_fs_vfat_set_label (const gchar *device, const gchar *label, GError **error) {
const gchar *args[4] = {"fatlabel", device, label, NULL};
+ UtilDep dep = {"fatlabel", "4.2", "--version", "fatlabel\\s+([\\d\\.]+).+"};
+ gboolean new_vfat = FALSE;
if (!check_deps (&avail_deps, DEPS_FATLABEL_MASK, deps, DEPS_LAST, &deps_check_lock, error))
return FALSE;
+ if (!label || g_strcmp0 (label, "") == 0) {
+ /* fatlabel >= 4.2 refuses to set empty label */
+ new_vfat = bd_utils_check_util_version (dep.name, dep.version,
+ dep.ver_arg, dep.ver_regexp,
+ NULL);
+ if (new_vfat)
+ args[2] = "--reset";
+ }
+
return bd_utils_exec_and_report_error (args, NULL, error);
}
From c3c3583409c8ed8f99a840e0c70cc92ca1dd3c93 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 27 Apr 2021 14:06:59 +0200
Subject: [PATCH 2/2] tests: Call fs_vfat_mkfs with "--mbr=n" extra option in
tests
Without the option the newest dosfstools 4.2 will create a valid
MBR partition table with a simgle partition on the disk, see
dosfstools/dosfstools#95 for details.
---
src/plugins/fs/vfat.c | 5 ++-
tests/fs_test.py | 76 +++++++++++++++++++++++++++++++++----------
2 files changed, 62 insertions(+), 19 deletions(-)
diff --git a/src/plugins/fs/vfat.c b/src/plugins/fs/vfat.c
index ce13f147..6cb82537 100644
--- a/src/plugins/fs/vfat.c
+++ b/src/plugins/fs/vfat.c
@@ -234,6 +234,7 @@ gboolean bd_fs_vfat_set_label (const gchar *device, const gchar *label, GError *
const gchar *args[4] = {"fatlabel", device, label, NULL};
UtilDep dep = {"fatlabel", "4.2", "--version", "fatlabel\\s+([\\d\\.]+).+"};
gboolean new_vfat = FALSE;
+ GError *loc_error = NULL;
if (!check_deps (&avail_deps, DEPS_FATLABEL_MASK, deps, DEPS_LAST, &deps_check_lock, error))
return FALSE;
@@ -242,9 +243,11 @@ gboolean bd_fs_vfat_set_label (const gchar *device, const gchar *label, GError *
/* fatlabel >= 4.2 refuses to set empty label */
new_vfat = bd_utils_check_util_version (dep.name, dep.version,
dep.ver_arg, dep.ver_regexp,
- NULL);
+ &loc_error);
if (new_vfat)
args[2] = "--reset";
+ else
+ g_clear_error (&loc_error);
}
return bd_utils_exec_and_report_error (args, NULL, error);
diff --git a/tests/fs_test.py b/tests/fs_test.py
index 239cb47c..2233db4f 100644
--- a/tests/fs_test.py
+++ b/tests/fs_test.py
@@ -5,10 +5,13 @@
import tempfile
from contextlib import contextmanager
import utils
-from utils import run, create_sparse_tempfile, mount, umount, TestTags, tag_test
+from utils import run, create_sparse_tempfile, mount, umount, TestTags, tag_test, run_command
+import re
import six
import overrides_hack
+from distutils.version import LooseVersion
+
from gi.repository import BlockDev, GLib
@@ -29,9 +32,20 @@ def mounted(device, where, ro=False):
yield
umount(where)
+
+def _get_dosfstools_version():
+ _ret, out, _err = run_command("mkfs.vfat --help")
+ # mkfs.fat 4.1 (2017-01-24)
+ m = re.search(r"mkfs\.fat ([\d\.]+)", out)
+ if not m or len(m.groups()) != 1:
+ raise RuntimeError("Failed to determine dosfstools version from: %s" % out)
+ return LooseVersion(m.groups()[0])
+
+
class FSTestCase(unittest.TestCase):
requested_plugins = BlockDev.plugin_specs_from_names(("fs", "loop"))
+ _vfat_version = _get_dosfstools_version()
@classmethod
def setUpClass(cls):
@@ -66,6 +80,11 @@ def setUp(self):
self.mount_dir = tempfile.mkdtemp(prefix="libblockdev.", suffix="ext4_test")
+ if self._vfat_version <= LooseVersion("4.1"):
+ self._mkfs_options = None
+ else:
+ self._mkfs_options = [BlockDev.ExtraArg.new("--mbr=n", "")]
+
def _clean_up(self):
try:
utils.delete_lio_device(self.loop_dev)
@@ -120,7 +139,10 @@ def test_generic_wipe(self):
# vfat has multiple signatures on the device so it allows us to test the
# 'all' argument of fs_wipe()
- ret = run("mkfs.vfat -I %s >/dev/null 2>&1" % self.loop_dev)
+ if self._vfat_version >= LooseVersion("4.2"):
+ ret = utils.run("mkfs.vfat -I %s >/dev/null 2>&1 --mbr=n" % self.loop_dev)
+ else:
+ ret = utils.run("mkfs.vfat -I %s >/dev/null 2>&1" % self.loop_dev)
self.assertEqual(ret, 0)
time.sleep(0.5)
@@ -142,7 +164,10 @@ def test_generic_wipe(self):
self.assertEqual(fs_type, b"")
# now do the wipe all in a one step
- ret = run("mkfs.vfat -I %s >/dev/null 2>&1" % self.loop_dev)
+ if self._vfat_version >= LooseVersion("4.2"):
+ ret = utils.run("mkfs.vfat -I %s >/dev/null 2>&1 --mbr=n" % self.loop_dev)
+ else:
+ ret = utils.run("mkfs.vfat -I %s >/dev/null 2>&1" % self.loop_dev)
self.assertEqual(ret, 0)
succ = BlockDev.fs_wipe(self.loop_dev, True)
@@ -197,7 +222,10 @@ def test_clean(self):
# vfat has multiple signatures on the device so it allows us to test
# that clean removes all signatures
- ret = run("mkfs.vfat -I %s >/dev/null 2>&1" % self.loop_dev)
+ if self._vfat_version >= LooseVersion("4.2"):
+ ret = utils.run("mkfs.vfat -I %s >/dev/null 2>&1 --mbr=n" % self.loop_dev)
+ else:
+ ret = utils.run("mkfs.vfat -I %s >/dev/null 2>&1" % self.loop_dev)
self.assertEqual(ret, 0)
time.sleep(0.5)
@@ -744,9 +772,9 @@ def test_vfat_mkfs(self):
"""Verify that it is possible to create a new vfat file system"""
with self.assertRaises(GLib.GError):
- BlockDev.fs_vfat_mkfs("/non/existing/device", None)
+ BlockDev.fs_vfat_mkfs("/non/existing/device", self._mkfs_options)
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
# just try if we can mount the file system
@@ -764,7 +792,10 @@ def test_vfat_mkfs_with_label(self):
"""Verify that it is possible to create an vfat file system with label"""
ea = BlockDev.ExtraArg.new("-n", "TEST_LABEL")
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, [ea])
+ if self._mkfs_options:
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, [ea] + self._mkfs_options)
+ else:
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, [ea])
self.assertTrue(succ)
fi = BlockDev.fs_vfat_get_info(self.loop_dev)
@@ -775,7 +806,7 @@ class VfatTestWipe(FSTestCase):
def test_vfat_wipe(self):
"""Verify that it is possible to wipe an vfat file system"""
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
succ = BlockDev.fs_vfat_wipe(self.loop_dev)
@@ -805,7 +836,7 @@ class VfatTestCheck(FSTestCase):
def test_vfat_check(self):
"""Verify that it is possible to check an vfat file system"""
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
succ = BlockDev.fs_vfat_check(self.loop_dev, None)
@@ -818,7 +849,7 @@ class VfatTestRepair(FSTestCase):
def test_vfat_repair(self):
"""Verify that it is possible to repair an vfat file system"""
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
succ = BlockDev.fs_vfat_repair(self.loop_dev, None)
@@ -828,7 +859,7 @@ class VfatGetInfo(FSTestCase):
def test_vfat_get_info(self):
"""Verify that it is possible to get info about an vfat file system"""
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
fi = BlockDev.fs_vfat_get_info(self.loop_dev)
@@ -841,7 +872,7 @@ class VfatSetLabel(FSTestCase):
def test_vfat_set_label(self):
"""Verify that it is possible to set label of an vfat file system"""
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
fi = BlockDev.fs_vfat_get_info(self.loop_dev)
@@ -870,7 +901,7 @@ class VfatResize(FSTestCase):
def test_vfat_resize(self):
"""Verify that it is possible to resize an vfat file system"""
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
# shrink
@@ -999,7 +1030,7 @@ def _remove_user(self):
def test_mount(self):
""" Test basic mounting and unmounting """
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
tmp = tempfile.mkdtemp(prefix="libblockdev.", suffix="mount_test")
@@ -1104,7 +1135,7 @@ def test_mount_fstab(self):
fstab = utils.read_file("/etc/fstab")
self.addCleanup(utils.write_file, "/etc/fstab", fstab)
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
tmp = tempfile.mkdtemp(prefix="libblockdev.", suffix="mount_fstab_test")
@@ -1139,7 +1170,7 @@ def test_mount_fstab_user(self):
fstab = utils.read_file("/etc/fstab")
self.addCleanup(utils.write_file, "/etc/fstab", fstab)
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
tmp = tempfile.mkdtemp(prefix="libblockdev.", suffix="mount_fstab_user_test")
@@ -1423,7 +1454,16 @@ def expected_size(fi):
@tag_test(TestTags.UNSTABLE)
def test_vfat_generic_resize(self):
"""Test generic resize function with a vfat file system"""
- self._test_generic_resize(mkfs_function=BlockDev.fs_vfat_mkfs)
+ def mkfs_vfat(device, options=None):
+ if self._vfat_version >= LooseVersion("4.2"):
+ if options:
+ return BlockDev.fs_vfat_mkfs(device, options + [BlockDev.ExtraArg.new("--mbr=n", "")])
+ else:
+ return BlockDev.fs_vfat_mkfs(device, [BlockDev.ExtraArg.new("--mbr=n", "")])
+ else:
+ return BlockDev.fs_vfat_mkfs(device, options)
+
+ self._test_generic_resize(mkfs_function=mkfs_vfat)
def _destroy_lvm(self):
run("vgremove --yes libbd_fs_tests >/dev/null 2>&1")
@@ -1539,7 +1579,7 @@ def test_freeze_xfs(self):
def test_freeze_vfat(self):
""" Test basic freezing and un-freezing with FAT """
- succ = BlockDev.fs_vfat_mkfs(self.loop_dev, None)
+ succ = BlockDev.fs_vfat_mkfs(self.loop_dev, self._mkfs_options)
self.assertTrue(succ)
tmp = tempfile.mkdtemp(prefix="libblockdev.", suffix="freeze_test")

View File

@ -0,0 +1,59 @@
From 7a0e344d0642f76992c943158621d8ee7e5caea3 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 15 Nov 2022 13:21:25 +0100
Subject: [PATCH 1/2] crypto: Fix GError overwrite from libvolume_key
---
src/plugins/crypto.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/plugins/crypto.c b/src/plugins/crypto.c
index 35c38410..9064c8e3 100644
--- a/src/plugins/crypto.c
+++ b/src/plugins/crypto.c
@@ -2552,13 +2552,14 @@ static gboolean write_escrow_data_file (struct libvk_volume *volume, struct libv
GIOChannel *out_file = NULL;
GIOStatus status = G_IO_STATUS_ERROR;
gsize bytes_written = 0;
+ GError *l_error = NULL;
packet_data = libvk_volume_create_packet_asymmetric_with_format (volume, &packet_data_size, secret_type, cert,
- ui, LIBVK_PACKET_FORMAT_ASYMMETRIC_WRAP_SECRET_ONLY, error);
-
+ ui, LIBVK_PACKET_FORMAT_ASYMMETRIC_WRAP_SECRET_ONLY, &l_error);
if (!packet_data) {
g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_ESCROW_FAILED,
- "Failed to get escrow data");
+ "Failed to get escrow data: %s", l_error->message);
+ g_clear_error (&l_error);
libvk_volume_free (volume);
return FALSE;
}
--
2.38.1
From 25bf34c4c03e37eb3782dfccf459b9a3f795ddb3 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 16 Nov 2022 10:26:06 +0100
Subject: [PATCH 2/2] crypto: Fix double free in write_escrow_data_file
---
src/plugins/crypto.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/plugins/crypto.c b/src/plugins/crypto.c
index 9064c8e3..2086209e 100644
--- a/src/plugins/crypto.c
+++ b/src/plugins/crypto.c
@@ -2560,7 +2560,6 @@ static gboolean write_escrow_data_file (struct libvk_volume *volume, struct libv
g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_ESCROW_FAILED,
"Failed to get escrow data: %s", l_error->message);
g_clear_error (&l_error);
- libvk_volume_free (volume);
return FALSE;
}
--
2.38.1

View File

@ -1,157 +0,0 @@
From 7c31cc534f96766dd2e3427b09d0affca66b0745 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 23 Mar 2021 13:54:02 +0100
Subject: [PATCH 1/3] tests: Do not try to remove VG before removing the VDO
pool
---
tests/lvm_dbus_tests.py | 6 +++---
tests/lvm_test.py | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index 8f2bb95d..b599fdd0 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -1517,14 +1517,14 @@ def setUp(self):
self.assertTrue(succ)
def _clean_up(self):
- BlockDev.lvm_vgremove("testVDOVG")
- BlockDev.lvm_pvremove(self.loop_dev)
-
try:
BlockDev.lvm_lvremove("testVDOVG", "vdoPool", True, None)
except:
pass
+ BlockDev.lvm_vgremove("testVDOVG")
+ BlockDev.lvm_pvremove(self.loop_dev)
+
try:
delete_lio_device(self.loop_dev)
except RuntimeError:
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index 6f80a3ba..6c04faf9 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -1437,14 +1437,14 @@ def setUp(self):
self.assertTrue(succ)
def _clean_up(self):
- BlockDev.lvm_vgremove("testVDOVG")
- BlockDev.lvm_pvremove(self.loop_dev)
-
try:
BlockDev.lvm_lvremove("testVDOVG", "vdoPool", True, None)
except:
pass
+ BlockDev.lvm_vgremove("testVDOVG")
+ BlockDev.lvm_pvremove(self.loop_dev)
+
try:
delete_lio_device(self.loop_dev)
except RuntimeError:
From 41b9d745b8c1a33221e15683f390bae180d1e960 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 23 Mar 2021 13:59:24 +0100
Subject: [PATCH 2/3] tests: Force remove LVM VG /dev/ entry not removed by
vgremove
The directory is sometimes not removed. This is a known bug that
causes subsequent test cases to fail.
---
tests/lvm_dbus_tests.py | 6 ++++++
tests/lvm_test.py | 6 ++++++
2 files changed, 12 insertions(+)
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index b599fdd0..3278716e 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -399,6 +399,9 @@ def _clean_up(self):
except:
pass
+ # XXX remove lingering /dev entries
+ shutil.rmtree("/dev/testVG", ignore_errors=True)
+
LvmPVonlyTestCase._clean_up(self)
@unittest.skipUnless(lvm_dbus_running, "LVM DBus not running")
@@ -1525,6 +1528,9 @@ def _clean_up(self):
BlockDev.lvm_vgremove("testVDOVG")
BlockDev.lvm_pvremove(self.loop_dev)
+ # XXX remove lingering /dev entries
+ shutil.rmtree("/dev/testVDOVG", ignore_errors=True)
+
try:
delete_lio_device(self.loop_dev)
except RuntimeError:
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index 6c04faf9..d7e1f84c 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -378,6 +378,9 @@ def _clean_up(self):
except:
pass
+ # XXX remove lingering /dev entries
+ shutil.rmtree("/dev/testVG", ignore_errors=True)
+
LvmPVonlyTestCase._clean_up(self)
class LvmTestVGcreateRemove(LvmPVVGTestCase):
@@ -1445,6 +1448,9 @@ def _clean_up(self):
BlockDev.lvm_vgremove("testVDOVG")
BlockDev.lvm_pvremove(self.loop_dev)
+ # XXX remove lingering /dev entries
+ shutil.rmtree("/dev/testVDOVG", ignore_errors=True)
+
try:
delete_lio_device(self.loop_dev)
except RuntimeError:
From 4ecf0075cedf3a1d275d34b94ce5bb512c4e970e Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 23 Mar 2021 14:03:44 +0100
Subject: [PATCH 3/3] tests: Tag LvmPVVGLVcachePoolCreateRemoveTestCase as
unstable
LVM randomly fails to activate the newly created metadata LV.
Issue is reported to LVM and not yet fixed.
---
tests/lvm_dbus_tests.py | 2 +-
tests/lvm_test.py | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index 3278716e..4882da88 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -1213,7 +1213,7 @@ def _clean_up(self):
@unittest.skipUnless(lvm_dbus_running, "LVM DBus not running")
class LvmPVVGLVcachePoolCreateRemoveTestCase(LvmPVVGLVcachePoolTestCase):
- @tag_test(TestTags.SLOW)
+ @tag_test(TestTags.SLOW, TestTags.UNSTABLE)
def test_cache_pool_create_remove(self):
"""Verify that is it possible to create and remove a cache pool"""
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index d7e1f84c..eb94c917 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -1129,7 +1129,7 @@ def _clean_up(self):
LvmPVVGLVTestCase._clean_up(self)
class LvmPVVGLVcachePoolCreateRemoveTestCase(LvmPVVGLVcachePoolTestCase):
- @tag_test(TestTags.SLOW)
+ @tag_test(TestTags.SLOW, TestTags.UNSTABLE)
def test_cache_pool_create_remove(self):
"""Verify that is it possible to create and remove a cache pool"""

View File

@ -0,0 +1,506 @@
From b25fd9caca9b2fb34e5a4d7d4bee0031e4758d0a Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Thu, 22 Sep 2022 16:31:28 +0200
Subject: [PATCH 1/5] nvme: Avoid sending NVME_IDENTIFY_CNS_NS_DESC_LIST on
older devices
Turned out this Identify feature was introduced only with the NVMe 1.3
specification. To find out device supported NVMe revision an extra
Identify Controller call is needed.
---
src/plugins/nvme/nvme-info.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/plugins/nvme/nvme-info.c b/src/plugins/nvme/nvme-info.c
index fdd90459..112b4054 100644
--- a/src/plugins/nvme/nvme-info.c
+++ b/src/plugins/nvme/nvme-info.c
@@ -431,7 +431,7 @@ BDNVMEControllerInfo * bd_nvme_get_controller_info (const gchar *device, GError
if (fd < 0)
return NULL;
- /* send the NVME_IDENTIFY_CNS_NS + NVME_IDENTIFY_CNS_CTRL ioctl */
+ /* send the NVME_IDENTIFY_CNS_CTRL ioctl */
ret = nvme_identify_ctrl (fd, &ctrl_id);
if (ret != 0) {
_nvme_status_to_error (ret, FALSE, error);
@@ -539,9 +539,11 @@ BDNVMEControllerInfo * bd_nvme_get_controller_info (const gchar *device, GError
*/
BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **error) {
int ret;
- int ret_desc;
+ int ret_ctrl;
+ int ret_desc = -1;
int fd;
__u32 nsid = 0;
+ struct nvme_id_ctrl ctrl_id = ZERO_INIT;
struct nvme_id_ns ns_info = ZERO_INIT;
uint8_t desc[NVME_IDENTIFY_DATA_SIZE] = ZERO_INIT;
guint8 flbas;
@@ -565,7 +567,6 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
}
/* send the NVME_IDENTIFY_CNS_NS ioctl */
- ret_desc = nvme_identify_ns_descs (fd, nsid, (struct nvme_ns_id_desc *) &desc);
ret = nvme_identify_ns (fd, nsid, &ns_info);
if (ret != 0) {
_nvme_status_to_error (ret, FALSE, error);
@@ -573,6 +574,13 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
close (fd);
return NULL;
}
+
+ /* send the NVME_IDENTIFY_CNS_CTRL ioctl */
+ ret_ctrl = nvme_identify_ctrl (fd, &ctrl_id);
+
+ /* send the NVME_IDENTIFY_CNS_NS_DESC_LIST ioctl, NVMe 1.3 */
+ if (ret_ctrl == 0 && GUINT32_FROM_LE (ctrl_id.ver) >= 0x10300)
+ ret_desc = nvme_identify_ns_descs (fd, nsid, (struct nvme_ns_id_desc *) &desc);
close (fd);
info = g_new0 (BDNVMENamespaceInfo, 1);
--
2.39.0
From e6f7d0c4562623b03df96dc6b89ab00d8e4d6b90 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Thu, 22 Sep 2022 16:56:26 +0200
Subject: [PATCH 2/5] nvme: Add BD_NVME_NS_FEAT_ROTATIONAL
A NVMe 2.0 feature indicating rotational medium on a namespace level.
Further information can be found in the Rotational Media Information Log
page (Log Identifier 16h) that is not implemented in libblockdev yet.
---
src/lib/plugin_apis/nvme.api | 2 ++
src/plugins/nvme/nvme-info.c | 10 ++++++++++
src/plugins/nvme/nvme.h | 2 ++
tests/nvme_test.py | 1 +
4 files changed, 15 insertions(+)
diff --git a/src/lib/plugin_apis/nvme.api b/src/lib/plugin_apis/nvme.api
index 79247a01..7bc2cf9e 100644
--- a/src/lib/plugin_apis/nvme.api
+++ b/src/lib/plugin_apis/nvme.api
@@ -317,12 +317,14 @@ GType bd_nvme_lba_format_get_type () {
* in the NVM subsystem concurrently.
* @BD_NVME_NS_FEAT_FORMAT_PROGRESS: indicates the capability to report the percentage of the namespace
* that remains to be formatted.
+ * @BD_NVME_NS_FEAT_ROTATIONAL: indicates a rotational medium.
*/
/* BpG-skip-end */
typedef enum {
BD_NVME_NS_FEAT_THIN = 1 << 0,
BD_NVME_NS_FEAT_MULTIPATH_SHARED = 1 << 1,
BD_NVME_NS_FEAT_FORMAT_PROGRESS = 1 << 2,
+ BD_NVME_NS_FEAT_ROTATIONAL = 1 << 3,
} BDNVMENamespaceFeature;
#define BD_NVME_TYPE_NAMESPACE_INFO (bd_nvme_namespace_info_get_type ())
diff --git a/src/plugins/nvme/nvme-info.c b/src/plugins/nvme/nvme-info.c
index 112b4054..c574a6f3 100644
--- a/src/plugins/nvme/nvme-info.c
+++ b/src/plugins/nvme/nvme-info.c
@@ -541,10 +541,12 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
int ret;
int ret_ctrl;
int ret_desc = -1;
+ int ret_ns_ind = -1;
int fd;
__u32 nsid = 0;
struct nvme_id_ctrl ctrl_id = ZERO_INIT;
struct nvme_id_ns ns_info = ZERO_INIT;
+ struct nvme_id_independent_id_ns ns_info_ind = ZERO_INIT;
uint8_t desc[NVME_IDENTIFY_DATA_SIZE] = ZERO_INIT;
guint8 flbas;
guint i;
@@ -581,6 +583,10 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
/* send the NVME_IDENTIFY_CNS_NS_DESC_LIST ioctl, NVMe 1.3 */
if (ret_ctrl == 0 && GUINT32_FROM_LE (ctrl_id.ver) >= 0x10300)
ret_desc = nvme_identify_ns_descs (fd, nsid, (struct nvme_ns_id_desc *) &desc);
+
+ /* send the NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS ioctl, NVMe 2.0 */
+ if (ret_ctrl == 0 && GUINT32_FROM_LE (ctrl_id.ver) >= 0x20000)
+ ret_ns_ind = nvme_identify_independent_identify_ns (fd, nsid, &ns_info_ind);
close (fd);
info = g_new0 (BDNVMENamespaceInfo, 1);
@@ -627,6 +633,10 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
}
}
}
+ if (ret_ns_ind == 0) {
+ if ((ns_info_ind.nsfeat & 1 << 4) == 1 << 4)
+ info->features |= BD_NVME_NS_FEAT_ROTATIONAL;
+ }
/* translate the LBA Format array */
ptr_array = g_ptr_array_new ();
diff --git a/src/plugins/nvme/nvme.h b/src/plugins/nvme/nvme.h
index a7d30d79..ad456a82 100644
--- a/src/plugins/nvme/nvme.h
+++ b/src/plugins/nvme/nvme.h
@@ -202,11 +202,13 @@ typedef struct BDNVMELBAFormat {
* in the NVM subsystem concurrently.
* @BD_NVME_NS_FEAT_FORMAT_PROGRESS: indicates the capability to report the percentage of the namespace
* that remains to be formatted.
+ * @BD_NVME_NS_FEAT_ROTATIONAL: indicates a rotational medium.
*/
typedef enum {
BD_NVME_NS_FEAT_THIN = 1 << 0,
BD_NVME_NS_FEAT_MULTIPATH_SHARED = 1 << 1,
BD_NVME_NS_FEAT_FORMAT_PROGRESS = 1 << 2,
+ BD_NVME_NS_FEAT_ROTATIONAL = 1 << 3,
} BDNVMENamespaceFeature;
/**
diff --git a/tests/nvme_test.py b/tests/nvme_test.py
index a46f7422..f205e539 100644
--- a/tests/nvme_test.py
+++ b/tests/nvme_test.py
@@ -73,6 +73,7 @@ class NVMeTestCase(NVMeTest):
self.assertFalse(info.features & BlockDev.NVMENamespaceFeature.THIN)
self.assertTrue (info.features & BlockDev.NVMENamespaceFeature.MULTIPATH_SHARED)
self.assertFalse(info.features & BlockDev.NVMENamespaceFeature.FORMAT_PROGRESS)
+ self.assertFalse(info.features & BlockDev.NVMENamespaceFeature.ROTATIONAL)
self.assertEqual(info.eui64, "0000000000000000")
self.assertEqual(info.format_progress_remaining, 0)
self.assertEqual(len(info.lba_formats), 1)
--
2.39.0
From 4ff0df937dcd357623e7b7d960c08c476b1deffb Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 9 Dec 2022 16:13:43 +0100
Subject: [PATCH 3/5] nvme: Fix namespace identifiers
Use Namespace Identification Descriptor list (CNS 03h) data when available
and NVM Command Set Identify Namespace Data Structure (CNS 00h) as a fallback.
Also, if the CNS 00h EUI64 or NGUID fields equal to zero, return NULL
instead of zeroes:
"If the controller is not able to provide a ... identifier in this field,
then this field shall be cleared to 0h."
---
src/plugins/nvme/nvme-info.c | 26 +++++++++++++++++++-------
tests/nvme_test.py | 2 +-
2 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/src/plugins/nvme/nvme-info.c b/src/plugins/nvme/nvme-info.c
index c574a6f3..ac189abe 100644
--- a/src/plugins/nvme/nvme-info.c
+++ b/src/plugins/nvme/nvme-info.c
@@ -603,12 +603,7 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
info->format_progress_remaining = ns_info.fpi & NVME_NS_FPI_REMAINING;
/* TODO: what the ns_info.nvmcap really stands for? */
info->write_protected = (ns_info.nsattr & NVME_NS_NSATTR_WRITE_PROTECTED) == NVME_NS_NSATTR_WRITE_PROTECTED;
- info->nguid = g_malloc0 (sizeof (ns_info.nguid) * 2 + 1);
- for (i = 0; i < G_N_ELEMENTS (ns_info.nguid); i++)
- snprintf (info->nguid + i * 2, 3, "%02x", ns_info.nguid[i]);
- info->eui64 = g_malloc0 (sizeof (ns_info.eui64) * 2 + 1);
- for (i = 0; i < G_N_ELEMENTS (ns_info.eui64); i++)
- snprintf (info->eui64 + i * 2, 3, "%02x", ns_info.eui64[i]);
+
if (ret_desc == 0) {
for (i = 0; i < NVME_IDENTIFY_DATA_SIZE; i += len) {
struct nvme_ns_id_desc *d = (void *) desc + i;
@@ -620,8 +615,14 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
switch (d->nidt) {
case NVME_NIDT_EUI64:
+ info->eui64 = g_malloc0 (d->nidl * 2 + 1);
+ for (i = 0; i < d->nidl; i++)
+ snprintf (info->eui64 + i * 2, 3, "%02x", d->nid[i]);
+ break;
case NVME_NIDT_NGUID:
- /* already have these from nvme_identify_ns() */
+ info->nguid = g_malloc0 (d->nidl * 2 + 1);
+ for (i = 0; i < d->nidl; i++)
+ snprintf (info->nguid + i * 2, 3, "%02x", d->nid[i]);
break;
case NVME_NIDT_UUID:
uuid_unparse (d->nid, uuid_buf);
@@ -633,6 +634,17 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
}
}
}
+
+ if (info->nguid == NULL && ns_info.nguid[G_N_ELEMENTS (ns_info.nguid) - 1] > 0) {
+ info->nguid = g_malloc0 (sizeof (ns_info.nguid) * 2 + 1);
+ for (i = 0; i < G_N_ELEMENTS (ns_info.nguid); i++)
+ snprintf (info->nguid + i * 2, 3, "%02x", ns_info.nguid[i]);
+ }
+ if (info->eui64 == NULL && ns_info.eui64[G_N_ELEMENTS (ns_info.eui64) - 1] > 0) {
+ info->eui64 = g_malloc0 (sizeof (ns_info.eui64) * 2 + 1);
+ for (i = 0; i < G_N_ELEMENTS (ns_info.eui64); i++)
+ snprintf (info->eui64 + i * 2, 3, "%02x", ns_info.eui64[i]);
+ }
if (ret_ns_ind == 0) {
if ((ns_info_ind.nsfeat & 1 << 4) == 1 << 4)
info->features |= BD_NVME_NS_FEAT_ROTATIONAL;
diff --git a/tests/nvme_test.py b/tests/nvme_test.py
index f205e539..a1822be6 100644
--- a/tests/nvme_test.py
+++ b/tests/nvme_test.py
@@ -74,7 +74,7 @@ class NVMeTestCase(NVMeTest):
self.assertTrue (info.features & BlockDev.NVMENamespaceFeature.MULTIPATH_SHARED)
self.assertFalse(info.features & BlockDev.NVMENamespaceFeature.FORMAT_PROGRESS)
self.assertFalse(info.features & BlockDev.NVMENamespaceFeature.ROTATIONAL)
- self.assertEqual(info.eui64, "0000000000000000")
+ self.assertIsNone(info.eui64)
self.assertEqual(info.format_progress_remaining, 0)
self.assertEqual(len(info.lba_formats), 1)
self.assertGreater(len(info.nguid), 0)
--
2.39.0
From cdbb9a37a19d3f388910f68c4c384bafae8901ae Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Wed, 11 Jan 2023 18:19:36 +0100
Subject: [PATCH 4/5] nvme: Use libnvme-1.2's nvme_uuid_to_string()
This also bumps libnvme dependency to 1.2
---
configure.ac | 5 +----
src/plugins/nvme/Makefile.am | 4 ++--
src/plugins/nvme/nvme-error.c | 3 ---
src/plugins/nvme/nvme-fabrics.c | 1 -
src/plugins/nvme/nvme-info.c | 17 ++++++++++-------
src/plugins/nvme/nvme-op.c | 1 -
src/plugins/nvme/nvme.c | 1 -
7 files changed, 13 insertions(+), 19 deletions(-)
diff --git a/configure.ac b/configure.ac
index ec789c91..fbd70473 100644
--- a/configure.ac
+++ b/configure.ac
@@ -281,10 +281,7 @@ AS_IF([test "x$with_nvdimm" != "xno"],
[])
AS_IF([test "x$with_nvme" != "xno"],
- [LIBBLOCKDEV_PKG_CHECK_MODULES([NVME], [libnvme >= 1.0])
- AS_IF([$PKG_CONFIG --atleast-version=1.1 libnvme],
- [AC_DEFINE([HAVE_LIBNVME_1_1])], [])
- ],
+ [LIBBLOCKDEV_PKG_CHECK_MODULES([NVME], [libnvme >= 1.2])],
[])
AS_IF([test "x$with_vdo" != "xno"],
diff --git a/src/plugins/nvme/Makefile.am b/src/plugins/nvme/Makefile.am
index b4a10ce0..a8a856d4 100644
--- a/src/plugins/nvme/Makefile.am
+++ b/src/plugins/nvme/Makefile.am
@@ -2,8 +2,8 @@ AUTOMAKE_OPTIONS = subdir-objects
lib_LTLIBRARIES = libbd_nvme.la
-libbd_nvme_la_CFLAGS = $(GLIB_CFLAGS) $(GIO_CFLAGS) $(UUID_CFLAGS) $(NVME_CFLAGS) -Wall -Wextra -Werror
-libbd_nvme_la_LIBADD = ${builddir}/../../utils/libbd_utils.la $(GLIB_LIBS) $(GIO_LIBS) $(UUID_LIBS) $(NVME_LIBS)
+libbd_nvme_la_CFLAGS = $(GLIB_CFLAGS) $(GIO_CFLAGS) $(NVME_CFLAGS) -Wall -Wextra -Werror
+libbd_nvme_la_LIBADD = ${builddir}/../../utils/libbd_utils.la $(GLIB_LIBS) $(GIO_LIBS) $(NVME_LIBS)
libbd_nvme_la_LDFLAGS = -L${srcdir}/../../utils/ -version-info 2:0:0 -Wl,--no-undefined
libbd_nvme_la_CPPFLAGS = -I${builddir}/../../../include/ -I${srcdir}/../ -I. -DPACKAGE_SYSCONF_DIR=\""$(sysconfdir)"\"
diff --git a/src/plugins/nvme/nvme-error.c b/src/plugins/nvme/nvme-error.c
index 86f0d6a3..cb95a46d 100644
--- a/src/plugins/nvme/nvme-error.c
+++ b/src/plugins/nvme/nvme-error.c
@@ -28,7 +28,6 @@
#include <malloc.h>
#include <libnvme.h>
-#include <uuid/uuid.h>
#include <blockdev/utils.h>
#include <check_deps.h>
@@ -123,7 +122,6 @@ void _nvme_fabrics_errno_to_gerror (int result, int _errno, GError **error)
case ENVME_CONNECT_LOOKUP_SUBSYS:
code = BD_NVME_ERROR_CONNECT;
break;
-#ifdef HAVE_LIBNVME_1_1
case ENVME_CONNECT_ALREADY:
code = BD_NVME_ERROR_CONNECT_ALREADY;
break;
@@ -139,7 +137,6 @@ void _nvme_fabrics_errno_to_gerror (int result, int _errno, GError **error)
case ENVME_CONNECT_OPNOTSUPP:
code = BD_NVME_ERROR_CONNECT_OPNOTSUPP;
break;
-#endif
default:
code = BD_NVME_ERROR_CONNECT;
}
diff --git a/src/plugins/nvme/nvme-fabrics.c b/src/plugins/nvme/nvme-fabrics.c
index 20ed57f5..bba7392d 100644
--- a/src/plugins/nvme/nvme-fabrics.c
+++ b/src/plugins/nvme/nvme-fabrics.c
@@ -30,7 +30,6 @@
#include <glib/gstdio.h>
#include <libnvme.h>
-#include <uuid/uuid.h>
#include <blockdev/utils.h>
#include <check_deps.h>
diff --git a/src/plugins/nvme/nvme-info.c b/src/plugins/nvme/nvme-info.c
index ac189abe..18719d51 100644
--- a/src/plugins/nvme/nvme-info.c
+++ b/src/plugins/nvme/nvme-info.c
@@ -28,7 +28,6 @@
#include <malloc.h>
#include <libnvme.h>
-#include <uuid/uuid.h>
#include <blockdev/utils.h>
#include <check_deps.h>
@@ -408,6 +407,14 @@ static gchar *decode_nvme_rev (guint32 ver) {
return g_strdup_printf ("%u.%u.%u", mjr, mnr, ter);
}
+static gchar *_uuid_to_str (unsigned char uuid[NVME_UUID_LEN]) {
+ gchar uuid_buf[NVME_UUID_LEN_STRING] = ZERO_INIT;
+
+ if (nvme_uuid_to_string (uuid, uuid_buf) == 0)
+ return g_strdup (uuid_buf);
+ return NULL;
+}
+
/**
* bd_nvme_get_controller_info:
* @device: a NVMe controller device (e.g. `/dev/nvme0`)
@@ -461,9 +468,7 @@ BDNVMEControllerInfo * bd_nvme_get_controller_info (const gchar *device, GError
info->pci_vendor_id = GUINT16_FROM_LE (ctrl_id.vid);
info->pci_subsys_vendor_id = GUINT16_FROM_LE (ctrl_id.ssvid);
info->ctrl_id = GUINT16_FROM_LE (ctrl_id.cntlid);
- /* TODO: decode fguid as 128-bit hex string? */
- info->fguid = g_strdup_printf ("%-.*s", (int) sizeof (ctrl_id.fguid), ctrl_id.fguid);
- g_strstrip (info->fguid);
+ info->fguid = _uuid_to_str (ctrl_id.fguid);
info->model_number = g_strndup (ctrl_id.mn, sizeof (ctrl_id.mn));
g_strstrip (info->model_number);
info->serial_number = g_strndup (ctrl_id.sn, sizeof (ctrl_id.sn));
@@ -607,7 +612,6 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
if (ret_desc == 0) {
for (i = 0; i < NVME_IDENTIFY_DATA_SIZE; i += len) {
struct nvme_ns_id_desc *d = (void *) desc + i;
- gchar uuid_buf[37] = ZERO_INIT;
if (!d->nidl)
break;
@@ -625,8 +629,7 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
snprintf (info->nguid + i * 2, 3, "%02x", d->nid[i]);
break;
case NVME_NIDT_UUID:
- uuid_unparse (d->nid, uuid_buf);
- info->uuid = g_strdup (uuid_buf);
+ info->uuid = _uuid_to_str (d->nid);
break;
case NVME_NIDT_CSI:
/* unused */
diff --git a/src/plugins/nvme/nvme-op.c b/src/plugins/nvme/nvme-op.c
index 4568c453..c9e92697 100644
--- a/src/plugins/nvme/nvme-op.c
+++ b/src/plugins/nvme/nvme-op.c
@@ -29,7 +29,6 @@
#include <linux/fs.h>
#include <libnvme.h>
-#include <uuid/uuid.h>
#include <blockdev/utils.h>
#include <check_deps.h>
diff --git a/src/plugins/nvme/nvme.c b/src/plugins/nvme/nvme.c
index 00f2f76e..4a32ac4e 100644
--- a/src/plugins/nvme/nvme.c
+++ b/src/plugins/nvme/nvme.c
@@ -28,7 +28,6 @@
#include <malloc.h>
#include <libnvme.h>
-#include <uuid/uuid.h>
#include <blockdev/utils.h>
#include <check_deps.h>
--
2.39.0
From 64263599ec39b6b0f20d8e16c1169afcf66f5d9a Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Thu, 12 Jan 2023 16:01:28 +0100
Subject: [PATCH 5/5] nvme: Fix zeroed struct fields detection
As often stated in the NVMe specification, fields of features that
are either not implemented or not valid are typically cleared to zero (0h).
---
src/plugins/nvme/nvme-info.c | 20 +++++++++++++++-----
tests/nvme_test.py | 2 +-
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/src/plugins/nvme/nvme-info.c b/src/plugins/nvme/nvme-info.c
index 18719d51..85f94a32 100644
--- a/src/plugins/nvme/nvme-info.c
+++ b/src/plugins/nvme/nvme-info.c
@@ -415,6 +415,15 @@ static gchar *_uuid_to_str (unsigned char uuid[NVME_UUID_LEN]) {
return NULL;
}
+static gboolean _nvme_a_is_zero (const __u8 a[], int len) {
+ int i;
+
+ for (i = 0; i < len; i++)
+ if (a[i] > 0)
+ return FALSE;
+ return TRUE;
+}
+
/**
* bd_nvme_get_controller_info:
* @device: a NVMe controller device (e.g. `/dev/nvme0`)
@@ -468,7 +477,8 @@ BDNVMEControllerInfo * bd_nvme_get_controller_info (const gchar *device, GError
info->pci_vendor_id = GUINT16_FROM_LE (ctrl_id.vid);
info->pci_subsys_vendor_id = GUINT16_FROM_LE (ctrl_id.ssvid);
info->ctrl_id = GUINT16_FROM_LE (ctrl_id.cntlid);
- info->fguid = _uuid_to_str (ctrl_id.fguid);
+ if (!_nvme_a_is_zero (ctrl_id.fguid, sizeof (ctrl_id.fguid)))
+ info->fguid = _uuid_to_str (ctrl_id.fguid);
info->model_number = g_strndup (ctrl_id.mn, sizeof (ctrl_id.mn));
g_strstrip (info->model_number);
info->serial_number = g_strndup (ctrl_id.sn, sizeof (ctrl_id.sn));
@@ -638,14 +648,14 @@ BDNVMENamespaceInfo *bd_nvme_get_namespace_info (const gchar *device, GError **e
}
}
- if (info->nguid == NULL && ns_info.nguid[G_N_ELEMENTS (ns_info.nguid) - 1] > 0) {
+ if (info->nguid == NULL && !_nvme_a_is_zero (ns_info.nguid, sizeof (ns_info.nguid))) {
info->nguid = g_malloc0 (sizeof (ns_info.nguid) * 2 + 1);
- for (i = 0; i < G_N_ELEMENTS (ns_info.nguid); i++)
+ for (i = 0; i < sizeof (ns_info.nguid); i++)
snprintf (info->nguid + i * 2, 3, "%02x", ns_info.nguid[i]);
}
- if (info->eui64 == NULL && ns_info.eui64[G_N_ELEMENTS (ns_info.eui64) - 1] > 0) {
+ if (info->eui64 == NULL && !_nvme_a_is_zero (ns_info.eui64, sizeof (ns_info.eui64))) {
info->eui64 = g_malloc0 (sizeof (ns_info.eui64) * 2 + 1);
- for (i = 0; i < G_N_ELEMENTS (ns_info.eui64); i++)
+ for (i = 0; i < sizeof (ns_info.eui64); i++)
snprintf (info->eui64 + i * 2, 3, "%02x", ns_info.eui64[i]);
}
if (ret_ns_ind == 0) {
diff --git a/tests/nvme_test.py b/tests/nvme_test.py
index a1822be6..a1494d9a 100644
--- a/tests/nvme_test.py
+++ b/tests/nvme_test.py
@@ -116,7 +116,7 @@ class NVMeTestCase(NVMeTest):
self.assertFalse(info.features & BlockDev.NVMEControllerFeature.ENCLOSURE)
self.assertFalse(info.features & BlockDev.NVMEControllerFeature.MGMT_PCIE)
self.assertFalse(info.features & BlockDev.NVMEControllerFeature.MGMT_SMBUS)
- self.assertEqual(info.fguid, "")
+ self.assertIsNone(info.fguid)
self.assertEqual(info.pci_vendor_id, 0)
self.assertEqual(info.pci_subsys_vendor_id, 0)
self.assertIn("Linux", info.model_number)
--
2.39.0

View File

@ -1,144 +0,0 @@
From 77b8d17b0baf96a7a552fb8963afdbe8c3b18da7 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 2 Jun 2021 12:53:24 +0200
Subject: [PATCH 1/4] tests: Make sure the test temp mount is always unmounted
With try-finally the unmount function will always run even if the
test case fails.
---
tests/fs_test.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/tests/fs_test.py b/tests/fs_test.py
index 2233db4f..de685b5f 100644
--- a/tests/fs_test.py
+++ b/tests/fs_test.py
@@ -29,8 +29,10 @@ def check_output(args, ignore_retcode=True):
@contextmanager
def mounted(device, where, ro=False):
mount(device, where, ro)
- yield
- umount(where)
+ try:
+ yield
+ finally:
+ utils.umount(where)
def _get_dosfstools_version():
From aa802b6a2c9038069cfea7f821333367840a43ca Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 2 Jun 2021 13:05:17 +0200
Subject: [PATCH 2/4] tests: Do not check that XFS shrink fails with xfsprogs
>= 5.12
xfsprogs 5.12 now has experimental support for shrinking, we need
more changes to support it properly so just skip this check for
now.
---
tests/fs_test.py | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/tests/fs_test.py b/tests/fs_test.py
index de685b5f..551b6a7b 100644
--- a/tests/fs_test.py
+++ b/tests/fs_test.py
@@ -44,6 +44,14 @@ def _get_dosfstools_version():
return LooseVersion(m.groups()[0])
+def _get_xfs_version():
+ _ret, out, _err = utils.run_command("mkfs.xfs -V")
+ m = re.search(r"mkfs\.xfs version ([\d\.]+)", out)
+ if not m or len(m.groups()) != 1:
+ raise RuntimeError("Failed to determine xfsprogs version from: %s" % out)
+ return LooseVersion(m.groups()[0])
+
+
class FSTestCase(unittest.TestCase):
requested_plugins = BlockDev.plugin_specs_from_names(("fs", "loop"))
@@ -736,9 +744,11 @@ def test_xfs_resize(self):
self.assertEqual(fi.block_size * fi.block_count, 50 * 1024**2)
# (still) impossible to shrink an XFS file system
- with mounted(lv, self.mount_dir):
- with self.assertRaises(GLib.GError):
- succ = BlockDev.fs_xfs_resize(self.mount_dir, 40 * 1024**2 / fi.block_size, None)
+ xfs_version = _get_xfs_version()
+ if xfs_version < LooseVersion("5.1.12"):
+ with mounted(lv, self.mount_dir):
+ with self.assertRaises(GLib.GError):
+ succ = BlockDev.fs_resize(lv, 40 * 1024**2)
run("lvresize -L70M libbd_fs_tests/xfs_test >/dev/null 2>&1")
# should grow
@@ -1503,9 +1513,11 @@ def test_xfs_generic_resize(self):
self.assertEqual(fi.block_size * fi.block_count, 50 * 1024**2)
# (still) impossible to shrink an XFS file system
- with mounted(lv, self.mount_dir):
- with self.assertRaises(GLib.GError):
- succ = BlockDev.fs_resize(lv, 40 * 1024**2)
+ xfs_version = _get_xfs_version()
+ if xfs_version < LooseVersion("5.1.12"):
+ with mounted(lv, self.mount_dir):
+ with self.assertRaises(GLib.GError):
+ succ = BlockDev.fs_resize(lv, 40 * 1024**2)
run("lvresize -L70M libbd_fs_tests/xfs_test >/dev/null 2>&1")
# should grow
From ca01b6021cce3ea6a2318e74de408757f933d947 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 2 Jun 2021 13:06:41 +0200
Subject: [PATCH 3/4] tests: Temporarily skip
test_snapshotcreate_lvorigin_snapshotmerge
With LVM DBus API the lvconvert job is never finished which means
the test run never finishes in our CI.
---
tests/skip.yml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tests/skip.yml b/tests/skip.yml
index 145d321d..e22e712d 100644
--- a/tests/skip.yml
+++ b/tests/skip.yml
@@ -137,3 +137,9 @@
- distro: "fedora"
version: ["31", "32"]
reason: "working with old-style LVM snapshots leads to deadlock in LVM tools"
+
+- test: lvm_dbus_tests.LvmTestLVsnapshots.test_snapshotcreate_lvorigin_snapshotmerge
+ skip_on:
+ - distro: "centos"
+ version: "9"
+ reason: "snapshot merge doesn't work on CentOS 9 Stream with LVM DBus API"
From d0c44cd3d182599433f352901796af7c403239eb Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 2 Jun 2021 13:08:09 +0200
Subject: [PATCH 4/4] Fix skipping tests on Debian testing
Testing now identifies itself as "Debian GNU/Linux 11 (bullseye)"
so the tests that should be skipped on testing needs to be skipped
on "11" too.
---
tests/skip.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/skip.yml b/tests/skip.yml
index e22e712d..4134ee87 100644
--- a/tests/skip.yml
+++ b/tests/skip.yml
@@ -37,7 +37,7 @@
- test: fs_test.MountTest.test_mount_ntfs_ro
skip_on:
- distro: "debian"
- version: ["9", "10", "testing"]
+ version: ["9", "10", "11", "testing"]
reason: "NTFS mounting of read-only devices doesn't work as expected on Debian"
- test: kbd_test.KbdZRAM*

View File

@ -1,80 +0,0 @@
From e0fcbae856454dba9df3f8df800d74fde66731e5 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 31 Aug 2021 14:07:23 +0200
Subject: [PATCH] lvm: Fix reading statistics for VDO pools with VDO 8
The statistics are no longer available in /sys/kvdo, in the latest
version of kvdo we need to use /sys/block/<pool>/vdo/statistics.
Resolves: rhbz#1994220
---
src/plugins/vdo_stats.c | 42 +++++++++++++++++++++++++++++++++++++----
1 file changed, 38 insertions(+), 4 deletions(-)
diff --git a/src/plugins/vdo_stats.c b/src/plugins/vdo_stats.c
index ed04b51..2e244aa 100644
--- a/src/plugins/vdo_stats.c
+++ b/src/plugins/vdo_stats.c
@@ -133,6 +133,23 @@ static void add_computed_stats (GHashTable *stats) {
add_journal_stats (stats);
}
+static gchar* _dm_node_from_name (const gchar *map_name, GError **error) {
+ gchar *dev_path = NULL;
+ gchar *ret = NULL;
+ gchar *dev_mapper_path = g_strdup_printf ("/dev/mapper/%s", map_name);
+
+ dev_path = bd_utils_resolve_device (dev_mapper_path, error);
+ g_free (dev_mapper_path);
+ if (!dev_path)
+ /* error is already populated */
+ return NULL;
+
+ ret = g_path_get_basename (dev_path);
+ g_free (dev_path);
+
+ return ret;
+}
+
GHashTable __attribute__ ((visibility ("hidden")))
*vdo_get_stats_full (const gchar *name, GError **error) {
GHashTable *stats;
@@ -141,14 +158,31 @@ GHashTable __attribute__ ((visibility ("hidden")))
const gchar *direntry;
gchar *s;
gchar *val = NULL;
+ g_autofree gchar *dm_node = NULL;
- /* TODO: does the `name` need to be escaped? */
- stats_dir = g_build_path (G_DIR_SEPARATOR_S, VDO_SYS_PATH, name, "statistics", NULL);
+ /* try "new" (kvdo >= 8) path first -- /sys/block/dm-X/vdo/statistics */
+ dm_node = _dm_node_from_name (name, error);
+ if (dm_node == NULL) {
+ g_prefix_error (error, "Failed to get DM node for %s: ", name);
+ return NULL;
+ }
+
+ stats_dir = g_build_path (G_DIR_SEPARATOR_S, "/sys/block", dm_node, "vdo/statistics", NULL);
dir = g_dir_open (stats_dir, 0, error);
if (dir == NULL) {
- g_prefix_error (error, "Error reading statistics from %s: ", stats_dir);
+ g_debug ("Failed to read VDO stats using the new API, falling back to %s: %s",
+ VDO_SYS_PATH, (*error)->message);
g_free (stats_dir);
- return NULL;
+ g_clear_error (error);
+
+ /* lets try /sys/kvdo */
+ stats_dir = g_build_path (G_DIR_SEPARATOR_S, VDO_SYS_PATH, name, "statistics", NULL);
+ dir = g_dir_open (stats_dir, 0, error);
+ if (dir == NULL) {
+ g_prefix_error (error, "Error reading statistics from %s: ", stats_dir);
+ g_free (stats_dir);
+ return NULL;
+ }
}
stats = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
--
2.31.1

View File

@ -1,30 +0,0 @@
From 940346f14ee5644f2593817b4196c18de8a713f0 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 22 Nov 2021 14:16:02 +0100
Subject: [PATCH] vdo_stats: Default to 100 % savings for invalid savings
values
We are currently using "-1" when VDO logical_blocks_used is 0
which doesn't match the LVM logic which returns 100 so to make
both values in vdo_info and vdo_stats equal we should return 100
in this case too.
---
src/plugins/vdo_stats.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/vdo_stats.c b/src/plugins/vdo_stats.c
index 3ec2d60..f3f0390 100644
--- a/src/plugins/vdo_stats.c
+++ b/src/plugins/vdo_stats.c
@@ -96,7 +96,7 @@ static void add_block_stats (GHashTable *stats) {
g_hash_table_replace (stats, g_strdup ("oneKBlocksUsed"), g_strdup_printf ("%"G_GINT64_FORMAT, (data_blocks_used + overhead_blocks_used) * block_size / 1024));
g_hash_table_replace (stats, g_strdup ("oneKBlocksAvailable"), g_strdup_printf ("%"G_GINT64_FORMAT, (physical_blocks - data_blocks_used - overhead_blocks_used) * block_size / 1024));
g_hash_table_replace (stats, g_strdup ("usedPercent"), g_strdup_printf ("%.0f", 100.0 * (gfloat) (data_blocks_used + overhead_blocks_used) / (gfloat) physical_blocks + 0.5));
- savings = (logical_blocks_used > 0) ? (gint64) (100.0 * (gfloat) (logical_blocks_used - data_blocks_used) / (gfloat) logical_blocks_used) : -1;
+ savings = (logical_blocks_used > 0) ? (gint64) (100.0 * (gfloat) (logical_blocks_used - data_blocks_used) / (gfloat) logical_blocks_used) : 100;
g_hash_table_replace (stats, g_strdup ("savings"), g_strdup_printf ("%"G_GINT64_FORMAT, savings));
if (savings >= 0)
g_hash_table_replace (stats, g_strdup ("savingPercent"), g_strdup_printf ("%"G_GINT64_FORMAT, savings));
--
2.31.1

View File

@ -1,278 +0,0 @@
From d0ba031e679d480855bea61060acea597d5ffbbd Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 15 Dec 2021 14:14:19 +0100
Subject: [PATCH 1/2] tests: Wait for raid and mirrored LVs to be synced before
removing
Resolves: rhbz#2030647
---
tests/lvm_dbus_tests.py | 31 +++++++++++++++++++++++++------
tests/lvm_test.py | 31 +++++++++++++++++++++++++------
2 files changed, 50 insertions(+), 12 deletions(-)
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index 5516afe..5ce653e 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -7,6 +7,8 @@ import six
import re
import shutil
import subprocess
+import time
+from contextlib import contextmanager
from distutils.version import LooseVersion
from itertools import chain
@@ -18,6 +20,21 @@ sb = dbus.SystemBus()
lvm_dbus_running = any("lvmdbus" in name for name in chain(sb.list_names(), sb.list_activatable_names()))
+@contextmanager
+def wait_for_sync(vg_name, lv_name):
+ try:
+ yield
+ finally:
+ time.sleep(2)
+ while True:
+ ret, out, _err = run_command("LC_ALL=C lvs -o copy_percent --noheadings %s/%s" % (vg_name, lv_name))
+ if ret != 0:
+ break
+ if int(float(out)) == 100:
+ break
+ time.sleep(1)
+
+
class LVMTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
@@ -801,9 +818,10 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
succ = BlockDev.lvm_lvremove("testVG", "testLV", True, None)
self.assertTrue(succ)
- # try to create a mirrored LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None)
- self.assertTrue(succ)
+ with wait_for_sync("testVG", "testLV"):
+ # try to create a mirrored LV
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None)
+ self.assertTrue(succ)
# verify that the LV has the requested segtype
info = BlockDev.lvm_lvinfo("testVG", "testLV")
@@ -812,9 +830,10 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
succ = BlockDev.lvm_lvremove("testVG", "testLV", True, None)
self.assertTrue(succ)
- # try to create a raid1 LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None)
- self.assertTrue(succ)
+ with wait_for_sync("testVG", "testLV"):
+ # try to create a raid1 LV
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None)
+ self.assertTrue(succ)
# verify that the LV has the requested segtype
info = BlockDev.lvm_lvinfo("testVG", "testLV")
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index e349817..12b78ca 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -7,12 +7,29 @@ import six
import re
import shutil
import subprocess
+import time
+from contextlib import contextmanager
from distutils.version import LooseVersion
from utils import create_sparse_tempfile, create_lio_device, delete_lio_device, fake_utils, fake_path, TestTags, tag_test, run_command, read_file
from gi.repository import BlockDev, GLib
+@contextmanager
+def wait_for_sync(vg_name, lv_name):
+ try:
+ yield
+ finally:
+ time.sleep(2)
+ while True:
+ info = BlockDev.lvm_lvinfo(vg_name, lv_name)
+ if not info:
+ break
+ if info.copy_percent == 100:
+ break
+ time.sleep(1)
+
+
class LVMTestCase(unittest.TestCase):
@classmethod
@@ -737,9 +754,10 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
succ = BlockDev.lvm_lvremove("testVG", "testLV", True, None)
self.assertTrue(succ)
- # try to create a mirrored LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None)
- self.assertTrue(succ)
+ with wait_for_sync("testVG", "testLV"):
+ # try to create a mirrored LV
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None)
+ self.assertTrue(succ)
# verify that the LV has the requested segtype
info = BlockDev.lvm_lvinfo("testVG", "testLV")
@@ -748,9 +766,10 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
succ = BlockDev.lvm_lvremove("testVG", "testLV", True, None)
self.assertTrue(succ)
- # try to create a raid1 LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None)
- self.assertTrue(succ)
+ with wait_for_sync("testVG", "testLV"):
+ # try to create a raid1 LV
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None)
+ self.assertTrue(succ)
# verify that the LV has the requested segtype
info = BlockDev.lvm_lvinfo("testVG", "testLV")
--
2.31.1
From 36dbac970bc4a052dbd97f51eb47379036d15b6e Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 16 Dec 2021 12:27:33 +0100
Subject: [PATCH 2/2] tests: Make smaller images for test_lvcreate_type
We are now waiting for the initial resync for the RAID/mirror LVs
which means we are trying to overwrite the entire 1 GB image which
doesn't fit in /tmp on our CI machines.
---
tests/lvm_dbus_tests.py | 16 +++++++++++-----
tests/lvm_test.py | 15 ++++++++++-----
2 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/tests/lvm_dbus_tests.py b/tests/lvm_dbus_tests.py
index 5ce653e..723aabb 100644
--- a/tests/lvm_dbus_tests.py
+++ b/tests/lvm_dbus_tests.py
@@ -313,14 +313,17 @@ class LvmNoDevTestCase(LVMTestCase):
@unittest.skipUnless(lvm_dbus_running, "LVM DBus not running")
class LvmPVonlyTestCase(LVMTestCase):
+
+ _sparse_size = 1024**3
+
# :TODO:
# * test pvmove (must create two PVs, a VG, a VG and some data in it
# first)
# * some complex test for pvs, vgs, lvs, pvinfo, vginfo and lvinfo
def setUp(self):
self.addCleanup(self._clean_up)
- self.dev_file = create_sparse_tempfile("lvm_test", 1024**3)
- self.dev_file2 = create_sparse_tempfile("lvm_test", 1024**3)
+ self.dev_file = create_sparse_tempfile("lvm_test", self._sparse_size)
+ self.dev_file2 = create_sparse_tempfile("lvm_test", self._sparse_size)
try:
self.loop_dev = create_lio_device(self.dev_file)
except RuntimeError as e:
@@ -795,6 +798,9 @@ class LvmTestLVcreateWithExtra(LvmPVVGLVTestCase):
@unittest.skipUnless(lvm_dbus_running, "LVM DBus not running")
class LvmTestLVcreateType(LvmPVVGLVTestCase):
+
+ _sparse_size = 200 * 1024**2
+
def test_lvcreate_type(self):
"""Verify it's possible to create LVs with various types"""
@@ -808,7 +814,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
self.assertTrue(succ)
# try to create a striped LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "striped", [self.loop_dev, self.loop_dev2], None)
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "striped", [self.loop_dev, self.loop_dev2], None)
self.assertTrue(succ)
# verify that the LV has the requested segtype
@@ -820,7 +826,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
with wait_for_sync("testVG", "testLV"):
# try to create a mirrored LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None)
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None)
self.assertTrue(succ)
# verify that the LV has the requested segtype
@@ -832,7 +838,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
with wait_for_sync("testVG", "testLV"):
# try to create a raid1 LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None)
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None)
self.assertTrue(succ)
# verify that the LV has the requested segtype
diff --git a/tests/lvm_test.py b/tests/lvm_test.py
index 12b78ca..97f6c69 100644
--- a/tests/lvm_test.py
+++ b/tests/lvm_test.py
@@ -302,14 +302,17 @@ class LvmNoDevTestCase(LVMTestCase):
BlockDev.lvm_cache_get_mode_from_str("bla")
class LvmPVonlyTestCase(LVMTestCase):
+
+ _sparse_size = 1024**3
+
# :TODO:
# * test pvmove (must create two PVs, a VG, a VG and some data in it
# first)
# * some complex test for pvs, vgs, lvs, pvinfo, vginfo and lvinfo
def setUp(self):
self.addCleanup(self._clean_up)
- self.dev_file = create_sparse_tempfile("lvm_test", 1024**3)
- self.dev_file2 = create_sparse_tempfile("lvm_test", 1024**3)
+ self.dev_file = create_sparse_tempfile("lvm_test", self._sparse_size)
+ self.dev_file2 = create_sparse_tempfile("lvm_test", self._sparse_size)
try:
self.loop_dev = create_lio_device(self.dev_file)
except RuntimeError as e:
@@ -731,6 +734,8 @@ class LvmTestLVcreateWithExtra(LvmPVVGLVTestCase):
self.assertTrue(succ)
class LvmTestLVcreateType(LvmPVVGLVTestCase):
+ _sparse_size = 200 * 1024**2
+
def test_lvcreate_type(self):
"""Verify it's possible to create LVs with various types"""
@@ -744,7 +749,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
self.assertTrue(succ)
# try to create a striped LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "striped", [self.loop_dev, self.loop_dev2], None)
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "striped", [self.loop_dev, self.loop_dev2], None)
self.assertTrue(succ)
# verify that the LV has the requested segtype
@@ -756,7 +761,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
with wait_for_sync("testVG", "testLV"):
# try to create a mirrored LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None)
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "mirror", [self.loop_dev, self.loop_dev2], None)
self.assertTrue(succ)
# verify that the LV has the requested segtype
@@ -768,7 +773,7 @@ class LvmTestLVcreateType(LvmPVVGLVTestCase):
with wait_for_sync("testVG", "testLV"):
# try to create a raid1 LV
- succ = BlockDev.lvm_lvcreate("testVG", "testLV", 512 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None)
+ succ = BlockDev.lvm_lvcreate("testVG", "testLV", 100 * 1024**2, "raid1", [self.loop_dev, self.loop_dev2], None)
self.assertTrue(succ)
# verify that the LV has the requested segtype
--
2.31.1

View File

@ -1,71 +0,0 @@
From 8978b7e6913f904bea887b0c542f9f82c969c2cf Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Wed, 1 Sep 2021 11:36:29 +0200
Subject: [PATCH] tests: Lower expected free space on newly created Ext
filesystems
With e2fsprogs 1.46.4 we now see less than 90 % of free blocks on
newly created devices in our tests.
---
tests/fs_test.py | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/tests/fs_test.py b/tests/fs_test.py
index 551b6a7b..6b0134bf 100644
--- a/tests/fs_test.py
+++ b/tests/fs_test.py
@@ -425,8 +425,8 @@ def _test_ext_get_info(self, mkfs_function, info_function):
self.assertTrue(fi)
self.assertEqual(fi.block_size, 1024)
self.assertEqual(fi.block_count, 100 * 1024**2 / 1024)
- # at least 90 % should be available, so it should be reported
- self.assertGreater(fi.free_blocks, 0.90 * 100 * 1024**2 / 1024)
+ # at least 80 % should be available, so it should be reported
+ self.assertGreater(fi.free_blocks, 0.80 * 100 * 1024**2 / 1024)
self.assertEqual(fi.label, "")
# should be an non-empty string
self.assertTrue(fi.uuid)
@@ -436,8 +436,8 @@ def _test_ext_get_info(self, mkfs_function, info_function):
fi = BlockDev.fs_ext4_get_info(self.loop_dev)
self.assertEqual(fi.block_size, 1024)
self.assertEqual(fi.block_count, 100 * 1024**2 / 1024)
- # at least 90 % should be available, so it should be reported
- self.assertGreater(fi.free_blocks, 0.90 * 100 * 1024**2 / 1024)
+ # at least 80 % should be available, so it should be reported
+ self.assertGreater(fi.free_blocks, 0.80 * 100 * 1024**2 / 1024)
self.assertEqual(fi.label, "")
# should be an non-empty string
self.assertTrue(fi.uuid)
@@ -515,8 +515,8 @@ def _test_ext_resize(self, mkfs_function, info_function, resize_function):
self.assertTrue(fi)
self.assertEqual(fi.block_size, 1024)
self.assertEqual(fi.block_count, 100 * 1024**2 / 1024)
- # at least 90 % should be available, so it should be reported
- self.assertGreater(fi.free_blocks, 0.90 * 100 * 1024**2 / 1024)
+ # at least 80 % should be available, so it should be reported
+ self.assertGreater(fi.free_blocks, 0.80 * 100 * 1024**2 / 1024)
succ = resize_function(self.loop_dev, 50 * 1024**2, None)
self.assertTrue(succ)
@@ -532,8 +532,8 @@ def _test_ext_resize(self, mkfs_function, info_function, resize_function):
self.assertTrue(fi)
self.assertEqual(fi.block_size, 1024)
self.assertEqual(fi.block_count, 100 * 1024**2 / 1024)
- # at least 90 % should be available, so it should be reported
- self.assertGreater(fi.free_blocks, 0.90 * 100 * 1024**2 / 1024)
+ # at least 80 % should be available, so it should be reported
+ self.assertGreater(fi.free_blocks, 0.80 * 100 * 1024**2 / 1024)
# resize again
succ = resize_function(self.loop_dev, 50 * 1024**2, None)
@@ -550,8 +550,8 @@ def _test_ext_resize(self, mkfs_function, info_function, resize_function):
self.assertTrue(fi)
self.assertEqual(fi.block_size, 1024)
self.assertEqual(fi.block_count, 100 * 1024**2 / 1024)
- # at least 90 % should be available, so it should be reported
- self.assertGreater(fi.free_blocks, 0.90 * 100 * 1024**2 / 1024)
+ # at least 80 % should be available, so it should be reported
+ self.assertGreater(fi.free_blocks, 0.80 * 100 * 1024**2 / 1024)
def test_ext2_resize(self):
"""Verify that it is possible to resize an ext2 file system"""

View File

@ -1,275 +0,0 @@
From 9bcaddbe97067f10e643a7d99fa13716126f6e60 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 25 Aug 2020 14:09:18 +0200
Subject: [PATCH 1/4] mdraid: Do not ignore errors from bd_md_canonicalize_uuid
in bd_md_examine
---
src/plugins/mdraid.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
index b97bc641..d41b6372 100644
--- a/src/plugins/mdraid.c
+++ b/src/plugins/mdraid.c
@@ -983,12 +983,24 @@ BDMDExamineData* bd_md_examine (const gchar *device, GError **error) {
orig_data = ret->uuid;
if (orig_data) {
ret->uuid = bd_md_canonicalize_uuid (orig_data, error);
+ if (!ret->uuid) {
+ g_prefix_error (error, "Failed to canonicalize MD UUID '%s': ", orig_data);
+ g_free (orig_data);
+ bd_md_examine_data_free (ret);
+ return NULL;
+ }
g_free (orig_data);
}
orig_data = ret->dev_uuid;
if (orig_data) {
ret->dev_uuid = bd_md_canonicalize_uuid (orig_data, error);
+ if (!ret->uuid) {
+ g_prefix_error (error, "Failed to canonicalize MD UUID '%s': ", orig_data);
+ g_free (orig_data);
+ bd_md_examine_data_free (ret);
+ return NULL;
+ }
g_free (orig_data);
}
--
2.37.1
From 1805734e8315d5fb73f036dae043312c88f3c3ec Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 25 Aug 2020 14:12:52 +0200
Subject: [PATCH 2/4] mdraid: Try harder to get container UUID in bd_md_examine
For containers UUID is not printed in 'mdadm --examine' but it is
printed when using the '--export' option.
---
src/plugins/mdraid.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
index d41b6372..3a23cf2e 100644
--- a/src/plugins/mdraid.c
+++ b/src/plugins/mdraid.c
@@ -1023,6 +1023,17 @@ BDMDExamineData* bd_md_examine (const gchar *device, GError **error) {
value++;
g_free (ret->level);
ret->level = g_strdup (value);
+ } else if (!ret->uuid && g_str_has_prefix (output_fields[i], "MD_UUID=")) {
+ value = strchr (output_fields[i], '=');
+ value++;
+ ret->uuid = bd_md_canonicalize_uuid (value, error);
+ if (!ret->uuid) {
+ g_prefix_error (error, "Failed to canonicalize MD UUID '%s': ", orig_data);
+ g_free (orig_data);
+ bd_md_examine_data_free (ret);
+ g_strfreev (output_fields);
+ return NULL;
+ }
}
g_strfreev (output_fields);
--
2.37.1
From 166756338f90d90b32ae0989db706dd52f7df234 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 4 Aug 2022 12:47:53 +0200
Subject: [PATCH 3/4] mdraid: Try harder to get container UUID in bd_md_detail
Similarly to bd_md_examine (see a10ad4e0), "mdadm --detail"
doesn't contain container UUID, we need to need "--export" for
that.
---
src/plugins/mdraid.c | 43 +++++++++++++++++++++++++++++++++++--------
1 file changed, 35 insertions(+), 8 deletions(-)
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
index 3a23cf2e..67bdc1f9 100644
--- a/src/plugins/mdraid.c
+++ b/src/plugins/mdraid.c
@@ -1093,13 +1093,16 @@ BDMDExamineData* bd_md_examine (const gchar *device, GError **error) {
* Tech category: %BD_MD_TECH_MDRAID-%BD_MD_TECH_MODE_QUERY
*/
BDMDDetailData* bd_md_detail (const gchar *raid_spec, GError **error) {
- const gchar *argv[] = {"mdadm", "--detail", NULL, NULL};
+ const gchar *argv[] = {"mdadm", "--detail", NULL, NULL, NULL};
gchar *output = NULL;
gboolean success = FALSE;
GHashTable *table = NULL;
guint num_items = 0;
gchar *orig_uuid = NULL;
- gchar *mdadm_spec = NULL;
+ g_autofree gchar *mdadm_spec = NULL;
+ gchar *value = NULL;
+ gchar **output_fields = NULL;
+ guint i = 0;
BDMDDetailData *ret = NULL;
if (!check_deps (&avail_deps, DEPS_MDADM_MASK, deps, DEPS_LAST, &deps_check_lock, error))
@@ -1113,16 +1116,13 @@ BDMDDetailData* bd_md_detail (const gchar *raid_spec, GError **error) {
argv[2] = mdadm_spec;
success = bd_utils_exec_and_capture_output (argv, NULL, &output, error);
- if (!success) {
- g_free (mdadm_spec);
+ if (!success)
/* error is already populated */
return NULL;
- }
table = parse_mdadm_vars (output, "\n", ":", &num_items);
g_free (output);
if (!table || (num_items == 0)) {
- g_free (mdadm_spec);
/* something bad happened or some expected items were missing */
g_set_error (error, BD_MD_ERROR, BD_MD_ERROR_PARSE, "Failed to parse mddetail data");
if (table)
@@ -1132,7 +1132,6 @@ BDMDDetailData* bd_md_detail (const gchar *raid_spec, GError **error) {
ret = get_detail_data_from_table (table, TRUE);
if (!ret) {
- g_free (mdadm_spec);
g_set_error (error, BD_MD_ERROR, BD_MD_ERROR_PARSE, "Failed to get mddetail data");
return NULL;
}
@@ -1145,7 +1144,35 @@ BDMDDetailData* bd_md_detail (const gchar *raid_spec, GError **error) {
g_free (orig_uuid);
}
- g_free (mdadm_spec);
+ if (!ret->uuid) {
+ argv[2] = "--export";
+ argv[3] = mdadm_spec;
+ success = bd_utils_exec_and_capture_output (argv, NULL, &output, error);
+ if (!success) {
+ /* error is already populated */
+ bd_md_detail_data_free (ret);
+ return NULL;
+ }
+
+ /* try to get a better information about RAID level because it may be
+ missing in the output without --export */
+ output_fields = g_strsplit (output, "\n", 0);
+ g_free (output);
+ output = NULL;
+ for (i = 0; (i < g_strv_length (output_fields) - 1); i++)
+ if (g_str_has_prefix (output_fields[i], "MD_UUID=")) {
+ value = strchr (output_fields[i], '=');
+ value++;
+ ret->uuid = bd_md_canonicalize_uuid (value, error);
+ if (!ret->uuid) {
+ g_prefix_error (error, "Failed to canonicalize MD UUID '%s': ", value);
+ bd_md_detail_data_free (ret);
+ g_strfreev (output_fields);
+ return NULL;
+ }
+ }
+ g_strfreev (output_fields);
+ }
return ret;
}
--
2.37.1
From 25dd2f8c7cc3cf540902fc40e808faabda3c691a Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 4 Aug 2022 12:51:48 +0200
Subject: [PATCH 4/4] Add a test case for DDF arrays/containers
---
tests/mdraid_test.py | 51 ++++++++++++++++++++++++++++++++++++++++----
1 file changed, 47 insertions(+), 4 deletions(-)
diff --git a/tests/mdraid_test.py b/tests/mdraid_test.py
index 0b2bdc9b..38f43a0d 100644
--- a/tests/mdraid_test.py
+++ b/tests/mdraid_test.py
@@ -6,7 +6,7 @@ from contextlib import contextmanager
import overrides_hack
import six
-from utils import create_sparse_tempfile, create_lio_device, delete_lio_device, fake_utils, fake_path, TestTags, tag_test
+from utils import create_sparse_tempfile, create_lio_device, delete_lio_device, fake_utils, fake_path, TestTags, tag_test, run_command
from gi.repository import BlockDev, GLib
@@ -90,14 +90,16 @@ class MDNoDevTestCase(MDTest):
class MDTestCase(MDTest):
+ _sparse_size = 10 * 1024**2
+
def setUp(self):
if os.uname()[-1] == "i686":
self.skipTest("Skipping hanging MD RAID tests on i686")
self.addCleanup(self._clean_up)
- self.dev_file = create_sparse_tempfile("md_test", 10 * 1024**2)
- self.dev_file2 = create_sparse_tempfile("md_test", 10 * 1024**2)
- self.dev_file3 = create_sparse_tempfile("md_test", 10 * 1024**2)
+ self.dev_file = create_sparse_tempfile("md_test", self._sparse_size)
+ self.dev_file2 = create_sparse_tempfile("md_test", self._sparse_size)
+ self.dev_file3 = create_sparse_tempfile("md_test", self._sparse_size)
try:
self.loop_dev = create_lio_device(self.dev_file)
@@ -586,6 +588,47 @@ class MDTestRequestSyncAction(MDTestCase):
action = f.read().strip()
self.assertEqual(action, "check")
+
+class MDTestDDFRAID(MDTestCase):
+
+ _sparse_size = 50 * 1024**2
+
+ def _clean_up(self):
+ try:
+ BlockDev.md_deactivate("bd_test_ddf")
+ except:
+ pass
+ try:
+ BlockDev.md_deactivate(BlockDev.md_node_from_name("bd_test_ddf"))
+ except:
+ pass
+
+ super(MDTestDDFRAID, self)._clean_up()
+
+ def test_examine_ddf_container(self):
+ succ = BlockDev.md_create("bd_test_md", "container",
+ [self.loop_dev, self.loop_dev2],
+ 0, "ddf", False)
+ self.assertTrue(succ)
+
+ # we cannot create the array with libblockdev because we cannot pass the --raid-devices option
+ ret, _out, err = run_command("mdadm --create /dev/md/bd_test_ddf --run --level=raid0 --raid-devices=2 /dev/md/bd_test_md")
+ self.assertEqual(ret, 0, msg="Failed to create RAID for DDF test: %s" % err)
+
+ edata = BlockDev.md_examine(self.loop_dev)
+ self.assertIsNotNone(edata)
+ self.assertIsNotNone(edata.uuid)
+ self.assertEqual(edata.level, "container")
+ self.assertEqual(edata.metadata, "ddf")
+
+ ddata = BlockDev.md_detail("bd_test_md")
+ self.assertIsNotNone(ddata)
+ self.assertIsNotNone(ddata.uuid)
+ self.assertEqual(ddata.uuid, edata.uuid)
+ self.assertEqual(ddata.level, "container")
+ self.assertEqual(ddata.metadata, "ddf")
+
+
class FakeMDADMutilTest(MDTest):
# no setUp nor tearDown needed, we are gonna use fake utils
@tag_test(TestTags.NOSTORAGE)
--
2.37.1

View File

@ -1,53 +0,0 @@
From 04a8baf87820d8a13926e0b8db5cfa55f9f04420 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:26:57 +0200
Subject: [PATCH 1/2] mdraid: Fix copy-paste error when checking return value
---
src/plugins/mdraid.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
index 67bdc1f9..48abb72f 100644
--- a/src/plugins/mdraid.c
+++ b/src/plugins/mdraid.c
@@ -995,7 +995,7 @@ BDMDExamineData* bd_md_examine (const gchar *device, GError **error) {
orig_data = ret->dev_uuid;
if (orig_data) {
ret->dev_uuid = bd_md_canonicalize_uuid (orig_data, error);
- if (!ret->uuid) {
+ if (!ret->dev_uuid) {
g_prefix_error (error, "Failed to canonicalize MD UUID '%s': ", orig_data);
g_free (orig_data);
bd_md_examine_data_free (ret);
--
2.37.1
From 16a34bc5ddb19bc6dd1a845d87e8b748cbaedd2c Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Fri, 25 Sep 2020 14:41:20 +0200
Subject: [PATCH 2/2] mdraid: Fix use after free
Another copy-paste error.
---
src/plugins/mdraid.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/plugins/mdraid.c b/src/plugins/mdraid.c
index 48abb72f..75143ea7 100644
--- a/src/plugins/mdraid.c
+++ b/src/plugins/mdraid.c
@@ -1028,8 +1028,7 @@ BDMDExamineData* bd_md_examine (const gchar *device, GError **error) {
value++;
ret->uuid = bd_md_canonicalize_uuid (value, error);
if (!ret->uuid) {
- g_prefix_error (error, "Failed to canonicalize MD UUID '%s': ", orig_data);
- g_free (orig_data);
+ g_prefix_error (error, "Failed to canonicalize MD UUID '%s': ", value);
bd_md_examine_data_free (ret);
g_strfreev (output_fields);
return NULL;
--
2.37.1

View File

@ -1,45 +0,0 @@
From 33b1cda56fdc76fdf96fe409f0308e1913965d16 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 26 May 2022 12:44:47 +0200
Subject: [PATCH] tests: Fix expected extended partition flags with new parted
Latest libparted now creates all extended partitions as
PARTITION_EXT_LBA with the lba flag enabled by default.
---
tests/part_test.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tests/part_test.py b/tests/part_test.py
index 7408b479..762dc534 100644
--- a/tests/part_test.py
+++ b/tests/part_test.py
@@ -356,7 +356,7 @@ class PartCreatePartFullCase(PartTestCase):
# as is the start of the first part from the start of the disk
self.assertTrue(abs(ps4.start - (ps3.start + ps3.size + 1)) < ps.start)
self.assertEqual(ps4.size, 10 * 1024**2)
- self.assertEqual(ps4.flags, 0) # no flags (combination of bit flags)
+ self.assertIn(ps4.flags, [0, 128]) # no flags or extended+lba (combination of bit flags)
# no more primary partitions allowed in the MSDOS table
with self.assertRaises(GLib.GError):
@@ -404,7 +404,7 @@ class PartCreatePartFullCase(PartTestCase):
# as is the start of the first part from the start of the disk
self.assertTrue(abs(ps3.start - (ps2.start + ps2.size + 1)) < ps.start)
self.assertEqual(ps3.size, 30 * 1024**2)
- self.assertEqual(ps3.flags, 0) # no flags (combination of bit flags)
+ self.assertIn(ps3.flags, [0, 128]) # no flags or extended+lba (combination of bit flags)
# the logical partition has number 5 even though the extended partition
# has number 3
@@ -871,7 +871,7 @@ class PartGetPartByPos(PartTestCase):
# as is the start of the first part from the start of the disk
self.assertTrue(abs(ps3.start - (ps2.start + ps2.size + 1)) < ps.start)
self.assertEqual(ps3.size, 35 * 1024**2)
- self.assertEqual(ps3.flags, 0) # no flags (combination of bit flags)
+ self.assertIn(ps3.flags, [0, 128]) # no flags or extended+lba (combination of bit flags)
# the logical partition has number 5 even though the extended partition
# has number 3
--
2.37.1

View File

@ -20,6 +20,7 @@
%define with_escrow 1
%define with_dmraid 1
%define with_tools 1
%define with_nvme 1
# python2 is not available on RHEL > 7 and not needed on Fedora > 29
%if 0%{?rhel} > 7 || 0%{?fedora} > 29 || %{with_python2} == 0
@ -120,32 +121,25 @@
%if %{with_gi} != 1
%define gi_copts --disable-introspection
%endif
%if %{with_nvme} != 1
%define nvme_copts --without-nvme
%endif
%define configure_opts %{?python2_copts} %{?python3_copts} %{?bcache_copts} %{?lvm_dbus_copts} %{?btrfs_copts} %{?crypto_copts} %{?dm_copts} %{?loop_copts} %{?lvm_copts} %{?lvm_dbus_copts} %{?mdraid_copts} %{?mpath_copts} %{?swap_copts} %{?kbd_copts} %{?part_copts} %{?fs_copts} %{?nvdimm_copts} %{?vdo_copts} %{?tools_copts} %{?gi_copts}
%define configure_opts %{?python2_copts} %{?python3_copts} %{?bcache_copts} %{?lvm_dbus_copts} %{?btrfs_copts} %{?crypto_copts} %{?dm_copts} %{?loop_copts} %{?lvm_copts} %{?lvm_dbus_copts} %{?mdraid_copts} %{?mpath_copts} %{?swap_copts} %{?kbd_copts} %{?part_copts} %{?fs_copts} %{?nvdimm_copts} %{?nvme_copts} %{?vdo_copts} %{?tools_copts} %{?gi_copts}
Name: libblockdev
Version: 2.25
Release: 14%{?dist}
Version: 2.28
Release: 4%{?dist}
Summary: A library for low-level manipulation with block devices
License: LGPLv2+
URL: https://github.com/storaged-project/libblockdev
Source0: https://github.com/storaged-project/libblockdev/releases/download/%{version}-%{release}/%{name}-%{version}.tar.gz
Patch0: libblockdev-gcc11.patch
Patch1: 0001-Fix-comparing-DM-RAID-member-devices-UUID.patch
Patch2: 0002-Fix-default-key-size-for-non-XTS-ciphers.patch
Patch3: 0003-Memory-leaks-fixes-backport.patch
Patch4: 0004-Adapt-to-dosfstools-4.2-changes.patch
Patch5: 0005-Add-workarounds-for-some-LVM-test-issues.patch
Patch6: 0006-Misc-test-fixes-backport.patch
Patch7: 0007-lvm-devices-file-support.patch
Patch8: 0008-lvm-Fix-reading-statistics-for-VDO-pools-with-VDO-8.patch
Patch9: 0009-vdo_stats-Default-to-100-savings-for-invalid-savings.patch
Patch10: 0010-Add-support-for-creating-and-activating-integrity-de.patch
Patch11: 0011-tests-Wait-for-raid-and-mirrored-LVs-to-be-synced-be.patch
Patch12: 0012-tests-Lower-expected-free-space-on-newly-created-Ext-filesystems.patch
Patch13: 0013-ddf-mdadm-uuid-parse-fix.patch
Patch14: 0014-mdraid-Fix-copy-paste-error-when-checking-return-val.patch
Patch15: 0015-tests-Fix-expected-extended-partition-flags-with-new.patch
Patch1: 0001-lvm-devices-file-support.patch
Patch2: 0002-Add-support-for-creating-and-activating-integrity-de.patch
Patch3: 0003-NVMe-plugin-backport.patch
Patch4: 0004-Fix-double-free-in-write_escrow_data_file.patch
Patch5: 0005-nvme-Fix-namespace-identifiers.patch
BuildRequires: make
BuildRequires: glib2-devel
@ -167,6 +161,8 @@ BuildRequires: gtk-doc
BuildRequires: glib2-doc
BuildRequires: autoconf-archive
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
# Needed for the escrow tests in tests/crypto_test.py, but not used to build
# BuildRequires: volume_key
# BuildRequires: nss-tools
@ -188,6 +184,7 @@ no information about VGs when creating an LV).
Summary: Development files for libblockdev
Requires: %{name}%{?_isa} = %{version}-%{release}
Requires: glib2-devel
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
%description devel
This package contains header files and pkg-config files needed for development
@ -244,7 +241,7 @@ with the libblockdev-utils library.
%package btrfs
BuildRequires: libbytesize-devel
Summary: The BTRFS plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: btrfs-progs
%description btrfs
@ -255,7 +252,7 @@ providing the BTRFS-related functionality.
Summary: Development files for the libblockdev-btrfs plugin/library
Requires: %{name}-btrfs%{?_isa} = %{version}-%{release}
Requires: glib2-devel
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
%description btrfs-devel
This package contains header files and pkg-config files needed for development
@ -265,6 +262,7 @@ with the libblockdev-btrfs plugin/library.
%if %{with_crypto}
%package crypto
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
BuildRequires: cryptsetup-devel
BuildRequires: libblkid-devel
@ -282,6 +280,7 @@ providing the functionality related to encrypted devices (LUKS).
%package crypto-devel
Summary: Development files for the libblockdev-crypto plugin/library
Requires: %{name}-crypto%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description crypto-devel
@ -298,7 +297,7 @@ BuildRequires: dmraid-devel
%endif
BuildRequires: systemd-devel
Summary: The Device Mapper plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: device-mapper
%if %{with_dmraid}
Requires: dmraid
@ -317,7 +316,7 @@ Requires: systemd-devel
%if %{with_dmraid}
Requires: dmraid-devel
%endif
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
%description dm-devel
This package contains header files and pkg-config files needed for development
@ -331,7 +330,7 @@ BuildRequires: parted-devel
BuildRequires: libblkid-devel
BuildRequires: libmount-devel
Summary: The FS plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
%description fs
The libblockdev library plugin (and in the same time a standalone library)
@ -340,7 +339,7 @@ providing the functionality related to operations with file systems.
%package fs-devel
Summary: Development files for the libblockdev-fs plugin/library
Requires: %{name}-fs%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
Requires: xfsprogs
Requires: dosfstools
@ -355,7 +354,7 @@ with the libblockdev-fs plugin/library.
%package kbd
BuildRequires: libbytesize-devel
Summary: The KBD plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
%if %{with_bcache}
Requires: bcache-tools >= 1.0.8
%endif
@ -368,7 +367,7 @@ Bcache).
%package kbd-devel
Summary: Development files for the libblockdev-kbd plugin/library
Requires: %{name}-kbd%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description kbd-devel
@ -380,7 +379,7 @@ with the libblockdev-kbd plugin/library.
%if %{with_loop}
%package loop
Summary: The loop plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
%description loop
The libblockdev library plugin (and in the same time a standalone library)
@ -389,7 +388,7 @@ providing the functionality related to loop devices.
%package loop-devel
Summary: Development files for the libblockdev-loop plugin/library
Requires: %{name}-loop%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description loop-devel
@ -402,10 +401,8 @@ with the libblockdev-loop plugin/library.
%package lvm
BuildRequires: device-mapper-devel
Summary: The LVM plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: lvm2
# for thin_metadata_size
Requires: device-mapper-persistent-data
%description lvm
The libblockdev library plugin (and in the same time a standalone library)
@ -426,10 +423,8 @@ with the libblockdev-lvm plugin/library.
%package lvm-dbus
BuildRequires: device-mapper-devel
Summary: The LVM plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 1.4
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: lvm2-dbusd >= 2.02.156
# for thin_metadata_size
Requires: device-mapper-persistent-data
%description lvm-dbus
The libblockdev library plugin (and in the same time a standalone library)
@ -451,7 +446,7 @@ with the libblockdev-lvm-dbus plugin/library.
%package mdraid
BuildRequires: libbytesize-devel
Summary: The MD RAID plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: mdadm
%description mdraid
@ -461,7 +456,7 @@ providing the functionality related to MD RAID.
%package mdraid-devel
Summary: Development files for the libblockdev-mdraid plugin/library
Requires: %{name}-mdraid%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description mdraid-devel
@ -474,8 +469,8 @@ with the libblockdev-mdraid plugin/library.
%package mpath
BuildRequires: device-mapper-devel
Summary: The multipath plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Recommends: device-mapper-multipath
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: device-mapper-multipath
%description mpath
The libblockdev library plugin (and in the same time a standalone library)
@ -484,7 +479,7 @@ providing the functionality related to multipath devices.
%package mpath-devel
Summary: Development files for the libblockdev-mpath plugin/library
Requires: %{name}-mpath%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description mpath-devel
@ -497,7 +492,7 @@ with the libblockdev-mpath plugin/library.
BuildRequires: ndctl-devel
BuildRequires: libuuid-devel
Summary: The NVDIMM plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: ndctl
%description nvdimm
@ -507,7 +502,7 @@ providing the functionality related to operations with NVDIMM devices.
%package nvdimm-devel
Summary: Development files for the libblockdev-nvdimm plugin/library
Requires: %{name}-nvdimm%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description nvdimm-devel
@ -516,11 +511,34 @@ with the libblockdev-nvdimm plugin/library.
%endif
%if %{with_nvme}
%package nvme
BuildRequires: libnvme-devel
BuildRequires: libuuid-devel
Summary: The NVMe plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
%description nvme
The libblockdev library plugin (and in the same time a standalone library)
providing the functionality related to operations with NVMe devices.
%package nvme-devel
Summary: Development files for the libblockdev-nvme plugin/library
Requires: %{name}-nvme%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description nvme-devel
This package contains header files and pkg-config files needed for development
with the libblockdev-nvme plugin/library.
%endif
%if %{with_part}
%package part
BuildRequires: parted-devel
Summary: The partitioning plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: gdisk
Requires: util-linux
@ -531,7 +549,7 @@ providing the functionality related to partitioning.
%package part-devel
Summary: Development files for the libblockdev-part plugin/library
Requires: %{name}-part%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description part-devel
@ -544,7 +562,7 @@ with the libblockdev-part plugin/library.
%package swap
BuildRequires: libblkid-devel
Summary: The swap plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
Requires: util-linux
%description swap
@ -554,7 +572,7 @@ providing the functionality related to swap devices.
%package swap-devel
Summary: Development files for the libblockdev-swap plugin/library
Requires: %{name}-swap%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description swap-devel
@ -568,7 +586,7 @@ with the libblockdev-swap plugin/library.
BuildRequires: libbytesize-devel
BuildRequires: libyaml-devel
Summary: The vdo plugin for the libblockdev library
Requires: %{name}-utils%{?_isa} >= 0.11
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
# weak dependencies doesn't work on older RHEL
%if (0%{?rhel} && 0%{?rhel} <= 7)
@ -588,7 +606,7 @@ providing the functionality related to VDO devices.
%package vdo-devel
Summary: Development files for the libblockdev-vdo plugin/library
Requires: %{name}-vdo%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description vdo-devel
@ -599,8 +617,8 @@ with the libblockdev-vdo plugin/library.
%if %{with_tools}
%package tools
Summary: Various nice tools based on libblockdev
Requires: %{name}
Requires: %{name}-lvm
Requires: %{name} = %{version}-%{release}
Requires: %{name}-lvm = %{version}-%{release}
BuildRequires: libbytesize-devel
%if %{with_lvm_dbus} == 1
Recommends: %{name}-lvm-dbus
@ -615,6 +633,7 @@ Various nice storage-related tools based on libblockdev.
%package s390
Summary: The s390 plugin for the libblockdev library
Requires: s390utils
Requires: %{name}-utils%{?_isa} = %{version}-%{release}
%description s390
The libblockdev library plugin (and in the same time a standalone library)
@ -623,7 +642,7 @@ providing the functionality related to s390 devices.
%package s390-devel
Summary: Development files for the libblockdev-s390 plugin/library
Requires: %{name}-s390%{?_isa} = %{version}-%{release}
Requires: %{name}-utils-devel%{?_isa}
Requires: %{name}-utils-devel%{?_isa} = %{version}-%{release}
Requires: glib2-devel
%description s390-devel
@ -675,6 +694,10 @@ Requires: %{name}-mpath%{?_isa} = %{version}-%{release}
Requires: %{name}-nvdimm%{?_isa} = %{version}-%{release}
%endif
%if %{with_nvme}
Requires: %{name}-nvme%{?_isa} = %{version}-%{release}
%endif
%if %{with_part}
Requires: %{name}-part%{?_isa} = %{version}-%{release}
%endif
@ -703,16 +726,6 @@ A meta-package that pulls all the libblockdev plugins as dependencies.
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%build
autoreconf -ivf
@ -767,6 +780,10 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm}
%ldconfig_scriptlets nvdimm
%endif
%if %{with_nvme}
%ldconfig_scriptlets nvme
%endif
%if %{with_part}
%ldconfig_scriptlets part
%endif
@ -966,6 +983,17 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm}
%endif
%if %{with_nvme}
%files nvme
%{_libdir}/libbd_nvme.so.*
%files nvme-devel
%{_libdir}/libbd_nvme.so
%dir %{_includedir}/blockdev
%{_includedir}/blockdev/nvme.h
%endif
%if %{with_part}
%files part
%{_libdir}/libbd_part.so.*
@ -1016,6 +1044,28 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm}
%files plugins-all
%changelog
* Thu Jan 05 2023 Vojtech Trefny <vtrefny@redhat.com> - 2.28-4
- nvme: Fix namespace identifiers
Resolves: rhbz#2151535
- nvme: Avoid sending NVME_IDENTIFY_CNS_NS_DESC_LIST on older devices
Related: rhbz#2151535
* Mon Nov 28 2022 Vojtech Trefny <vtrefny@redhat.com> - 2.28-3
- Fix double free in write_escrow_data_file
Resolves: rhbz#2143226
* Thu Sep 22 2022 Vojtech Trefny <vtrefny@redhat.com> - 2.28-2
- NVMe plugin backport
Resolves: rhbz#2123338
* Wed Sep 14 2022 Vojtech Trefny <vtrefny@redhat.com> - 2.28-1
- Rebase to the latest upstream release 2.28
Resolves: rhbz#2123346
- Add dependency on device-mapper-multipath to libblockdev-mpath
Resolves: rhbz#2121072
- Fix spec issues found by rpminspect
Resolves: rhbz#2116544
* Mon Aug 08 2022 Vojtech Trefny <vtrefny@redhat.com> - 2.25-14
- tests: Fix expected extended partition flags with new parted
Related: rhbz#2109026