Sync with c9-beta

This commit is contained in:
Andrew Lukoshko 2025-06-18 14:46:32 +00:00
parent 4a6eb9c2c5
commit 6e0eb8f7ee
4 changed files with 340 additions and 1 deletions

View File

@ -0,0 +1,31 @@
From 6067dbdf0fe3c2d83055c43edf35cddf277e7236 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 10 Nov 2023 14:09:20 +0100
Subject: [PATCH] tests: Remove unreliable nvme attribute checks
Some attributes like this health information data read counters
are just too volatile to be tested as there might be some other
processes probing the device causing the statistics counters to increase.
---
tests/nvme_test.py | 2 --
1 file changed, 2 deletions(-)
diff --git a/tests/nvme_test.py b/tests/nvme_test.py
index 3c7c0a29..f31de546 100644
--- a/tests/nvme_test.py
+++ b/tests/nvme_test.py
@@ -157,14 +157,12 @@ def test_smart_log(self):
self.assertEqual(log.critical_temp_time, 0)
self.assertEqual(log.ctrl_busy_time, 0)
self.assertEqual(log.media_errors, 0)
- # self.assertEqual(log.num_err_log_entries, 0)
self.assertEqual(log.percent_used, 0)
self.assertEqual(log.power_cycles, 0)
self.assertEqual(log.power_on_hours, 0)
self.assertEqual(log.spare_thresh, 0)
self.assertEqual(log.temp_sensors, [0, 0, 0, 0, 0, 0, 0, 0])
self.assertEqual(log.temperature, 0)
- self.assertGreater(log.total_data_read, 1)
self.assertEqual(log.unsafe_shutdowns, 0)
self.assertEqual(log.warning_temp_time, 0)
self.assertEqual(log.wctemp, 0)

View File

@ -0,0 +1,60 @@
From 874f378ae48860be89807c8021f66d23d5c7da62 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 14 Mar 2024 13:53:04 +0100
Subject: [PATCH] nvme: Add bd_nvme_is_tech_avail to the API file
---
src/lib/plugin_apis/nvme.api | 11 +++++++++++
tests/nvme_test.py | 14 ++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/src/lib/plugin_apis/nvme.api b/src/lib/plugin_apis/nvme.api
index 667dbe9e..af892d8e 100644
--- a/src/lib/plugin_apis/nvme.api
+++ b/src/lib/plugin_apis/nvme.api
@@ -66,6 +66,17 @@ typedef enum {
BD_NVME_TECH_MODE_INITIATOR = 1 << 2,
} BDNVMETechMode;
+/**
+ * bd_nvme_is_tech_avail:
+ * @tech: the queried tech
+ * @mode: a bit mask of queried modes of operation (#BDNVMETechMode) for @tech
+ * @error: (out) (nullable): place to store error (details about why the @tech-@mode combination is not available)
+ *
+ * Returns: whether the @tech-@mode combination is available -- supported by the
+ * plugin implementation and having all the runtime dependencies available
+ */
+gboolean bd_nvme_is_tech_avail (BDNVMETech tech, G_GNUC_UNUSED guint64 mode, GError **error);
+
/* BpG-skip */
/**
diff --git a/tests/nvme_test.py b/tests/nvme_test.py
index 060d6ebc..ca4fec90 100644
--- a/tests/nvme_test.py
+++ b/tests/nvme_test.py
@@ -27,6 +27,20 @@ class NVMeTest(unittest.TestCase):
BlockDev.reinit(cls.requested_plugins, True, None)
+class NVMePluginVersionTestCase(NVMeTest):
+ @tag_test(TestTags.NOSTORAGE)
+ def test_plugin_version(self):
+ self.assertEqual(BlockDev.get_plugin_soname(BlockDev.Plugin.NVME), "libbd_nvme.so.2")
+
+ @tag_test(TestTags.NOSTORAGE)
+ def test_availability(self):
+ avail = BlockDev.nvme_is_tech_avail(BlockDev.NVMETech.NVME, 0)
+ self.assertTrue(avail)
+
+ avail = BlockDev.nvme_is_tech_avail(BlockDev.NVMETech.FABRICS, 0)
+ self.assertTrue(avail)
+
+
class NVMeTestCase(NVMeTest):
def setUp(self):
self.dev_file = None
--
2.46.1

View File

@ -0,0 +1,233 @@
From a0f99ca404218f1da0820e55000531fe0c67f270 Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Thu, 6 Mar 2025 14:41:16 +0100
Subject: [PATCH] crypto: Add a function to set persistent flags for LUKS
This will be used to set the allow-discards flag on LUKS devices
during installation by Blivet.
---
configure.ac | 6 +++
src/lib/plugin_apis/crypto.api | 24 +++++++++++
src/plugins/crypto.c | 76 ++++++++++++++++++++++++++++++++++
src/plugins/crypto.h | 11 +++++
tests/crypto_test.py | 29 +++++++++++++
5 files changed, 146 insertions(+)
diff --git a/configure.ac b/configure.ac
index 14d5974c..158b000f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -226,6 +226,12 @@ AS_IF([test "x$with_crypto" != "xno"],
[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.6.0 libcryptsetup],
+ [AC_DEFINE([LIBCRYPTSETUP_26])], [])
+ AS_IF([$PKG_CONFIG --atleast-version=2.7.0 libcryptsetup],
+ [AC_DEFINE([LIBCRYPTSETUP_27])], [])
+ AS_IF([$PKG_CONFIG --atleast-version=2.8.0 libcryptsetup],
+ [AC_DEFINE([LIBCRYPTSETUP_28])], [])
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 cf87979d..81087ce4 100644
--- a/src/lib/plugin_apis/crypto.api
+++ b/src/lib/plugin_apis/crypto.api
@@ -353,6 +353,16 @@ typedef enum {
#define BD_CRYPTO_TYPE_LUKS_INFO (bd_crypto_luks_info_get_type ())
GType bd_crypto_luks_info_get_type();
+typedef enum {
+ BD_CRYPTO_LUKS_ACTIVATE_ALLOW_DISCARDS = 1 << 0,
+ BD_CRYPTO_LUKS_ACTIVATE_SAME_CPU_CRYPT = 1 << 1,
+ BD_CRYPTO_LUKS_ACTIVATE_SUBMIT_FROM_CRYPT_CPUS = 1 << 2,
+ BD_CRYPTO_LUKS_ACTIVATE_NO_JOURNAL = 1 << 3,
+ BD_CRYPTO_LUKS_ACTIVATE_NO_READ_WORKQUEUE = 1 << 4,
+ BD_CRYPTO_LUKS_ACTIVATE_NO_WRITE_WORKQUEUE = 1 << 5,
+ BD_CRYPTO_LUKS_ACTIVATE_HIGH_PRIORITY = 1 << 6,
+} BDCryptoLUKSPersistentFlags;
+
/**
* BDCryptoLUKSInfo:
* @version: LUKS version
@@ -940,6 +950,20 @@ gboolean bd_crypto_luks_header_backup (const gchar *device, const gchar *backup_
*/
gboolean bd_crypto_luks_header_restore (const gchar *device, const gchar *backup_file, GError **error);
+/**
+ * bd_crypto_luks_set_persistent_flags:
+ * @device: a LUKS device to set the persistent flags on
+ * @flags: flags to set
+ * @error: (out) (optional): place to store error (if any)
+ *
+ * Note: This function is valid only for LUKS2.
+ *
+ * Returns: whether the given @flags were successfully set or not
+ *
+ * Tech category: %BD_CRYPTO_TECH_LUKS-%BD_CRYPTO_TECH_MODE_MODIFY
+ */
+gboolean bd_crypto_luks_set_persistent_flags (const gchar *device, BDCryptoLUKSPersistentFlags flags, GError **error);
+
/**
* bd_crypto_luks_info:
* @luks_device: a device to get information about
diff --git a/src/plugins/crypto.c b/src/plugins/crypto.c
index 2086209e..ed7c0c5a 100644
--- a/src/plugins/crypto.c
+++ b/src/plugins/crypto.c
@@ -1978,6 +1978,82 @@ gboolean bd_crypto_luks_header_restore (const gchar *device, const gchar *backup
return TRUE;
}
+/**
+ * bd_crypto_luks_set_persistent_flags:
+ * @device: a LUKS device to set the persistent flags on
+ * @flags: flags to set
+ * @error: (out) (optional): place to store error (if any)
+ *
+ * Note: This function is valid only for LUKS2.
+ *
+ * Returns: whether the given @flags were successfully set or not
+ *
+ * Tech category: %BD_CRYPTO_TECH_LUKS-%BD_CRYPTO_TECH_MODE_MODIFY
+ */
+gboolean bd_crypto_luks_set_persistent_flags (const gchar *device, BDCryptoLUKSPersistentFlags flags, GError **error) {
+ struct crypt_device *cd = NULL;
+ gint ret = 0;
+ guint32 crypt_flags = 0;
+
+ ret = crypt_init (&cd, device);
+ if (ret != 0) {
+ g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE,
+ "Failed to initialize device: %s", strerror_l (-ret, c_locale));
+ return FALSE;
+ }
+
+ ret = crypt_load (cd, CRYPT_LUKS, NULL);
+ if (ret != 0) {
+ g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE,
+ "Failed to load device: %s", strerror_l (-ret, c_locale));
+ crypt_free (cd);
+ return FALSE;
+ }
+
+ if (g_strcmp0 (crypt_get_type (cd), CRYPT_LUKS2) != 0) {
+ g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE,
+ "Persistent flags can be set only on LUKS v2");
+ crypt_free (cd);
+ return FALSE;
+ }
+
+ if (flags & BD_CRYPTO_LUKS_ACTIVATE_ALLOW_DISCARDS)
+ crypt_flags |= CRYPT_ACTIVATE_ALLOW_DISCARDS;
+ if (flags & BD_CRYPTO_LUKS_ACTIVATE_SAME_CPU_CRYPT)
+ crypt_flags |= CRYPT_ACTIVATE_SAME_CPU_CRYPT;
+ if (flags & BD_CRYPTO_LUKS_ACTIVATE_SUBMIT_FROM_CRYPT_CPUS)
+ crypt_flags |= CRYPT_ACTIVATE_SUBMIT_FROM_CRYPT_CPUS;
+ if (flags & BD_CRYPTO_LUKS_ACTIVATE_NO_JOURNAL)
+ crypt_flags |= CRYPT_ACTIVATE_NO_JOURNAL;
+ if (flags & BD_CRYPTO_LUKS_ACTIVATE_NO_READ_WORKQUEUE)
+ crypt_flags |= CRYPT_ACTIVATE_NO_READ_WORKQUEUE;
+ if (flags & BD_CRYPTO_LUKS_ACTIVATE_NO_WRITE_WORKQUEUE)
+ crypt_flags |= CRYPT_ACTIVATE_NO_WRITE_WORKQUEUE;
+ if (flags & BD_CRYPTO_LUKS_ACTIVATE_HIGH_PRIORITY) {
+#ifdef LIBCRYPTSETUP_28
+ crypt_flags |= CRYPT_ACTIVATE_HIGH_PRIORITY;
+#else
+ g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_TECH_UNAVAIL,
+ "Libcryptsetup 2.8 or newer is needed for 'high priority' flag support");
+ crypt_free (cd);
+ return FALSE;
+#endif
+ }
+
+
+ ret = crypt_persistent_flags_set (cd, CRYPT_FLAGS_ACTIVATION, crypt_flags);
+ if (ret != 0) {
+ g_set_error (error, BD_CRYPTO_ERROR, BD_CRYPTO_ERROR_DEVICE,
+ "Failed to set flags: %s", strerror_l (-ret, c_locale));
+ crypt_free (cd);
+ return FALSE;
+ }
+
+ crypt_free (cd);
+
+ return TRUE;
+}
+
/**
* bd_crypto_luks_info:
* @luks_device: a device to get information about
diff --git a/src/plugins/crypto.h b/src/plugins/crypto.h
index 536accf9..15acd4e6 100644
--- a/src/plugins/crypto.h
+++ b/src/plugins/crypto.h
@@ -155,6 +155,16 @@ typedef enum {
BD_CRYPTO_INTEGRITY_OPEN_ALLOW_DISCARDS = 1 << 5,
} BDCryptoIntegrityOpenFlags;
+typedef enum {
+ BD_CRYPTO_LUKS_ACTIVATE_ALLOW_DISCARDS = 1 << 0,
+ BD_CRYPTO_LUKS_ACTIVATE_SAME_CPU_CRYPT = 1 << 1,
+ BD_CRYPTO_LUKS_ACTIVATE_SUBMIT_FROM_CRYPT_CPUS = 1 << 2,
+ BD_CRYPTO_LUKS_ACTIVATE_NO_JOURNAL = 1 << 3,
+ BD_CRYPTO_LUKS_ACTIVATE_NO_READ_WORKQUEUE = 1 << 4,
+ BD_CRYPTO_LUKS_ACTIVATE_NO_WRITE_WORKQUEUE = 1 << 5,
+ BD_CRYPTO_LUKS_ACTIVATE_HIGH_PRIORITY = 1 << 6,
+} BDCryptoLUKSPersistentFlags;
+
/**
* BDCryptoLUKSInfo:
* @version: LUKS version
@@ -244,6 +254,7 @@ gboolean bd_crypto_luks_resume (const gchar *luks_device, const gchar *passphras
gboolean bd_crypto_luks_kill_slot (const gchar *device, gint slot, GError **error);
gboolean bd_crypto_luks_header_backup (const gchar *device, const gchar *backup_file, GError **error);
gboolean bd_crypto_luks_header_restore (const gchar *device, const gchar *backup_file, GError **error);
+gboolean bd_crypto_luks_set_persistent_flags (const gchar *device, BDCryptoLUKSPersistentFlags flags, GError **error);
BDCryptoLUKSInfo* bd_crypto_luks_info (const gchar *luks_device, GError **error);
BDCryptoIntegrityInfo* bd_crypto_integrity_info (const gchar *device, GError **error);
diff --git a/tests/crypto_test.py b/tests/crypto_test.py
index 91ea1f35..b16e719d 100644
--- a/tests/crypto_test.py
+++ b/tests/crypto_test.py
@@ -978,6 +978,35 @@ class CryptoTestInfo(CryptoTestCase):
self.assertTrue(succ)
+class CryptoTestSetPersistentFlags(CryptoTestCase):
+
+ @tag_test(TestTags.SLOW, TestTags.CORE)
+ def test_luks_set_persistent_flags(self):
+ """Verify that we can set flags on a LUKS device"""
+
+ self._luks_format(self.loop_dev, PASSWD, None)
+
+ with self.assertRaisesRegex(GLib.GError, "Persistent flags can be set only on LUKS v2"):
+ BlockDev.crypto_luks_set_persistent_flags(self.loop_dev,
+ BlockDev.CryptoLUKSPersistentFlags.ALLOW_DISCARDS)
+
+ @tag_test(TestTags.SLOW, TestTags.CORE)
+ def test_luks_set_persistent_flags(self):
+ """Verify that we can set flags on a LUKS 2 device"""
+
+ self._luks2_format(self.loop_dev, PASSWD, None)
+
+ succ = BlockDev.crypto_luks_set_persistent_flags(self.loop_dev,
+ BlockDev.CryptoLUKSPersistentFlags.ALLOW_DISCARDS)
+ self.assertTrue(succ)
+
+ _ret, out, err = run_command("cryptsetup luksDump %s" % self.loop_dev)
+ m = re.search(r"Flags:\s*(\S+)\s*", out)
+ if not m or len(m.groups()) != 1:
+ self.fail("Failed to get label information from:\n%s %s" % (out, err))
+ self.assertEqual(m.group(1), "allow-discards")
+
+
class CryptoTestLuksSectorSize(CryptoTestCase):
def setUp(self):
if not check_cryptsetup_version("2.4.0"):
--
2.48.1

View File

@ -129,7 +129,7 @@
Name: libblockdev
Version: 2.28
Release: 10%{?dist}
Release: 13%{?dist}
Summary: A library for low-level manipulation with block devices
License: LGPLv2+
URL: https://github.com/storaged-project/libblockdev
@ -147,6 +147,9 @@ Patch9: 0009-Fix-issues-in-tests-when-running-in-FIPS-mode.patch
Patch10: 0010-lvm-Add-a-function-to-activate-LVs-in-shared-mode.patch
Patch11: 0011-nvme_libblockdev-3.0.4_backport.patch
Patch12: 0012-lvm-Add-support-for-starting-and-stopping-VG-locking.patch
Patch13: 0013-tests-Remove_unreliable_nvme_attribute_checks.patch
Patch14: 0014-nvme-Add-bd_nvme_is_tech_avail-to-the-API-file.patch
Patch15: 0015-crypto-Add-a-function-to-set-persistent-flags-for-LU.patch
BuildRequires: make
BuildRequires: glib2-devel
@ -1045,6 +1048,18 @@ find %{buildroot} -type f -name "*.la" | xargs %{__rm}
%files plugins-all
%changelog
* Tue Mar 11 2025 Vojtech Trefny <vtrefny@redhat.com> - 2.28-13
- crypto: Add a function to set persistent flags for LUKS
Resolves: RHEL-82886
* Thu Sep 19 2024 Vojtech Trefny <vtrefny@redhat.com> - 2.28-12
- nvme: Add bd_nvme_is_tech_avail to the API file
Resolves: RHEL-59588
* Tue Nov 28 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.28-11
- tests: Remove unreliable nvme attribute checks
Resolves: RHEL-16126
* Wed Nov 08 2023 Vojtech Trefny <vtrefny@redhat.com> - 2.28-10
- lvm: Add support for starting and stopping VG locking
Resolves: RHEL-15921