Compare commits

...

No commits in common. "imports/c9-beta/udisks2-2.9.2-6.el9" and "c8" have entirely different histories.

42 changed files with 2761 additions and 569 deletions

2
.gitignore vendored
View File

@ -1 +1 @@
SOURCES/udisks-2.9.2.tar.bz2
SOURCES/udisks-2.9.0.tar.bz2

View File

@ -1 +0,0 @@
15aaadab7f6ce2ddc4c6ca114019241cd1152f04 SOURCES/udisks-2.9.2.tar.bz2

View File

@ -1,25 +0,0 @@
From b9863c11601e199420a375e13505e2b795de77c5 Mon Sep 17 00:00:00 2001
From: Frederick Grose <4335897+FGrose@users.noreply.github.com>
Date: Tue, 9 Feb 2021 19:02:01 -0500
Subject: [PATCH] 80-udisks2.rules: Ignore Apple boot partition from
livecd-tools
https://github.com/livecd-tools/livecd-tools/pull/176 creates a new boot
partition with livecd-iso-to-disk from Fedora Live .iso files that UDISKS
should ignore.
---
data/80-udisks2.rules | 1 +
1 file changed, 1 insertion(+)
diff --git a/data/80-udisks2.rules b/data/80-udisks2.rules
index fb50f48a0..d6fa072fd 100644
--- a/data/80-udisks2.rules
+++ b/data/80-udisks2.rules
@@ -122,6 +122,7 @@ ENV{ID_PART_ENTRY_SCHEME}=="mac", ENV{ID_PART_ENTRY_TYPE}=="Apple_Bootstrap", EN
# Apple Boot partitions
ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_TYPE}=="426f6f74-0000-11aa-aa11-00306543ecac", ENV{UDISKS_IGNORE}="1"
+ENV{ID_FS_LABEL}=="ANACONDA", ENV{ID_PART_ENTRY_TYPE}=="48465300-0000-11aa-aa11-00306543ecac|0xaf", ENV{UDISKS_IGNORE}="1"
# special DOS partition types (EFI, hidden, etc.) and RAID/LVM
# see http://www.win.tue.nl/~aeb/partitions/partition_types-1.html

View File

@ -0,0 +1,11 @@
diff -up udisks-2.9.0/src/tests/dbus-tests/test_10_basic.py.bak udisks-2.9.0/src/tests/dbus-tests/test_10_basic.py
--- udisks-2.9.0/src/tests/dbus-tests/test_10_basic.py.bak 2020-05-26 14:59:20.000000000 +0200
+++ udisks-2.9.0/src/tests/dbus-tests/test_10_basic.py 2021-04-23 15:49:07.405824214 +0200
@@ -26,6 +26,7 @@ class UdisksBaseTest(udiskstestcase.Udis
elif distro in ('enterprise_linux', 'centos') and int(version) > 7:
modules.pop('bcache')
modules.pop('btrfs')
+ modules.pop('zram')
# assuming the kvdo module is typically pulled in as a vdo tool dependency
if not find_executable("vdo"):
modules.pop('vdo')

View File

@ -1,29 +0,0 @@
From 79eed9aa35fbf1c5131b44b50b407742f68e2f61 Mon Sep 17 00:00:00 2001
From: Florian Ziegler <florian.ziegler@posteo.de>
Date: Sat, 17 Apr 2021 13:31:31 +0200
Subject: [PATCH 8/8] Ignore "Extended Boot Loader" GPT partition
---
data/80-udisks2.rules | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/data/80-udisks2.rules b/data/80-udisks2.rules
index fb50f48a..39bfa28b 100644
--- a/data/80-udisks2.rules
+++ b/data/80-udisks2.rules
@@ -135,6 +135,12 @@ ENV{ID_PART_ENTRY_SCHEME}=="gpt", \
ENV{ID_PART_ENTRY_TYPE}=="c12a7328-f81f-11d2-ba4b-00a0c93ec93b|21686148-6449-6e6f-744e-656564454649|a19d880f-05fc-4d3b-a006-743f0f84911e|e6d6d379-f507-44c2-a23c-238f2a3df928|e3c9e316-0b5c-4db8-817d-f92df00215ae|de94bba4-06d1-4d40-a16a-bfd50179d6ac", \
ENV{UDISKS_IGNORE}="1"
+# special Extended Boot Loader partition (XBOOTLDR)
+# see https://systemd.io/BOOT_LOADER_SPECIFICATION/
+ENV{ID_PART_ENTRY_SCHEME}=="gpt", \
+ ENV{ID_PART_ENTRY_TYPE}=="bc13c2ff-59e6-4262-a352-b275fd6f7172", \
+ ENV{UDISKS_IGNORE}="1"
+
# ZFS member partitions
ENV{ID_PART_ENTRY_SCHEME}=="gpt", \
ENV{ID_FS_TYPE}=="zfs_member", ENV{ID_PART_ENTRY_TYPE}=="6a898cc3-1dd2-11b2-99a6-080020736631", \
--
2.30.2

View File

@ -1,60 +0,0 @@
commit 6ff556afabd490feb6c4b29f9e91e81d64e2c0ed
Author: Tomas Bzatek <tbzatek@redhat.com>
Date: Tue Mar 23 12:56:40 2021 +0100
udiskslinuxdriveata: Use GTask to apply configuration in a thread
Should fix a leaking GThread without a need to join or track it anyhow.
diff --git a/src/udiskslinuxdriveata.c b/src/udiskslinuxdriveata.c
index 5ebdcd76..2de138cd 100644
--- a/src/udiskslinuxdriveata.c
+++ b/src/udiskslinuxdriveata.c
@@ -1625,10 +1625,13 @@ apply_conf_data_free (ApplyConfData *data)
g_free (data);
}
-static gpointer
-apply_configuration_thread_func (gpointer user_data)
+static void
+apply_configuration_thread_func (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
{
- ApplyConfData *data = user_data;
+ ApplyConfData *data = task_data;
UDisksDaemon *daemon;
const gchar *device_file = NULL;
gint fd = -1;
@@ -1799,8 +1802,6 @@ apply_configuration_thread_func (gpointer user_data)
out:
if (fd != -1)
close (fd);
- apply_conf_data_free (data);
- return NULL;
}
/**
@@ -1819,6 +1820,7 @@ udisks_linux_drive_ata_apply_configuration (UDisksLinuxDriveAta *drive,
{
gboolean has_conf = FALSE;
ApplyConfData *data = NULL;
+ GTask *task;
data = g_new0 (ApplyConfData, 1);
data->ata_pm_standby = -1;
@@ -1862,9 +1864,10 @@ udisks_linux_drive_ata_apply_configuration (UDisksLinuxDriveAta *drive,
/* this can easily take a long time and thus block (the drive may be in standby mode
* and needs to spin up) - so run it in a thread
*/
- g_thread_new ("apply-conf-thread",
- apply_configuration_thread_func,
- data);
+ task = g_task_new (data->object, NULL, NULL, NULL);
+ g_task_set_task_data (task, data, (GDestroyNotify) apply_conf_data_free);
+ g_task_run_in_thread (task, apply_configuration_thread_func);
+ g_object_unref (task);
data = NULL; /* don't free data below */

View File

@ -0,0 +1,60 @@
From eb917d346bc8592924c5f6566b01841176c53c8c Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Mon, 22 Aug 2022 16:27:11 +0200
Subject: [PATCH] udiskslinuxblock: Only permit ATA Secure Erase during
Format() on a whole block device
ATA Secure Erase requested as an option to the Format() method call used
to perform the actual erase on a whole drive object it looked up. When
Format() was called on a partition, this led to data loss on a whole drive.
This commit adds a safeguard to check that the Format() is requested
on a whole block device.
Severity of this issue was slightly lowered by a failure to submit
the ATA Secure erase command in case some filesystem was mounted
at that point.
---
src/udiskslinuxblock.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c
index d1da94edf..db0ed2bf6 100644
--- a/src/udiskslinuxblock.c
+++ b/src/udiskslinuxblock.c
@@ -2354,6 +2354,7 @@ erase_ata_device (UDisksBlock *block,
{
gboolean ret = FALSE;
UDisksObject *drive_object = NULL;
+ UDisksLinuxBlockObject *block_object = NULL;
UDisksDriveAta *ata = NULL;
drive_object = udisks_daemon_find_object (daemon, udisks_block_get_drive (block));
@@ -2369,6 +2370,20 @@ erase_ata_device (UDisksBlock *block,
goto out;
}
+ /* Reverse check to ensure we're erasing whole block device and not a partition */
+ block_object = udisks_linux_drive_object_get_block (UDISKS_LINUX_DRIVE_OBJECT (drive_object), FALSE /* get_hw */);
+ if (block_object == NULL)
+ {
+ g_set_error (error, UDISKS_ERROR, UDISKS_ERROR_FAILED, "Couldn't find a block device for the drive to erase");
+ goto out;
+ }
+ if (g_strcmp0 (g_dbus_object_get_object_path (G_DBUS_OBJECT (object)),
+ g_dbus_object_get_object_path (G_DBUS_OBJECT (block_object))) != 0)
+ {
+ g_set_error (error, UDISKS_ERROR, UDISKS_ERROR_FAILED, "ATA secure erase needs to be performed on a whole block device");
+ goto out;
+ }
+
/* sleep a tiny bit here to avoid the secure erase code racing with
* programs spawned by udev
*/
@@ -2382,6 +2397,7 @@ erase_ata_device (UDisksBlock *block,
out:
g_clear_object (&ata);
g_clear_object (&drive_object);
+ g_clear_object (&block_object);
return ret;
}

View File

@ -1,24 +0,0 @@
commit d58ebcc32b583371dd73ab7f4c7be5191674ca62
Author: Tomas Bzatek <tbzatek@redhat.com>
Date: Wed Mar 17 18:52:22 2021 +0100
udiskslinuxblock: Re-read partition table after creating FAT filesystem
Might not be needed after reverting mkfs.vfat behaviour back
to the legacy way, added just as a precautionary measure.
diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c
index 901426ad..69161b61 100644
--- a/src/udiskslinuxblock.c
+++ b/src/udiskslinuxblock.c
@@ -2913,7 +2913,9 @@ static inline gboolean
need_partprobe_after_mkfs (const gchar *fs_type)
{
/* udftools makes fake MBR since the 2.0 release */
- return (g_strcmp0 (fs_type, "udf") == 0);
+ /* dosfstools makes fake MBR since the 4.2 release */
+ return (g_strcmp0 (fs_type, "udf") == 0 ||
+ g_strcmp0 (fs_type, "vfat") == 0);
}
void

View File

@ -1,75 +0,0 @@
commit ef1979d8cbfb8ad976de0af21a70f8c0f98fbbe9
Author: Tomas Bzatek <tbzatek@redhat.com>
Date: Wed Mar 17 18:50:19 2021 +0100
udiskslinuxfsinfo: Add dosfstools >= 4.2 quirks
Reverting back the legacy behaviour with no protective (fake) MBR
created while making new FAT filesystem on an unpartitioned block device.
Added a label clear functionality as well.
diff --git a/src/udiskslinuxfsinfo.c b/src/udiskslinuxfsinfo.c
index 15af26c8..f18b9b80 100644
--- a/src/udiskslinuxfsinfo.c
+++ b/src/udiskslinuxfsinfo.c
@@ -21,6 +21,8 @@
#include <string.h>
#include <glib.h>
+#include <blockdev/exec.h>
+
#include "config.h"
#include "udiskslinuxfsinfo.h"
#include "udisksconfigmanager.h"
@@ -236,6 +238,19 @@ const FSInfo _fs_info[] =
},
};
+/* workaround for dosfstools >= 4.2 */
+static const FSInfo vfat_dosfstools_42 =
+ {
+ FS_VFAT,
+ "fatlabel $DEVICE $LABEL",
+ "fatlabel --reset $DEVICE",
+ FALSE, /* supports_online_label_rename */
+ FALSE, /* supports_owners */
+ "mkfs.vfat -I -n $LABEL --mbr=n $DEVICE",
+ NULL,
+ NULL, /* option_no_discard */
+ };
+
/**
* get_fs_info:
*
@@ -248,6 +263,7 @@ const FSInfo _fs_info[] =
const FSInfo *
get_fs_info (const gchar *fstype)
{
+ const FSInfo *info = NULL;
guint n;
g_return_val_if_fail (fstype != NULL, NULL);
@@ -255,10 +271,20 @@ get_fs_info (const gchar *fstype)
for (n = 0; n < sizeof(_fs_info)/sizeof(FSInfo); n++)
{
if (strcmp (_fs_info[n].fstype, fstype) == 0)
- return &_fs_info[n];
+ {
+ info = &_fs_info[n];
+ break;
+ }
+ }
+
+ /* dosfstools >= 4.2 workaround */
+ if (g_str_equal (fstype, FS_VFAT) &&
+ bd_utils_check_util_version ("mkfs.vfat", "4.2", "--help", "mkfs.fat\\s+([\\d\\.]+).+", NULL))
+ {
+ info = &vfat_dosfstools_42;
}
- return NULL;
+ return info;
}
/**

View File

@ -1,32 +0,0 @@
From fcdec5d58ba2bbe6d7ecf7168ab1a11282763041 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 16 Apr 2021 18:15:03 +0200
Subject: [PATCH 5/8] udiskslinuxfilesystemhelpers: Fix leaking string in case
g_mkdtemp() fails
---
src/udiskslinuxfilesystemhelpers.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/udiskslinuxfilesystemhelpers.c b/src/udiskslinuxfilesystemhelpers.c
index 74d83152..7c5fc037 100644
--- a/src/udiskslinuxfilesystemhelpers.c
+++ b/src/udiskslinuxfilesystemhelpers.c
@@ -142,11 +142,11 @@ take_filesystem_ownership (const gchar *device,
else
{
/* device is not mounted, we need to mount it */
- mountpoint = g_mkdtemp (g_strdup ("/run/udisks2/temp-mount-XXXXXX"));
- if (mountpoint == NULL)
+ mountpoint = g_strdup ("/run/udisks2/temp-mount-XXXXXX");
+ if (g_mkdtemp (mountpoint) == NULL)
{
g_set_error (error, UDISKS_ERROR, UDISKS_ERROR_FAILED,
- "Cannot create temporary mountpoint.");
+ "Cannot create temporary mountpoint: %m.");
success = FALSE;
goto out;
}
--
2.30.2

View File

@ -0,0 +1,161 @@
From 26fcef727d68af97b1187d2ac3cad19acc3d97c8 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Tue, 16 May 2023 18:33:59 +0200
Subject: [PATCH 1/2] iscsi: Set node parameters before the Login/Logout action
This allows to properly pass required arguments like the CHAP
auth algorithms, etc.
---
modules/iscsi/udisksiscsiutil.c | 54 ++++++++++++++++++---------------
1 file changed, 29 insertions(+), 25 deletions(-)
diff --git a/modules/iscsi/udisksiscsiutil.c b/modules/iscsi/udisksiscsiutil.c
index 78890106f0..b279442876 100644
--- a/modules/iscsi/udisksiscsiutil.c
+++ b/modules/iscsi/udisksiscsiutil.c
@@ -186,9 +186,10 @@ iscsi_perform_login_action (UDisksLinuxModuleISCSI *module,
}
static gint
-iscsi_node_set_parameters (struct libiscsi_context *ctx,
- struct libiscsi_node *node,
- GVariant *params)
+iscsi_node_set_parameters (struct libiscsi_context *ctx,
+ struct libiscsi_node *node,
+ GVariant *params,
+ gchar **errorstr)
{
GVariantIter iter;
GVariant *value;
@@ -207,9 +208,11 @@ iscsi_node_set_parameters (struct libiscsi_context *ctx,
/* Update the node parameter value. */
err = libiscsi_node_set_parameter (ctx, node, key, param_value);
+ if (errorstr && err != 0)
+ *errorstr = g_strdup (libiscsi_get_error_string (ctx));
g_variant_unref (value);
- g_free ((gpointer) key);
+ g_free (key);
}
return 0;
@@ -279,7 +282,7 @@ iscsi_login (UDisksLinuxModuleISCSI *module,
const gchar *password = NULL;
const gchar *reverse_username = NULL;
const gchar *reverse_password = NULL;
- gint err;
+ gint err = 0;
g_return_val_if_fail (UDISKS_IS_LINUX_MODULE_ISCSI (module), 1);
@@ -304,17 +307,18 @@ iscsi_login (UDisksLinuxModuleISCSI *module,
/* Get iscsi context. */
ctx = udisks_linux_module_iscsi_get_libiscsi_context (module);
- /* Login */
- err = iscsi_perform_login_action (module,
- ACTION_LOGIN,
- &node,
- &auth_info,
- errorstr);
+ /* Update node parameters. */
+ if (params)
+ err = iscsi_node_set_parameters (ctx, &node, params_without_chap, errorstr);
- if (err == 0 && params)
+ /* Login */
+ if (err == 0)
{
- /* Update node parameters. */
- err = iscsi_node_set_parameters (ctx, &node, params_without_chap);
+ err = iscsi_perform_login_action (module,
+ ACTION_LOGIN,
+ &node,
+ &auth_info,
+ errorstr);
}
g_variant_unref (params_without_chap);
@@ -334,7 +338,7 @@ iscsi_logout (UDisksLinuxModuleISCSI *module,
{
struct libiscsi_context *ctx;
struct libiscsi_node node = {0,};
- gint err;
+ gint err = 0;
g_return_val_if_fail (UDISKS_IS_LINUX_MODULE_ISCSI (module), 1);
@@ -344,18 +348,18 @@ iscsi_logout (UDisksLinuxModuleISCSI *module,
/* Get iscsi context. */
ctx = udisks_linux_module_iscsi_get_libiscsi_context (module);
- /* Logout */
- err = iscsi_perform_login_action (module,
- ACTION_LOGOUT,
- &node,
- NULL,
- errorstr);
+ /* Update node parameters. */
+ if (params)
+ err = iscsi_node_set_parameters (ctx, &node, params, errorstr);
- if (err == 0 && params)
+ /* Logout */
+ if (err == 0)
{
- /* Update node parameters. */
- err = iscsi_node_set_parameters (ctx, &node, params);
-
+ err = iscsi_perform_login_action (module,
+ ACTION_LOGOUT,
+ &node,
+ NULL,
+ errorstr);
}
return err;
From 749812784abcc4c0492bda0703bff5d3dae052f9 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Tue, 16 May 2023 18:35:42 +0200
Subject: [PATCH 2/2] tests: Disallow MD5 for iscsi CHAP login
MD5 is unavailable in FIPS mode:
iscsid[82167]: iscsid: Ignoring CHAP algorthm request for MD5 due to crypto lib configuration
iscsid[82167]: iscsid: Couldn't set CHAP algorithm list
kernel: rx_data returned 0, expecting 48.
kernel: iSCSI Login negotiation failed.
---
src/tests/dbus-tests/test_30_iscsi.py | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/tests/dbus-tests/test_30_iscsi.py b/src/tests/dbus-tests/test_30_iscsi.py
index 09e975f30c..02ba6c92b0 100644
--- a/src/tests/dbus-tests/test_30_iscsi.py
+++ b/src/tests/dbus-tests/test_30_iscsi.py
@@ -161,6 +161,7 @@ def test_login_chap_auth(self):
self.assertEqual(port, self.port)
options = dbus.Dictionary(signature='sv')
+ options['node.session.auth.chap_algs'] = 'SHA3-256,SHA256,SHA1' # disallow MD5
options['username'] = self.initiator
msg = 'Login failed: initiator reported error \(24 - iSCSI login failed due to authorization failure\)'
@@ -227,6 +228,7 @@ def test_login_mutual_auth(self):
self.assertEqual(port, self.port)
options = dbus.Dictionary(signature='sv')
+ options['node.session.auth.chap_algs'] = 'SHA3-256,SHA256,SHA1' # disallow MD5
options['username'] = self.initiator
options['password'] = self.password
options['reverse-username'] = self.mutual_iqn
@@ -335,6 +337,7 @@ def test_login_noauth_badauth(self):
# first attempt - wrong password
options = dbus.Dictionary(signature='sv')
+ options['node.session.auth.chap_algs'] = 'SHA3-256,SHA256,SHA1' # disallow MD5
options['username'] = self.initiator
msg = r'Login failed: initiator reported error \((19 - encountered non-retryable iSCSI login failure|24 - iSCSI login failed due to authorization failure)\)'
with six.assertRaisesRegex(self, dbus.exceptions.DBusException, msg):

View File

@ -0,0 +1,29 @@
From 9a6e6b700b19539465ab6b241f04b94d4b3769c4 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Mon, 10 Oct 2022 13:55:29 +0200
Subject: [PATCH] iscsi: Always set auth info
In case of reusing a context auth info needs to be
always set to override previous data.
---
modules/iscsi/udisksiscsiutil.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/modules/iscsi/udisksiscsiutil.c b/modules/iscsi/udisksiscsiutil.c
index 8fdae889c7..78890106f0 100644
--- a/modules/iscsi/udisksiscsiutil.c
+++ b/modules/iscsi/udisksiscsiutil.c
@@ -171,11 +171,8 @@ iscsi_perform_login_action (UDisksLinuxModuleISCSI *module,
/* Get a libiscsi context. */
ctx = udisks_linux_module_iscsi_get_libiscsi_context (module);
- if (action == ACTION_LOGIN &&
- auth_info && auth_info->method == libiscsi_auth_chap)
- {
- libiscsi_node_set_auth (ctx, node, auth_info);
- }
+ if (action == ACTION_LOGIN && auth_info)
+ libiscsi_node_set_auth (ctx, node, auth_info);
/* Login or Logout */
err = action == ACTION_LOGIN ?

View File

@ -0,0 +1,73 @@
From 0441d0f93788b617a38b75e4a44744406976c822 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Mon, 31 Jul 2023 16:48:28 +0200
Subject: [PATCH] iscsi: Fix login on firmware-discovered nodes
There's currently no way to distinguish between force-no-auth and
use-fw-discovered-auth-info scenarios from the D-Bus API so let's
assume that the caller wants to retain the firmware-discovered auth
info unless overriden with specific CHAP credentials.
---
.../data/org.freedesktop.UDisks2.iscsi.xml | 3 +++
modules/iscsi/udisksiscsiutil.c | 27 ++++++++++++++++++-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/modules/iscsi/data/org.freedesktop.UDisks2.iscsi.xml b/modules/iscsi/data/org.freedesktop.UDisks2.iscsi.xml
index cf262deb68..e8a717ff1d 100644
--- a/modules/iscsi/data/org.freedesktop.UDisks2.iscsi.xml
+++ b/modules/iscsi/data/org.freedesktop.UDisks2.iscsi.xml
@@ -162,6 +162,9 @@
<parameter>reverse-password</parameter> will be used for CHAP
authentication.
+ Firmware-discovered nodes retain their authentication info unless
+ overriden with specified credentials (see above).
+
All the additional options are transformed into the interface
parameters. For example, if an automatic node startup is desired, the
<parameter>node.startup</parameter> needs to be set to
diff --git a/modules/iscsi/udisksiscsiutil.c b/modules/iscsi/udisksiscsiutil.c
index b279442876..fb4f5ea167 100644
--- a/modules/iscsi/udisksiscsiutil.c
+++ b/modules/iscsi/udisksiscsiutil.c
@@ -264,6 +264,31 @@ iscsi_params_pop_chap_data (GVariant *params,
return g_variant_dict_end (&dict);
}
+static gboolean
+is_auth_required (struct libiscsi_context *ctx,
+ struct libiscsi_node *node,
+ struct libiscsi_auth_info *auth_info)
+{
+ char val[LIBISCSI_VALUE_MAXLEN + 1] = {'\0',};
+ int ret;
+
+ /* TODO: No way to distinguish between the "no auth requested" and
+ * "retain discovered auth info" scenarios from the D-Bus API.
+ */
+
+ /* In case CHAP auth is requested, let's use it unconditionally */
+ if (auth_info->method != libiscsi_auth_none)
+ return TRUE;
+
+ /* Avoid auth override on firmware-discovered nodes */
+ ret = libiscsi_node_get_parameter (ctx, node, "node.discovery_type", val);
+ if (ret == 0 && g_strcmp0 (val, "fw") == 0)
+ return FALSE;
+
+ /* Not a firmware-discovered node, maintain legacy rules */
+ return TRUE;
+}
+
gint
iscsi_login (UDisksLinuxModuleISCSI *module,
const gchar *name,
@@ -317,7 +342,7 @@ iscsi_login (UDisksLinuxModuleISCSI *module,
err = iscsi_perform_login_action (module,
ACTION_LOGIN,
&node,
- &auth_info,
+ is_auth_required (ctx, &node, &auth_info) ? &auth_info : NULL,
errorstr);
}

View File

@ -0,0 +1,75 @@
commit fab797fcf5e4c8e09e4cde45647951acd764415e
Author: Tomas Bzatek <tbzatek@redhat.com>
Date: Mon Oct 10 13:58:15 2022 +0200
tests: Add bad auth test for iscsi
This tests that the auth info is properly set for each login call,
overriding previously set auth info with no trace.
diff --git a/src/tests/dbus-tests/test_30_iscsi.py b/src/tests/dbus-tests/test_30_iscsi.py
index 34bdfc4b..6ac8386b 100644
--- a/src/tests/dbus-tests/test_30_iscsi.py
+++ b/src/tests/dbus-tests/test_30_iscsi.py
@@ -284,3 +284,61 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
# make sure the session object is no longer on dbus
objects = udisks.GetManagedObjects(dbus_interface='org.freedesktop.DBus.ObjectManager')
self.assertNotIn(session_path, objects.keys())
+
+ def test_login_noauth_badauth(self):
+ """
+ Test auth info override
+ """
+ manager = self.get_object('/Manager')
+ nodes, _ = manager.DiscoverSendTargets(self.address, self.port, self.no_options,
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
+
+ node = next((node for node in nodes if node[0] == self.noauth_iqn), None)
+ self.assertIsNotNone(node)
+
+ (iqn, tpg, host, port, iface) = node
+ self.assertEqual(iqn, self.noauth_iqn)
+ self.assertEqual(host, self.address)
+ self.assertEqual(port, self.port)
+
+ self.addCleanup(self._force_lougout, self.noauth_iqn)
+
+ # first attempt - wrong password
+ options = dbus.Dictionary(signature='sv')
+ options['username'] = self.initiator
+ msg = 'Login failed: initiator reported error'
+ with six.assertRaisesRegex(self, dbus.exceptions.DBusException, msg):
+ options['password'] = '12345'
+ manager.Login(iqn, tpg, host, port, iface, options,
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
+
+ # second atttempt - no password
+ manager.Login(iqn, tpg, host, port, iface, self.no_options,
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
+
+ devs = glob.glob('/dev/disk/by-path/*%s*' % iqn)
+ self.assertEqual(len(devs), 1)
+
+ # check if the block device have 'Symlinks' property updated
+ disk_name = os.path.realpath(devs[0]).split('/')[-1]
+ disk_obj = self.get_object('/block_devices/' + disk_name)
+ dbus_path = str(disk_obj.object_path)
+ self.assertIsNotNone(disk_obj)
+
+ symlinks = self.get_property_raw(disk_obj, '.Block', 'Symlinks')
+ self.assertIn(self.str_to_ay(devs[0]), symlinks)
+
+ manager.Logout(iqn, tpg, host, port, iface, self.no_options,
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
+
+ devs = glob.glob('/dev/disk/by-path/*%s*' % iqn)
+ self.assertEqual(len(devs), 0)
+
+ # make sure the disk is no longer on dbus
+ udisks = self.get_object('')
+ objects = udisks.GetManagedObjects(dbus_interface='org.freedesktop.DBus.ObjectManager')
+ self.assertNotIn(dbus_path, objects.keys())

View File

@ -0,0 +1,51 @@
commit 13a6a27eecdd1fb527b9151309366970b182a58d
Author: Tomas Bzatek <tbzatek@redhat.com>
Date: Thu Oct 20 17:17:10 2022 +0200
tests: Fix LIO target config auth
Linux kernel 6.0 brought number of the LIO target changes related to authentication
that made our tests fail. Turned out our target config was incorrect, e.g.
not requiring auth for CHAP tests, etc. The kernel 6.0 looks to be more strict
in this regard.
diff --git a/src/tests/dbus-tests/targetcli_config.json b/src/tests/dbus-tests/targetcli_config.json
index 25d506b6..3be9eac2 100644
--- a/src/tests/dbus-tests/targetcli_config.json
+++ b/src/tests/dbus-tests/targetcli_config.json
@@ -385,7 +385,7 @@
"tpgs": [
{
"attributes": {
- "authentication": 0,
+ "authentication": 1,
"cache_dynamic_acls": 0,
"default_cmdsn_depth": 64,
"default_erl": 0,
@@ -432,7 +432,7 @@
}
],
"parameters": {
- "AuthMethod": "CHAP,None",
+ "AuthMethod": "CHAP",
"DataDigest": "CRC32C,None",
"DataPDUInOrder": "Yes",
"DataSequenceInOrder": "Yes",
@@ -471,7 +471,7 @@
"tpgs": [
{
"attributes": {
- "authentication": 0,
+ "authentication": 1,
"cache_dynamic_acls": 0,
"default_cmdsn_depth": 64,
"default_erl": 0,
@@ -520,7 +520,7 @@
}
],
"parameters": {
- "AuthMethod": "CHAP,None",
+ "AuthMethod": "CHAP",
"DataDigest": "CRC32C,None",
"DataPDUInOrder": "Yes",
"DataSequenceInOrder": "Yes",

View File

@ -0,0 +1,37 @@
commit 1bf172603e4cc77da70d8fd13b6ba6c8b8c91600
Author: Tomas Bzatek <tbzatek@redhat.com>
Date: Thu Oct 20 17:53:20 2022 +0200
tests: Test iscsi noauth in test_login_chap_auth
The other way is already tested in test_login_noauth_badauth.
diff --git a/src/tests/dbus-tests/test_30_iscsi.py b/src/tests/dbus-tests/test_30_iscsi.py
index 2b75462a..f2594d99 100644
--- a/src/tests/dbus-tests/test_30_iscsi.py
+++ b/src/tests/dbus-tests/test_30_iscsi.py
@@ -151,8 +151,14 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
options = dbus.Dictionary(signature='sv')
options['username'] = self.initiator
+ msg = 'Login failed: initiator reported error \(24 - iSCSI login failed due to authorization failure\)'
+ # missing auth info
+ with six.assertRaisesRegex(self, dbus.exceptions.DBusException, msg):
+ manager.Login(iqn, tpg, host, port, iface, self.no_options,
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
+
# wrong password
- msg = 'Login failed: initiator reported error'
with six.assertRaisesRegex(self, dbus.exceptions.DBusException, msg):
options['password'] = '12345'
manager.Login(iqn, tpg, host, port, iface, options,
@@ -318,7 +324,7 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
# first attempt - wrong password
options = dbus.Dictionary(signature='sv')
options['username'] = self.initiator
- msg = 'Login failed: initiator reported error'
+ msg = r'Login failed: initiator reported error \((19 - encountered non-retryable iSCSI login failure|24 - iSCSI login failed due to authorization failure)\)'
with six.assertRaisesRegex(self, dbus.exceptions.DBusException, msg):
options['password'] = '12345'
manager.Login(iqn, tpg, host, port, iface, options,

View File

@ -0,0 +1,42 @@
From fbe970add68e6d9d998fb7f78377368c403e200d Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Mon, 31 Oct 2022 15:15:31 +0100
Subject: [PATCH] tests: Restart iscsid on every InitiatorName change
The test LIO target config expects a specific initiator name as set
by the ACLs. However the iscsid daemon only seems to be reading
the InitiatorName string on startup and in case the service is running
with a different name, the auth tests will fail.
As a workaround, restart the iscsid service after each change.
A proper way through libiscsi or libopeniscsiusr would be nice -> TODO.
---
src/tests/dbus-tests/test_30_iscsi.py | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/tests/dbus-tests/test_30_iscsi.py b/src/tests/dbus-tests/test_30_iscsi.py
index f2594d992..09e975f30 100644
--- a/src/tests/dbus-tests/test_30_iscsi.py
+++ b/src/tests/dbus-tests/test_30_iscsi.py
@@ -48,9 +48,21 @@ def _force_lougout(self, target):
def _set_initiator_name(self):
manager = self.get_object('/Manager')
+ # make backup of INITIATOR_FILE and restore it at the end
+ try:
+ initiatorname_backup = self.read_file(INITIATOR_FILE)
+ self.addCleanup(self.write_file, INITIATOR_FILE, initiatorname_backup)
+ except FileNotFoundError as e:
+ # no existing file, simply remove it once finished
+ self.addCleanup(self.remove_file, INITIATOR_FILE, True)
+
manager.SetInitiatorName(self.initiator, self.no_options,
dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ # running iscsid needs to be restarted to reflect the change
+ self.run_command('systemctl try-reload-or-restart iscsid.service')
+ # ignore the return code in case of non-systemd distros
+
init = manager.GetInitiatorName(self.no_options,
dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
self.assertEqual(init, self.initiator)

View File

@ -0,0 +1,156 @@
commit 4090b87a1468fcc479aafd264328abfed471daeb
Author: Tomas Bzatek <tbzatek@redhat.com>
Date: Thu Jun 3 16:09:10 2021 +0200
tests: Extend iscsi method call timeouts
The default tests 100 sec. D-Bus method call timeout is not enough as
the iscsi initiator timeouts are typically around 120 sec, e.g. for
the Login operation.
diff --git a/src/tests/dbus-tests/test_30_iscsi.py b/src/tests/dbus-tests/test_30_iscsi.py
index 8ec6858c..34bdfc4b 100644
--- a/src/tests/dbus-tests/test_30_iscsi.py
+++ b/src/tests/dbus-tests/test_30_iscsi.py
@@ -26,6 +26,12 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
chap_iqn = 'iqn.2003-01.udisks.test:iscsi-test-chap'
mutual_iqn = 'iqn.2003-01.udisks.test:iscsi-test-mutual'
+ # Define common D-Bus method call timeout that needs to be slightly longer
+ # than the corresponding timeout defined in libiscsi:
+ # #define ISCSID_REQ_TIMEOUT 1000
+ # In reality the timeout is typically around 120 sec for the 'login' operation.
+ iscsi_timeout = 1000 + 5
+
@classmethod
def setUpClass(cls):
udiskstestcase.UdisksTestCase.setUpClass()
@@ -78,7 +84,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
def test_login_noauth(self):
manager = self.get_object('/Manager')
nodes, _ = manager.DiscoverSendTargets(self.address, self.port, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
node = next((node for node in nodes if node[0] == self.noauth_iqn), None)
self.assertIsNotNone(node)
@@ -90,7 +97,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
self.addCleanup(self._force_lougout, self.noauth_iqn)
manager.Login(iqn, tpg, host, port, iface, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
devs = glob.glob('/dev/disk/by-path/*%s*' % iqn)
self.assertEqual(len(devs), 1)
@@ -105,7 +113,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
self.assertIn(self.str_to_ay(devs[0]), symlinks)
manager.Logout(iqn, tpg, host, port, iface, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
devs = glob.glob('/dev/disk/by-path/*%s*' % iqn)
self.assertEqual(len(devs), 0)
@@ -120,7 +129,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
manager = self.get_object('/Manager')
nodes, _ = manager.DiscoverSendTargets(self.address, self.port, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
node = next((node for node in nodes if node[0] == self.chap_iqn), None)
self.assertIsNotNone(node)
@@ -138,14 +148,16 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
with six.assertRaisesRegex(self, dbus.exceptions.DBusException, msg):
options['password'] = '12345'
manager.Login(iqn, tpg, host, port, iface, options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
# right password
options['password'] = self.password
self.addCleanup(self._force_lougout, self.chap_iqn)
manager.Login(iqn, tpg, host, port, iface, options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
devs = glob.glob('/dev/disk/by-path/*%s*' % iqn)
self.assertEqual(len(devs), 1)
@@ -160,7 +172,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
self.assertIn(self.str_to_ay(devs[0]), symlinks)
manager.Logout(iqn, tpg, host, port, iface, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
devs = glob.glob('/dev/disk/by-path/*%s*' % iqn)
self.assertEqual(len(devs), 0)
@@ -175,7 +188,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
manager = self.get_object('/Manager')
nodes, _ = manager.DiscoverSendTargets(self.address, self.port, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
node = next((node for node in nodes if node[0] == self.mutual_iqn), None)
self.assertIsNotNone(node)
@@ -193,7 +207,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
self.addCleanup(self._force_lougout, self.mutual_iqn)
manager.Login(iqn, tpg, host, port, iface, options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
devs = glob.glob('/dev/disk/by-path/*%s*' % iqn)
self.assertEqual(len(devs), 1)
@@ -208,7 +223,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
self.assertIn(self.str_to_ay(devs[0]), symlinks)
manager.Logout(iqn, tpg, host, port, iface, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
devs = glob.glob('/dev/disk/by-path/*%s*' % iqn)
self.assertEqual(len(devs), 0)
@@ -228,7 +244,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
self.skipTest("ISCSI.Session objects not supported.")
nodes, _ = manager.DiscoverSendTargets(self.address, self.port, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
node = next((node for node in nodes if node[0] == self.noauth_iqn), None)
self.assertIsNotNone(node)
@@ -237,7 +254,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
self.addCleanup(self._force_lougout, self.noauth_iqn)
manager.Login(iqn, tpg, host, port, iface, self.no_options,
- dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator')
+ dbus_interface=self.iface_prefix + '.Manager.ISCSI.Initiator',
+ timeout=self.iscsi_timeout)
# /org/freedesktop/UDisks2/iscsi/sessionX should be created
udisks = self.get_object('')
@@ -260,7 +278,8 @@ class UdisksISCSITest(udiskstestcase.UdisksTestCase):
# logout using session
session.Logout(self.no_options,
- dbus_interface=self.iface_prefix + '.ISCSI.Session')
+ dbus_interface=self.iface_prefix + '.ISCSI.Session',
+ timeout=self.iscsi_timeout)
# make sure the session object is no longer on dbus
objects = udisks.GetManagedObjects(dbus_interface='org.freedesktop.DBus.ObjectManager')

View File

@ -0,0 +1,113 @@
From 28c39786927ad683f56c031d80a5c06f5b5b9aea Mon Sep 17 00:00:00 2001
From: Marius Vollmer <mvollmer@redhat.com>
Date: Tue, 5 Apr 2022 11:23:23 +0300
Subject: [PATCH] lvm2: Only install results of most recently started udpates
Fixes #966
---
modules/lvm2/udiskslinuxmodulelvm2.c | 13 ++++++++++++-
modules/lvm2/udiskslinuxvolumegroupobject.c | 12 ++++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/modules/lvm2/udiskslinuxmodulelvm2.c b/modules/lvm2/udiskslinuxmodulelvm2.c
index 8e1ea13aec..77ecf94a6d 100644
--- a/modules/lvm2/udiskslinuxmodulelvm2.c
+++ b/modules/lvm2/udiskslinuxmodulelvm2.c
@@ -59,6 +59,8 @@ struct _UDisksLinuxModuleLVM2 {
gint delayed_update_id;
gboolean coldplug_done;
+
+ guint32 update_epoch;
};
typedef struct _UDisksLinuxModuleLVM2Class UDisksLinuxModuleLVM2Class;
@@ -86,6 +88,7 @@ udisks_linux_module_lvm2_constructed (GObject *object)
module->name_to_volume_group = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_object_unref);
module->coldplug_done = FALSE;
+ module->update_epoch = 0;
if (G_OBJECT_CLASS (udisks_linux_module_lvm2_parent_class)->constructed)
G_OBJECT_CLASS (udisks_linux_module_lvm2_parent_class)->constructed (object);
@@ -221,6 +224,12 @@ lvm_update_vgs (GObject *source_obj,
gpointer key, value;
const gchar *vg_name;
+ if (GPOINTER_TO_UINT (user_data) != module->update_epoch)
+ {
+ vgs_pvs_data_free (data);
+ return;
+ }
+
if (! data)
{
if (error)
@@ -303,11 +312,13 @@ lvm_update (UDisksLinuxModuleLVM2 *module)
{
GTask *task;
+ module->update_epoch++;
+
/* the callback (lvm_update_vgs) is called in the default main loop (context) */
task = g_task_new (module,
NULL /* cancellable */,
lvm_update_vgs,
- NULL /* callback_data */);
+ GUINT_TO_POINTER (module->update_epoch));
/* holds a reference to 'task' until it is finished */
g_task_run_in_thread (task, (GTaskThreadFunc) vgs_task_func);
diff --git a/modules/lvm2/udiskslinuxvolumegroupobject.c b/modules/lvm2/udiskslinuxvolumegroupobject.c
index ce941cb250..ead08de7b1 100644
--- a/modules/lvm2/udiskslinuxvolumegroupobject.c
+++ b/modules/lvm2/udiskslinuxvolumegroupobject.c
@@ -66,6 +66,7 @@ struct _UDisksLinuxVolumeGroupObject
gchar *name;
GHashTable *logical_volumes;
+ guint32 update_epoch;
guint32 poll_epoch;
guint poll_timeout_id;
gboolean poll_requested;
@@ -99,6 +100,7 @@ static void crypttab_changed (UDisksCrypttabMonitor *monitor,
typedef struct {
BDLVMVGdata *vg_info;
GSList *vg_pvs;
+ guint32 epoch;
} VGUpdateData;
static void
@@ -183,6 +185,7 @@ udisks_linux_volume_group_object_set_property (GObject *__object,
static void
udisks_linux_volume_group_object_init (UDisksLinuxVolumeGroupObject *object)
{
+ object->update_epoch = 0;
object->poll_epoch = 0;
object->poll_timeout_id = 0;
object->poll_requested = FALSE;
@@ -575,6 +578,12 @@ update_vg (GObject *source_obj,
BDLVMVGdata *vg_info = data->vg_info;
GSList *vg_pvs = data->vg_pvs;
+ if (data->epoch != object->update_epoch)
+ {
+ lv_list_free (lvs);
+ return;
+ }
+
/* free the data container (but not 'vg_info' and 'vg_pvs') */
g_free (data);
@@ -711,8 +720,11 @@ udisks_linux_volume_group_object_update (UDisksLinuxVolumeGroupObject *object, B
gchar *vg_name = g_strdup (vg_info->name);
GTask *task = NULL;
+ object->update_epoch++;
+
data->vg_info = vg_info;
data->vg_pvs = pvs;
+ data->epoch = object->update_epoch;
/* the callback (update_vg) is called in the default main loop (context) */
task = g_task_new (g_object_ref (object), NULL /* cancellable */, update_vg, data /* callback_data */);

View File

@ -0,0 +1,26 @@
From f24601b1d1302350fff15f326bfe3cfabde05f4c Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 19 May 2023 17:17:56 +0200
Subject: [PATCH] lvm2: Trigger uevent sync on block devices when creating new
VG
This will likely slow down processing with the hope that
more objects have their properties updated properly.
---
modules/lvm2/udiskslinuxmanagerlvm2.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/modules/lvm2/udiskslinuxmanagerlvm2.c b/modules/lvm2/udiskslinuxmanagerlvm2.c
index b0c62fdcd6..5c06b921df 100644
--- a/modules/lvm2/udiskslinuxmanagerlvm2.c
+++ b/modules/lvm2/udiskslinuxmanagerlvm2.c
@@ -384,7 +384,8 @@ handle_volume_group_create (UDisksManagerLVM2 *_object,
UDisksObject *object_for_block;
object_for_block = udisks_daemon_util_dup_object (block, &error);
if (object_for_block != NULL)
- udisks_linux_block_object_trigger_uevent (UDISKS_LINUX_BLOCK_OBJECT (object_for_block));
+ udisks_linux_block_object_trigger_uevent_sync (UDISKS_LINUX_BLOCK_OBJECT (object_for_block),
+ UDISKS_DEFAULT_WAIT_TIMEOUT);
g_object_unref (object_for_block);
}

View File

@ -1,44 +0,0 @@
From cd458666a93fe9d07f3718e88f3169f01a11a63e Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 16 Apr 2021 18:36:16 +0200
Subject: [PATCH 7/8] udiskslinuxmdraidobject: Handle source attach failure
gracefully
Only negligible theoretical chance to hit this, reported by Coverity.
---
src/udiskslinuxmdraidobject.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/udiskslinuxmdraidobject.c b/src/udiskslinuxmdraidobject.c
index 20ca89c5..828c7058 100644
--- a/src/udiskslinuxmdraidobject.c
+++ b/src/udiskslinuxmdraidobject.c
@@ -468,7 +468,8 @@ watch_attr (UDisksLinuxDevice *device,
GError *error = NULL;
gchar *path = NULL;
GIOChannel *channel = NULL;
- GSource *ret = NULL;;
+ GSource *ret = NULL;
+ guint source_id;
g_return_val_if_fail (UDISKS_IS_LINUX_DEVICE (device), NULL);
@@ -478,9 +479,14 @@ watch_attr (UDisksLinuxDevice *device,
{
ret = g_io_create_watch (channel, G_IO_ERR);
g_source_set_callback (ret, callback, user_data, NULL);
- g_source_attach (ret, g_main_context_get_thread_default ());
+ source_id = g_source_attach (ret, g_main_context_get_thread_default ());
g_source_unref (ret);
g_io_channel_unref (channel); /* the keeps a reference to this object */
+ if (source_id == 0)
+ {
+ /* something bad happened while attaching the source */
+ ret = NULL;
+ }
}
else
{
--
2.30.2

View File

@ -1,47 +0,0 @@
From 0353b5f2f9c586d872750423259b6ef6cc375625 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 16 Apr 2021 18:22:46 +0200
Subject: [PATCH 6/8] udiskslinuxmdraidobject: Optimize unused data out from
the g_io_channel_read_to_end() call
Looking into glib sources the g_io_channel_read_to_end() function
can handle NULL output pointers just fine and since the data is thrown
right away it's pointless to have them assigned.
---
src/udiskslinuxmdraidobject.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/udiskslinuxmdraidobject.c b/src/udiskslinuxmdraidobject.c
index 759ff5f4..20ca89c5 100644
--- a/src/udiskslinuxmdraidobject.c
+++ b/src/udiskslinuxmdraidobject.c
@@ -503,8 +503,6 @@ attr_changed (GIOChannel *channel,
UDisksLinuxMDRaidObject *object = UDISKS_LINUX_MDRAID_OBJECT (user_data);
gboolean bail = FALSE;
GError *error = NULL;
- gchar *str = NULL;
- gsize len = 0;
if (cond & ~G_IO_ERR)
goto out;
@@ -518,7 +516,7 @@ attr_changed (GIOChannel *channel,
goto out;
}
- if (g_io_channel_read_to_end (channel, &str, &len, &error) != G_IO_STATUS_NORMAL)
+ if (g_io_channel_read_to_end (channel, NULL, NULL, &error) != G_IO_STATUS_NORMAL)
{
udisks_debug ("Error reading (uuid %s): %s (%s, %d)",
object->uuid, error->message, g_quark_to_string (error->domain), error->code);
@@ -527,8 +525,6 @@ attr_changed (GIOChannel *channel,
goto out;
}
- g_free (str);
-
/* synthesize uevent */
if (object->raid_device != NULL)
udisks_linux_mdraid_object_uevent (object, "change", object->raid_device, FALSE);
--
2.30.2

View File

@ -1,136 +0,0 @@
commit e062c17e3829f3c04c25b5f6fc17ccc4491befa8
Author: Tomas Bzatek <tbzatek@redhat.com>
Date: Tue Mar 23 16:48:08 2021 +0100
modules: Limit module name to alphanumeric characters and -_ separators
A hardening feature as long as the module name is directly involved
in filename creation.
diff --git a/doc/udisks2-sections.txt.daemon.sections.in b/doc/udisks2-sections.txt.daemon.sections.in
index 16eaf74e..204ca897 100644
--- a/doc/udisks2-sections.txt.daemon.sections.in
+++ b/doc/udisks2-sections.txt.daemon.sections.in
@@ -312,6 +312,7 @@ udisks_daemon_util_get_free_mdraid_device
udisks_ata_identify_get_word
udisks_daemon_util_trigger_uevent
udisks_daemon_util_trigger_uevent_sync
+udisks_module_validate_name
</SECTION>
<SECTION>
diff --git a/src/udisksconfigmanager.c b/src/udisksconfigmanager.c
index 9558e276..5868e864 100644
--- a/src/udisksconfigmanager.c
+++ b/src/udisksconfigmanager.c
@@ -26,6 +26,7 @@
#include "udiskslogging.h"
#include "udisksdaemontypes.h"
#include "udisksconfigmanager.h"
+#include "udisksdaemonutil.h"
struct _UDisksConfigManager {
GObject parent_instance;
@@ -60,6 +61,8 @@ enum
#define DEFAULTS_GROUP_NAME "defaults"
#define DEFAULTS_ENCRYPTION_KEY "encryption"
+#define MODULES_ALL_ARG "*"
+
static void
udisks_config_manager_get_property (GObject *object,
guint property_id,
@@ -170,7 +173,16 @@ parse_config_file (UDisksConfigManager *manager,
{
modules_tmp = modules;
for (module_i = *modules_tmp; module_i; module_i = *++modules_tmp)
- *out_modules = g_list_append (*out_modules, g_strdup (g_strstrip (module_i)));
+ {
+ g_strstrip (module_i);
+ if (! udisks_module_validate_name (module_i) && !g_str_equal (module_i, MODULES_ALL_ARG))
+ {
+ g_warning ("Invalid module name '%s' specified in the %s config file.",
+ module_i, conf_filename);
+ continue;
+ }
+ *out_modules = g_list_append (*out_modules, g_strdup (module_i));
+ }
g_strfreev (modules);
}
}
@@ -397,7 +409,7 @@ udisks_config_manager_get_modules_all (UDisksConfigManager *manager)
parse_config_file (manager, NULL, NULL, &modules);
- ret = !modules || (g_strcmp0 (modules->data, "*") == 0 && g_list_length (modules) == 1);
+ ret = !modules || (g_strcmp0 (modules->data, MODULES_ALL_ARG) == 0 && g_list_length (modules) == 1);
g_list_free_full (modules, (GDestroyNotify) g_free);
diff --git a/src/udisksdaemonutil.c b/src/udisksdaemonutil.c
index 60134765..1695b524 100644
--- a/src/udisksdaemonutil.c
+++ b/src/udisksdaemonutil.c
@@ -1880,3 +1880,29 @@ udisks_daemon_util_trigger_uevent_sync (UDisksDaemon *daemon,
}
/* ---------------------------------------------------------------------------------------------------- */
+
+/**
+ * udisks_module_validate_name:
+ * @module_name: A udisks2 module name.
+ *
+ * Checks the string for a valid udisks2 module name. Only alphanumeric characters
+ * along with the '-' and '_' separators are permitted.
+ *
+ * Returns: %TRUE if the string is a valid udisks2 module name, %FALSE otherwise.
+ */
+gboolean
+udisks_module_validate_name (const gchar *module_name)
+{
+ int i;
+
+ for (i = 0; module_name[i] != '\0'; i++)
+ /* going ASCII, will disqualify any UTF-* string */
+ if (! g_ascii_isalnum (module_name[i]) &&
+ module_name[i] != '-' &&
+ module_name[i] != '_')
+ return FALSE;
+
+ return TRUE;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
diff --git a/src/udisksdaemonutil.h b/src/udisksdaemonutil.h
index 2d7ac981..df584de4 100644
--- a/src/udisksdaemonutil.h
+++ b/src/udisksdaemonutil.h
@@ -129,6 +129,8 @@ gchar *udisks_daemon_util_get_free_mdraid_device (void);
guint16 udisks_ata_identify_get_word (const guchar *identify_data, guint word_number);
+gboolean udisks_module_validate_name (const gchar *module_name);
+
/* Utility macro for policy verification. */
#define UDISKS_DAEMON_CHECK_AUTHORIZATION(daemon, \
object, \
diff --git a/src/udiskslinuxmanager.c b/src/udiskslinuxmanager.c
index 8af65d97..26d8a5d7 100644
--- a/src/udiskslinuxmanager.c
+++ b/src/udiskslinuxmanager.c
@@ -956,6 +956,15 @@ handle_enable_module (UDisksManager *object,
UDisksLinuxManager *manager = UDISKS_LINUX_MANAGER (object);
EnableModulesData *data;
+ if (! udisks_module_validate_name (arg_name))
+ {
+ g_dbus_method_invocation_return_error (invocation,
+ G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
+ "Requested module name '%s' is not a valid udisks2 module name.",
+ arg_name);
+ return TRUE;
+ }
+
if (! arg_enable)
{
/* TODO: implement proper module unloading */

View File

@ -43,7 +43,7 @@ index 3187367e..e91bd02f 100644
'''Noninvasive tests for the Drive.Ata interface'''
def get_smart_setting(self, disk, attr, out_prefix):
@@ -102,6 +102,7 @@ class UdisksDriveAtaTest(UdisksTestCase):
@@ -102,6 +102,7 @@ class UdisksDriveAtaTest(UdisksTestCase)
intro_data = drive_intro.Introspect()
self.assertNotIn('interface name="org.freedesktop.UDisks2.Drive.Ata"', intro_data)
@ -51,8 +51,8 @@ index 3187367e..e91bd02f 100644
@unittest.skipUnless(smart_supported, "No disks supporting S.M.A.R.T. available")
def test_properties(self):
for disk in smart_supported:
@@ -148,6 +149,7 @@ class UdisksDriveAtaTest(UdisksTestCase):
# ninth field is the raw value
@@ -148,6 +149,7 @@ class UdisksDriveAtaTest(UdisksTestCase)
# nineth field is the raw value
self.assertEqual(int(pwon_s.value / 3600), int(pwon_attr[8]))
+ @udiskstestcase.tag_test(udiskstestcase.TestTags.UNSTABLE)

View File

@ -0,0 +1,30 @@
From 486778c778a4ddb24395408c6b267e702e19ae02 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Sat, 1 Jan 2022 22:01:49 +0100
Subject: [PATCH] udiskslinuxencrypted: Fix GError ownership
---
src/udiskslinuxencrypted.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/udiskslinuxencrypted.c b/src/udiskslinuxencrypted.c
index c3a0821ac..3bc54e695 100644
--- a/src/udiskslinuxencrypted.c
+++ b/src/udiskslinuxencrypted.c
@@ -1040,7 +1040,7 @@ handle_resize (UDisksEncrypted *encrypted,
object = udisks_daemon_util_dup_object (encrypted, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -1066,7 +1066,6 @@ handle_resize (UDisksEncrypted *encrypted,
if (!udisks_daemon_util_get_caller_uid_sync (daemon, invocation, NULL /* GCancellable */, &caller_uid, &error))
{
g_dbus_method_invocation_return_gerror (invocation, error);
- g_clear_error (&error);
goto out;
}

View File

@ -0,0 +1,49 @@
From 223256777f6e269b8501d95a64c4c6095a7a8a3e Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Sat, 1 Jan 2022 22:02:17 +0100
Subject: [PATCH] udiskslinuxfilesystem: Fix GError ownership
---
src/udiskslinuxfilesystem.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/udiskslinuxfilesystem.c b/src/udiskslinuxfilesystem.c
index f7c99757a..a8390a044 100644
--- a/src/udiskslinuxfilesystem.c
+++ b/src/udiskslinuxfilesystem.c
@@ -1739,7 +1739,7 @@ handle_resize (UDisksFilesystem *filesystem,
object = udisks_daemon_util_dup_object (filesystem, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -1921,7 +1921,7 @@ handle_repair (UDisksFilesystem *filesystem,
object = udisks_daemon_util_dup_object (filesystem, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -2089,7 +2089,7 @@ handle_check (UDisksFilesystem *filesystem,
object = udisks_daemon_util_dup_object (filesystem, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -2257,7 +2257,7 @@ handle_take_ownership (UDisksFilesystem *filesystem,
object = udisks_daemon_util_dup_object (filesystem, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}

View File

@ -0,0 +1,70 @@
From 7c9933c0f80faaabbed607983fdf77f8c4562df6 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Sat, 1 Jan 2022 20:11:57 +0100
Subject: [PATCH] udiskslinuxpartition: Fix GError ownership
---
src/udiskslinuxpartition.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/src/udiskslinuxpartition.c b/src/udiskslinuxpartition.c
index 5461b3903..3d970768d 100644
--- a/src/udiskslinuxpartition.c
+++ b/src/udiskslinuxpartition.c
@@ -135,8 +135,7 @@ check_authorization (UDisksPartition *partition,
caller_uid,
&error))
{
- g_dbus_method_invocation_return_gerror (invocation, error);
- g_clear_error (&error);
+ g_dbus_method_invocation_take_error (invocation, error);
goto out;
}
@@ -351,7 +350,7 @@ handle_set_flags (UDisksPartition *partition,
object = udisks_daemon_util_dup_object (partition, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -499,7 +498,7 @@ handle_set_name (UDisksPartition *partition,
object = udisks_daemon_util_dup_object (partition, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -873,7 +872,7 @@ handle_resize (UDisksPartition *partition,
object = udisks_daemon_util_dup_object (partition, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -994,7 +993,7 @@ handle_delete (UDisksPartition *partition,
object = udisks_daemon_util_dup_object (partition, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -1012,9 +1011,7 @@ handle_delete (UDisksPartition *partition,
if (!udisks_linux_block_teardown (block, invocation, options, &error))
{
if (invocation != NULL)
- g_dbus_method_invocation_take_error (invocation, error);
- else
- g_clear_error (&error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
}

View File

@ -0,0 +1,73 @@
From f486a9fa22c2f9785a4a8fc58eb3be7b0cf934ce Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Sat, 1 Jan 2022 19:59:27 +0100
Subject: [PATCH] udiskslinuxpartitiontable: Fix GError ownership
---
src/udiskslinuxpartitiontable.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/src/udiskslinuxpartitiontable.c b/src/udiskslinuxpartitiontable.c
index b4c301095..14a54c9c7 100644
--- a/src/udiskslinuxpartitiontable.c
+++ b/src/udiskslinuxpartitiontable.c
@@ -277,7 +277,7 @@ udisks_linux_partition_table_handle_create_partition (UDisksPartitionTable *ta
object = udisks_daemon_util_dup_object (table, &error);
if (object == NULL)
{
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
goto out;
}
@@ -293,7 +293,6 @@ udisks_linux_partition_table_handle_create_partition (UDisksPartitionTable *ta
goto out;
}
- error = NULL;
if (!udisks_daemon_util_get_caller_uid_sync (daemon,
invocation,
NULL /* GCancellable */,
@@ -301,7 +300,6 @@ udisks_linux_partition_table_handle_create_partition (UDisksPartitionTable *ta
&error))
{
g_dbus_method_invocation_return_gerror (invocation, error);
- g_clear_error (&error);
goto out;
}
@@ -464,7 +462,7 @@ udisks_linux_partition_table_handle_create_partition (UDisksPartitionTable *ta
if (!bd_part_set_part_name (device_name, part_spec->path, name, &error))
{
g_prefix_error (&error, "Error setting name for newly created partition: ");
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
udisks_simple_job_complete (UDISKS_SIMPLE_JOB (job), FALSE, error->message);
goto out;
}
@@ -483,7 +481,7 @@ udisks_linux_partition_table_handle_create_partition (UDisksPartitionTable *ta
if (!ret)
{
g_prefix_error (&error, "Error setting type for newly created partition: ");
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
udisks_simple_job_complete (UDISKS_SIMPLE_JOB (job), FALSE, error->message);
goto out;
}
@@ -520,7 +518,6 @@ udisks_linux_partition_table_handle_create_partition (UDisksPartitionTable *ta
/* sit and wait for the partition to show up */
g_warn_if_fail (wait_data->pos_to_wait_for > 0);
wait_data->partition_table_object = object;
- error = NULL;
partition_object = udisks_daemon_wait_for_object_sync (daemon,
wait_for_partition,
wait_data,
@@ -530,7 +527,7 @@ udisks_linux_partition_table_handle_create_partition (UDisksPartitionTable *ta
if (partition_object == NULL)
{
g_prefix_error (&error, "Error waiting for partition to appear: ");
- g_dbus_method_invocation_take_error (invocation, error);
+ g_dbus_method_invocation_return_gerror (invocation, error);
udisks_simple_job_complete (UDISKS_SIMPLE_JOB (job), FALSE, error->message);
goto out;
}

View File

@ -0,0 +1,25 @@
From 0edd6f5579c964323d86897aff9476c20d7901ba Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon, 22 Nov 2021 14:23:08 +0100
Subject: [PATCH] tests: Do not check that writeAmplificationRatio is bigger
than 0
Apparently the bios_in_write value is now 0 for newly created VDO
pools and because we use it for the writeAmplificationRatio
calculation we get zero too.
---
src/tests/dbus-tests/test_20_LVM.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/tests/dbus-tests/test_20_LVM.py b/src/tests/dbus-tests/test_20_LVM.py
index 7fbff0434..fde7c3f3f 100644
--- a/src/tests/dbus-tests/test_20_LVM.py
+++ b/src/tests/dbus-tests/test_20_LVM.py
@@ -508,7 +508,6 @@ def test_create(self):
# get statistics and do some simple sanity check
stats = lv.GetStatistics(self.no_options, dbus_interface=self.iface_prefix + '.VDOVolume')
self.assertIn("writeAmplificationRatio", stats.keys())
- self.assertGreater(float(stats["writeAmplificationRatio"]), 0)
def test_enable_disable_compression_deduplication(self):
vgname = 'udisks_test_vdo_vg'

View File

@ -0,0 +1,190 @@
From e039516b103eb9749a3e261c5ee1a9bc110676cf Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 26 Jun 2020 17:42:32 +0200
Subject: [PATCH 1/8] daemon: Always flush interface property changes
Setting properties on a GDBusInterfaceSkeleton from the main thread
as a result of uevent is somewhat racy to clients that are waiting
for a method call to return that is processed in a separate thread
by the daemon. Perhaps there's a race in the GDBus worker thread
that processes changes from both threads and send them out on the bus.
Explicit flush on GDBusInterfaceSkeleton interfaces seems to fix
the issue. Such approach was used before on some places, this change
adds explicit flushes at all places where properties may change.
---
src/udiskslinuxblock.c | 2 ++
src/udiskslinuxdrive.c | 1 +
src/udiskslinuxdriveata.c | 5 +++++
src/udiskslinuxencrypted.c | 5 +++++
src/udiskslinuxfilesystem.c | 3 +++
src/udiskslinuxloop.c | 1 +
src/udiskslinuxmdraid.c | 1 +
src/udiskslinuxpartition.c | 2 ++
src/udiskslinuxpartitiontable.c | 1 +
src/udiskslinuxswapspace.c | 1 +
10 files changed, 22 insertions(+)
diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c
index ddc7fe1f..34d73f0e 100644
--- a/src/udiskslinuxblock.c
+++ b/src/udiskslinuxblock.c
@@ -893,6 +893,7 @@ update_configuration (UDisksLinuxBlock *block,
configuration = g_variant_new ("a(sa{sv})", NULL);
}
udisks_block_set_configuration (UDISKS_BLOCK (block), configuration);
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (block));
}
#ifdef HAVE_LIBMOUNT_UTAB
@@ -1280,6 +1281,7 @@ udisks_linux_block_update (UDisksLinuxBlock *block,
update_mdraid (block, device, drive, object_manager);
out:
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (block));
if (device != NULL)
g_object_unref (device);
if (drive != NULL)
diff --git a/src/udiskslinuxdrive.c b/src/udiskslinuxdrive.c
index e9dd7117..28a90ce9 100644
--- a/src/udiskslinuxdrive.c
+++ b/src/udiskslinuxdrive.c
@@ -950,6 +950,7 @@ udisks_linux_drive_update (UDisksLinuxDrive *drive,
ret = update_configuration (drive, object);
out:
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (drive));
if (device != NULL)
g_clear_object (&device);
diff --git a/src/udiskslinuxdriveata.c b/src/udiskslinuxdriveata.c
index d65f3254..4ba66d09 100644
--- a/src/udiskslinuxdriveata.c
+++ b/src/udiskslinuxdriveata.c
@@ -339,6 +339,8 @@ udisks_linux_drive_ata_update (UDisksLinuxDriveAta *drive,
update_security (drive, device);
out:
+ /* ensure property changes are sent before the method return */
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (drive));
if (device != NULL)
g_object_unref (device);
@@ -681,6 +683,9 @@ udisks_linux_drive_ata_refresh_smart_sync (UDisksLinuxDriveAta *drive,
/* update stats again to account for the IO we just did to read the SMART info */
update_io_stats (drive, device);
+ /* ensure property changes are sent before the method return */
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (drive));
+
out:
g_clear_object (&device);
if (d != NULL)
diff --git a/src/udiskslinuxencrypted.c b/src/udiskslinuxencrypted.c
index 73c78873..8a230fda 100644
--- a/src/udiskslinuxencrypted.c
+++ b/src/udiskslinuxencrypted.c
@@ -237,6 +237,8 @@ udisks_linux_encrypted_update (UDisksLinuxEncrypted *encrypted,
update_metadata_size (encrypted, object);
udisks_linux_block_encrypted_unlock (block);
+
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (encrypted));
}
/* ---------------------------------------------------------------------------------------------------- */
@@ -630,6 +632,9 @@ handle_unlock (UDisksEncrypted *encrypted,
g_udev_device_get_sysfs_attr (cleartext_device->udev_device, "dm/uuid"),
caller_uid);
+ /* ensure property changes are sent before the method return */
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (encrypted));
+
udisks_encrypted_complete_unlock (encrypted,
invocation,
g_dbus_object_get_object_path (G_DBUS_OBJECT (cleartext_object)));
diff --git a/src/udiskslinuxfilesystem.c b/src/udiskslinuxfilesystem.c
index 669fc40b..3ae11c32 100644
--- a/src/udiskslinuxfilesystem.c
+++ b/src/udiskslinuxfilesystem.c
@@ -277,6 +277,8 @@ udisks_linux_filesystem_update (UDisksLinuxFilesystem *filesystem,
if (! skip_fs_size)
udisks_filesystem_set_size (UDISKS_FILESYSTEM (filesystem), get_filesystem_size (object));
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (filesystem));
+
g_object_unref (device);
}
@@ -1865,6 +1867,7 @@ handle_resize (UDisksFilesystem *filesystem,
UDISKS_DEFAULT_WAIT_TIMEOUT);
udisks_filesystem_set_size (filesystem, get_filesystem_size (UDISKS_LINUX_BLOCK_OBJECT (object)));
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (filesystem));
udisks_filesystem_complete_resize (filesystem, invocation);
udisks_simple_job_complete (UDISKS_SIMPLE_JOB (job), TRUE, NULL);
diff --git a/src/udiskslinuxloop.c b/src/udiskslinuxloop.c
index 6c8a4561..5d7e3553 100644
--- a/src/udiskslinuxloop.c
+++ b/src/udiskslinuxloop.c
@@ -187,6 +187,7 @@ udisks_linux_loop_update (UDisksLinuxLoop *loop,
}
udisks_loop_set_setup_by_uid (UDISKS_LOOP (loop), setup_by_uid);
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (loop));
g_object_unref (device);
}
diff --git a/src/udiskslinuxmdraid.c b/src/udiskslinuxmdraid.c
index 85fc2a3b..7eca9764 100644
--- a/src/udiskslinuxmdraid.c
+++ b/src/udiskslinuxmdraid.c
@@ -512,6 +512,7 @@ udisks_linux_mdraid_update (UDisksLinuxMDRaid *mdraid,
uuid));
out:
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (mdraid));
if (raid_data)
bd_md_examine_data_free (raid_data);
g_free (sync_completed);
diff --git a/src/udiskslinuxpartition.c b/src/udiskslinuxpartition.c
index 97ba02fe..ff0fdfc0 100644
--- a/src/udiskslinuxpartition.c
+++ b/src/udiskslinuxpartition.c
@@ -312,6 +312,8 @@ udisks_linux_partition_update (UDisksLinuxPartition *partition,
udisks_partition_set_is_container (UDISKS_PARTITION (partition), is_container);
udisks_partition_set_is_contained (UDISKS_PARTITION (partition), is_contained);
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (partition));
+
g_free (name);
g_clear_object (&device);
g_clear_object (&disk_block_object);
diff --git a/src/udiskslinuxpartitiontable.c b/src/udiskslinuxpartitiontable.c
index b26849bc..e43a0708 100644
--- a/src/udiskslinuxpartitiontable.c
+++ b/src/udiskslinuxpartitiontable.c
@@ -146,6 +146,7 @@ udisks_linux_partition_table_update (UDisksLinuxPartitionTable *table,
udisks_partition_table_set_partitions (UDISKS_PARTITION_TABLE (table),
partition_object_paths);
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (table));
g_free (partition_object_paths);
diff --git a/src/udiskslinuxswapspace.c b/src/udiskslinuxswapspace.c
index ee103528..bb47f3d4 100644
--- a/src/udiskslinuxswapspace.c
+++ b/src/udiskslinuxswapspace.c
@@ -127,6 +127,7 @@ udisks_linux_swapspace_update (UDisksLinuxSwapspace *swapspace,
active = TRUE;
udisks_swapspace_set_active (UDISKS_SWAPSPACE (swapspace), active);
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (swapspace));
g_object_unref (device);
}
--
2.26.2

View File

@ -0,0 +1,39 @@
commit 214d65ae4d2b779fc1674420a042082ae029eb6b
Author: Vojtech Trefny <vtrefny@redhat.com>
Date: Mon Jul 13 16:16:47 2020 +0200
dbus_tests: Fix getting list of SATA drives for Drive.ATA test
Resolves: rhbz#1855785
diff --git a/src/tests/dbus-tests/test_drive_ata.py b/src/tests/dbus-tests/test_drive_ata.py
index ff6d01cc..df298a9c 100644
--- a/src/tests/dbus-tests/test_drive_ata.py
+++ b/src/tests/dbus-tests/test_drive_ata.py
@@ -14,8 +14,24 @@ SMART_ATA_CHECKSUM_FAIL = 1 << 2
smart_unsupported = set()
smart_supported = set()
-sata_disks = (dev for dev in os.listdir("/dev") if re.match(r'sd[a-z]+$', dev))
-for disk in sata_disks:
+
+DISK_PATH = "/dev/disk/by-path/"
+
+
+def _get_sata_disks():
+ sata_disks = []
+ by_path = os.listdir(DISK_PATH)
+ for dev in by_path:
+ if "ata" in dev and "part" not in dev:
+ path = os.path.realpath(os.path.join(DISK_PATH, dev))
+ name = os.path.basename(path)
+ if name.startswith("sd"):
+ # ignore devices like CD drives etc.
+ sata_disks.append(name)
+ return sata_disks
+
+
+for disk in _get_sata_disks():
ret, out = UdisksTestCase.run_command("smartctl -a /dev/%s" % disk)
# Only the following bits in the exit status mean the device failed to

View File

@ -0,0 +1,25 @@
From 195f3b030de32f5993da736c75e6a9bd76e6a7c7 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 26 Jun 2020 17:56:39 +0200
Subject: [PATCH 5/8] iscsi: Always flush interface property changes
---
modules/iscsi/udiskslinuxiscsisessionobject.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/modules/iscsi/udiskslinuxiscsisessionobject.c b/modules/iscsi/udiskslinuxiscsisessionobject.c
index 9e525e3f..a43cecd1 100644
--- a/modules/iscsi/udiskslinuxiscsisessionobject.c
+++ b/modules/iscsi/udiskslinuxiscsisessionobject.c
@@ -355,6 +355,8 @@ udisks_linux_iscsi_session_object_update_iface (UDisksLinuxISCSISessionObject *s
udisks_iscsi_session_set_lu_reset_timeout (iface, session_info.tmo.lu_reset_tmo);
udisks_iscsi_session_set_recovery_timeout (iface, session_info.tmo.recovery_tmo);
udisks_iscsi_session_set_tgt_reset_timeout (iface, session_info.tmo.tgt_reset_tmo);
+
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (iface));
}
static gboolean
--
2.26.2

View File

@ -0,0 +1,25 @@
From 861a0d8721536e2d210b79c845bb4f5b266b037f Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 26 Jun 2020 17:57:01 +0200
Subject: [PATCH 6/8] lsm: Always flush interface property changes
---
modules/lsm/lsm_linux_drive.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/modules/lsm/lsm_linux_drive.c b/modules/lsm/lsm_linux_drive.c
index 19e68c2f..6433c308 100644
--- a/modules/lsm/lsm_linux_drive.c
+++ b/modules/lsm/lsm_linux_drive.c
@@ -220,6 +220,8 @@ _fill_drive_lsm (UDisksLinuxDriveLSM *drive_lsm,
udisks_drive_lsm_set_min_io_size (std_drv_lsm, lsm_vol_data->min_io_size);
udisks_drive_lsm_set_opt_io_size (std_drv_lsm, lsm_vol_data->opt_io_size);
udisks_drive_lsm_set_raid_disk_count (std_drv_lsm, lsm_vol_data->raid_disk_count);
+
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (std_drv_lsm));
}
--
2.26.2

View File

@ -0,0 +1,110 @@
From 39d13907f712269bb9debd0fd8a0852347c98136 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 26 Jun 2020 17:55:53 +0200
Subject: [PATCH 2/8] lvm2: Always flush interface property changes
---
modules/lvm2/udiskslinuxlogicalvolume.c | 3 +++
modules/lvm2/udiskslinuxphysicalvolume.c | 2 ++
modules/lvm2/udiskslinuxvdovolume.c | 2 ++
modules/lvm2/udiskslinuxvolumegroup.c | 3 +++
modules/lvm2/udiskslinuxvolumegroupobject.c | 3 +++
5 files changed, 13 insertions(+)
diff --git a/modules/lvm2/udiskslinuxlogicalvolume.c b/modules/lvm2/udiskslinuxlogicalvolume.c
index 373cee2e..c0f074d8 100644
--- a/modules/lvm2/udiskslinuxlogicalvolume.c
+++ b/modules/lvm2/udiskslinuxlogicalvolume.c
@@ -229,6 +229,8 @@ udisks_linux_logical_volume_update (UDisksLinuxLogicalVolume *logical_volume
logical_volume->needs_udev_hack = FALSE;
g_free (dev_file);
}
+
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (iface));
}
void
@@ -248,6 +250,7 @@ udisks_linux_logical_volume_update_etctabs (UDisksLinuxLogicalVolume *logica
udisks_logical_volume_set_child_configuration (iface,
udisks_linux_find_child_configuration (daemon,
uuid));
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (iface));
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/modules/lvm2/udiskslinuxphysicalvolume.c b/modules/lvm2/udiskslinuxphysicalvolume.c
index 27043030..36e7c322 100644
--- a/modules/lvm2/udiskslinuxphysicalvolume.c
+++ b/modules/lvm2/udiskslinuxphysicalvolume.c
@@ -143,6 +143,8 @@ udisks_linux_physical_volume_update (UDisksLinuxPhysicalVolume *physical_vo
udisks_physical_volume_set_size (iface, pv_info->pv_size);
udisks_physical_volume_set_free_size (iface, pv_info->pv_free);
}
+
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (iface));
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/modules/lvm2/udiskslinuxvdovolume.c b/modules/lvm2/udiskslinuxvdovolume.c
index 317eddc2..430e2814 100644
--- a/modules/lvm2/udiskslinuxvdovolume.c
+++ b/modules/lvm2/udiskslinuxvdovolume.c
@@ -177,6 +177,8 @@ udisks_linux_vdo_volume_update (UDisksLinuxVDOVolume *vdo_volume,
udisks_vdo_volume_set_compression (iface, vdo_info->compression);
udisks_vdo_volume_set_deduplication (iface, vdo_info->deduplication);
+
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (iface));
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/modules/lvm2/udiskslinuxvolumegroup.c b/modules/lvm2/udiskslinuxvolumegroup.c
index aad2193e..3fbf6f02 100644
--- a/modules/lvm2/udiskslinuxvolumegroup.c
+++ b/modules/lvm2/udiskslinuxvolumegroup.c
@@ -136,11 +136,14 @@ udisks_linux_volume_group_update (UDisksLinuxVolumeGroup *volume_group,
gboolean *needs_polling_ret)
{
UDisksVolumeGroup *iface = UDISKS_VOLUME_GROUP (volume_group);
+
udisks_volume_group_set_name (iface, vg_info->name);
udisks_volume_group_set_uuid (iface, vg_info->uuid);
udisks_volume_group_set_size (iface, vg_info->size);
udisks_volume_group_set_free_size (iface, vg_info->free);
udisks_volume_group_set_extent_size (iface, vg_info->extent_size);
+
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (iface));
}
/* ---------------------------------------------------------------------------------------------------- */
diff --git a/modules/lvm2/udiskslinuxvolumegroupobject.c b/modules/lvm2/udiskslinuxvolumegroupobject.c
index 50e9c640..e3bc8dfc 100644
--- a/modules/lvm2/udiskslinuxvolumegroupobject.c
+++ b/modules/lvm2/udiskslinuxvolumegroupobject.c
@@ -442,6 +442,7 @@ block_object_update_lvm_iface (UDisksLinuxBlockObject *object,
udisks_linux_block_lvm2_update (UDISKS_LINUX_BLOCK_LVM2 (iface_block_lvm2), object);
udisks_block_lvm2_set_logical_volume (iface_block_lvm2, lv_obj_path);
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (iface_block_lvm2));
}
static void
@@ -456,6 +457,7 @@ lv_object_update_block_path (UDisksLinuxBlockObject *block_object,
{
block_objpath = g_dbus_object_get_object_path (G_DBUS_OBJECT (block_object));
udisks_logical_volume_set_block_device (UDISKS_LOGICAL_VOLUME (lv), block_objpath);
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (lv));
}
}
@@ -695,6 +697,7 @@ update_vg (GObject *source_obj,
bd_lvm_vgdata_free (vg_info);
lv_list_free (lvs);
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (object->iface_volume_group));
g_object_unref (object);
}
--
2.26.2

View File

@ -0,0 +1,34 @@
From 890a0f3ca8cb5894d1764752c98b90dcb6274d6d Mon Sep 17 00:00:00 2001
From: Vojtech Trefny <vtrefny@redhat.com>
Date: Tue, 9 Jun 2020 11:16:15 +0200
Subject: [PATCH] dbus-tests: Fix UdisksLVMVDOTest.test_resize_physical
1 GiB suddenly isn't enough for physical size grow, lets hope
2 GiB will be enough for everyone.
Resolves: rhzb#1845435
---
src/tests/dbus-tests/test_20_LVM.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/tests/dbus-tests/test_20_LVM.py b/src/tests/dbus-tests/test_20_LVM.py
index e238879a3..1073a2f90 100644
--- a/src/tests/dbus-tests/test_20_LVM.py
+++ b/src/tests/dbus-tests/test_20_LVM.py
@@ -576,6 +576,7 @@ def test_resize_logical(self):
dbus_size = self.get_property(lv, '.LogicalVolume', 'Size')
dbus_size.assertEqual(vsize * 5)
+ @udiskstestcase.tag_test(udiskstestcase.TestTags.UNSTABLE)
def test_resize_physical(self):
vgname = 'udisks_test_vdo_vg'
@@ -586,7 +587,7 @@ def test_resize_physical(self):
vg_free = self.get_property(vg, '.VolumeGroup', 'FreeSize')
lv_name = 'udisks_test_vdovlv'
pool_name = 'udisks_test_vdopool'
- psize = vg_free.value - 1 * 1024**3
+ psize = vg_free.value - 2 * 1024**3
vsize = psize * 5
lv_path = vg.CreateVDOVolume(lv_name, pool_name, dbus.UInt64(psize), dbus.UInt64(vsize),
dbus.UInt64(0), True, True, "auto", self.no_options,

View File

@ -0,0 +1,29 @@
From fdf6b233df960e6903c62b86735d86c59d967d12 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 19 Jun 2020 19:12:07 +0200
Subject: [PATCH] udiskslinuxblock: Fix fstab records matching by needle
Apparently mnt_fs_match_options() is not suitable for this use case.
---
src/udiskslinuxblock.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/udiskslinuxblock.c b/src/udiskslinuxblock.c
index 888ec634..d5be8e4c 100644
--- a/src/udiskslinuxblock.c
+++ b/src/udiskslinuxblock.c
@@ -575,7 +575,10 @@ find_fstab_entries (UDisksDaemon *daemon,
}
else if (needle != NULL)
{
- if (mnt_fs_match_options (fs, needle) == 0)
+ const char *opts;
+
+ opts = mnt_fs_get_options (fs);
+ if (! opts || g_strstr_len (opts, -1, needle) == NULL)
continue;
}
--
2.26.2

View File

@ -0,0 +1,24 @@
From 724ff8679e0ae0fd4d84f4e6c1b36007e648e8ca Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 26 Jun 2020 17:57:12 +0200
Subject: [PATCH 7/8] zram: Always flush interface property changes
---
modules/zram/udiskslinuxblockzram.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/modules/zram/udiskslinuxblockzram.c b/modules/zram/udiskslinuxblockzram.c
index 132d4174..1bae3686 100644
--- a/modules/zram/udiskslinuxblockzram.c
+++ b/modules/zram/udiskslinuxblockzram.c
@@ -277,6 +277,7 @@ udisks_linux_block_zram_update (UDisksLinuxBlockZRAM *zramblock,
udisks_block_zram_set_active (iface, bd_swap_swapstatus (dev_file, &error));
out:
+ g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON (iface));
if (zram_info)
bd_kbd_zram_stats_free (zram_info);
if (error)
--
2.26.2

View File

@ -0,0 +1,528 @@
From 8d5c90a1f4bbe548a1ae361f8d69970669d6e72e Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 13 Nov 2020 16:52:11 +0100
Subject: [PATCH 1/2] udisksdaemonutil: Refactor
udisks_daemon_util_trigger_uevent() out of UDisksLinuxBlockObject
This decouples uevent triggering from UDisksLinuxBlockObject as sometimes
we don't have a block object yet or it's outdated.
---
doc/udisks2-sections.txt.daemon.sections.in | 2 +
src/udisksdaemonutil.c | 230 ++++++++++++++++++++
src/udisksdaemonutil.h | 7 +
src/udiskslinuxblockobject.c | 180 ++-------------
4 files changed, 253 insertions(+), 166 deletions(-)
diff --git a/doc/udisks2-sections.txt.daemon.sections.in b/doc/udisks2-sections.txt.daemon.sections.in
index 26c3c2cd..3030fa95 100644
--- a/doc/udisks2-sections.txt.daemon.sections.in
+++ b/doc/udisks2-sections.txt.daemon.sections.in
@@ -307,6 +307,8 @@ udisks_daemon_util_file_set_contents
udisks_daemon_util_on_user_seat
udisks_daemon_util_get_free_mdraid_device
udisks_ata_identify_get_word
+udisks_daemon_util_trigger_uevent
+udisks_daemon_util_trigger_uevent_sync
</SECTION>
<SECTION>
diff --git a/src/udisksdaemonutil.c b/src/udisksdaemonutil.c
index 75b877a0..d16c0766 100644
--- a/src/udisksdaemonutil.c
+++ b/src/udisksdaemonutil.c
@@ -34,10 +34,14 @@
#include <limits.h>
#include <stdlib.h>
+#include <blockdev/blockdev.h>
+
#include "udisksdaemon.h"
#include "udisksdaemonutil.h"
#include "udisksstate.h"
#include "udiskslogging.h"
+#include "udiskslinuxdevice.h"
+#include "udiskslinuxprovider.h"
#include "udiskslinuxblockobject.h"
#include "udiskslinuxdriveobject.h"
@@ -1626,3 +1630,229 @@ udisks_ata_identify_get_word (const guchar *identify_data, guint word_number)
out:
return ret;
}
+
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static volatile guint uevent_serial = 0;
+
+static gboolean
+trigger_uevent (const gchar *path, const gchar *str)
+{
+ gint fd;
+
+ fd = open (path, O_WRONLY);
+ if (fd < 0)
+ {
+ udisks_warning ("Error opening %s while triggering uevent: %m", path);
+ return FALSE;
+ }
+
+ if (write (fd, str, strlen (str)) != (ssize_t) strlen (str))
+ {
+ udisks_warning ("Error writing '%s' to file %s: %m", str, path);
+ close (fd);
+ return FALSE;
+ }
+
+ close (fd);
+ return TRUE;
+}
+
+typedef struct
+{
+ UDisksDaemon *daemon;
+ GMainLoop *main_loop;
+ guint serial;
+ gchar *uevent_path;
+ gboolean success;
+} SynthUeventData;
+
+static gboolean
+trigger_uevent_idle_cb (gpointer user_data)
+{
+ SynthUeventData *data = user_data;
+ gchar *str;
+
+ str = g_strdup_printf ("change %s UDISKSSERIAL=%u", udisks_daemon_get_uuid (data->daemon), data->serial);
+
+ if (! trigger_uevent (data->uevent_path, str))
+ {
+ /* kernel refused our string, try simple "change" but don't wait for it */
+ trigger_uevent (data->uevent_path, "change");
+ data->success = FALSE;
+ g_main_loop_quit (data->main_loop);
+ }
+ g_free (str);
+
+ /* remove the source */
+ return FALSE;
+}
+
+static gboolean
+uevent_wait_timeout_cb (gpointer user_data)
+{
+ SynthUeventData *data = user_data;
+
+ data->success = FALSE;
+ g_main_loop_quit (data->main_loop);
+
+ /* remove the source */
+ return FALSE;
+}
+
+static void
+uevent_probed_cb (UDisksLinuxProvider *provider,
+ const gchar *action,
+ UDisksLinuxDevice *device,
+ gpointer user_data)
+{
+ SynthUeventData *data = user_data;
+ const gchar *received_serial_str;
+ gint64 received_serial;
+ gchar *endptr;
+
+ received_serial_str = g_udev_device_get_property (device->udev_device, "SYNTH_ARG_UDISKSSERIAL");
+ if (received_serial_str != NULL)
+ {
+ endptr = (gchar *) received_serial_str;
+ received_serial = g_ascii_strtoll (received_serial_str, &endptr, 0);
+ if (endptr != received_serial_str && received_serial == data->serial)
+ {
+ data->success = TRUE;
+ g_main_loop_quit (data->main_loop);
+ }
+ }
+}
+
+/**
+ * udisks_daemon_util_trigger_uevent:
+ * @daemon: A #UDisksDaemon.
+ * @device_path: Block device path.
+ *
+ * Triggers a 'change' uevent in the kernel.
+ *
+ * The triggered event will bubble up from the kernel through the udev
+ * stack and will eventually be received by the udisks daemon process
+ * itself. This method does not wait for the event to be received.
+ */
+void
+udisks_daemon_util_trigger_uevent (UDisksDaemon *daemon,
+ const gchar *device_path)
+{
+ GUdevClient *gudev_client;
+ GUdevDevice *gudev_device;
+ gchar *path;
+
+ g_return_if_fail (UDISKS_IS_DAEMON (daemon));
+ g_return_if_fail (device_path != NULL);
+
+ gudev_client = udisks_linux_provider_get_udev_client (udisks_daemon_get_linux_provider (daemon));
+ gudev_device = g_udev_client_query_by_device_file (gudev_client, device_path);
+ if (gudev_device == NULL)
+ {
+ udisks_critical ("Device %s not found in udev database, skipping uevent trigger", device_path);
+ return;
+ }
+
+ path = g_build_filename (g_udev_device_get_sysfs_path (gudev_device), "uevent", NULL);
+ trigger_uevent (path, "change");
+ g_free (path);
+
+ g_object_unref (gudev_device);
+}
+
+/**
+ * udisks_daemon_util_trigger_uevent_sync:
+ * @daemon: A #UDisksDaemon.
+ * @device_path: Block device path.
+ * @timeout_seconds: Maximum time to wait for the uevent (in seconds).
+ *
+ * Triggers a 'change' uevent in the kernel and waits until it's received and
+ * processed by udisks.
+ *
+ * Unlike udisks_daemon_util_trigger_uevent() that just triggers
+ * a synthetic uevent to the kernel, this call will actually block and wait until
+ * the #UDisksLinuxProvider receives the uevent, performs probing and processes
+ * the uevent further down the UDisks object stack. Upon returning from this
+ * function call the caller may assume the event has been fully processed, all
+ * D-Bus objects are updated and settled. Typically used in busy wait for
+ * a particular D-Bus interface.
+ *
+ * Note that this uses synthetic uevent tagging and only works on linux kernel
+ * 4.13 and higher. In case an older kernel is detected this acts like the classic
+ * udisks_daemon_util_trigger_uevent() call and %FALSE is returned.
+ *
+ * Returns: %TRUE if the uevent has been successfully received, %FALSE otherwise
+ * or when the kernel version is too old.
+ */
+gboolean
+udisks_daemon_util_trigger_uevent_sync (UDisksDaemon *daemon,
+ const gchar *device_path,
+ guint timeout_seconds)
+{
+ UDisksLinuxProvider *provider;
+ GUdevClient *gudev_client;
+ GUdevDevice *gudev_device;
+ SynthUeventData data;
+ GMainContext *main_context;
+ GSource *idle_source;
+ GSource *timeout_source;
+
+ g_return_val_if_fail (UDISKS_IS_DAEMON (daemon), FALSE);
+ g_return_val_if_fail (device_path != NULL, FALSE);
+
+ if (bd_utils_check_linux_version (4, 13, 0) < 0)
+ {
+ udisks_daemon_util_trigger_uevent (daemon, device_path);
+ return FALSE;
+ }
+
+ provider = udisks_daemon_get_linux_provider (daemon);
+ gudev_client = udisks_linux_provider_get_udev_client (provider);
+ gudev_device = g_udev_client_query_by_device_file (gudev_client, device_path);
+ if (gudev_device == NULL)
+ {
+ udisks_critical ("Device %s not found in udev database, skipping uevent trigger", device_path);
+ return FALSE;
+ }
+
+ data.daemon = daemon;
+ data.uevent_path = g_build_filename (g_udev_device_get_sysfs_path (gudev_device), "uevent", NULL);
+ data.serial = g_atomic_int_add (&uevent_serial, 1);
+
+ main_context = g_main_context_new ();
+ g_main_context_push_thread_default (main_context);
+ data.main_loop = g_main_loop_new (main_context, FALSE);
+
+ /* queue the actual trigger in the loop */
+ idle_source = g_idle_source_new ();
+ g_source_set_callback (idle_source, (GSourceFunc) trigger_uevent_idle_cb, &data, NULL);
+ g_source_attach (idle_source, main_context);
+ g_source_unref (idle_source);
+
+ /* add timeout as a fallback */
+ timeout_source = g_timeout_source_new_seconds (timeout_seconds);
+ g_source_set_callback (timeout_source, (GSourceFunc) uevent_wait_timeout_cb, &data, NULL);
+ g_source_attach (timeout_source, main_context);
+ g_source_unref (timeout_source);
+
+ /* catch incoming uevents */
+ g_signal_connect (provider, "uevent-probed", G_CALLBACK (uevent_probed_cb), &data);
+
+ data.success = FALSE;
+ g_main_loop_run (data.main_loop);
+
+ g_signal_handlers_disconnect_by_func (provider, uevent_probed_cb, &data);
+ g_main_context_pop_thread_default (main_context);
+
+ g_main_loop_unref (data.main_loop);
+ g_main_context_unref (main_context);
+
+ g_free (data.uevent_path);
+ g_object_unref (gudev_device);
+
+ return data.success;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
diff --git a/src/udisksdaemonutil.h b/src/udisksdaemonutil.h
index 4fe36214..2edf2122 100644
--- a/src/udisksdaemonutil.h
+++ b/src/udisksdaemonutil.h
@@ -51,6 +51,13 @@ guint64 udisks_daemon_util_block_get_size (GUdevDevice *device,
gboolean *out_media_available,
gboolean *out_media_change_detected);
+void udisks_daemon_util_trigger_uevent (UDisksDaemon *daemon,
+ const gchar *device_path);
+
+gboolean udisks_daemon_util_trigger_uevent_sync (UDisksDaemon *daemon,
+ const gchar *device_path,
+ guint timeout_seconds);
+
gchar *udisks_daemon_util_resolve_link (const gchar *path,
const gchar *name);
diff --git a/src/udiskslinuxblockobject.c b/src/udiskslinuxblockobject.c
index 42ab17d7..5a68c84b 100644
--- a/src/udiskslinuxblockobject.c
+++ b/src/udiskslinuxblockobject.c
@@ -38,8 +38,6 @@
#include <stdlib.h>
#include <glib/gstdio.h>
-#include <blockdev/blockdev.h>
-
#include "udiskslogging.h"
#include "udisksdaemon.h"
#include "udisksdaemonutil.h"
@@ -959,122 +957,24 @@ on_mount_monitor_mount_removed (UDisksMountMonitor *monitor,
/* ---------------------------------------------------------------------------------------------------- */
-static volatile guint uevent_serial = 0;
-
-static gboolean
-trigger_uevent (const gchar *path, const gchar *str)
-{
- gint fd;
-
- fd = open (path, O_WRONLY);
- if (fd < 0)
- {
- udisks_warning ("Error opening %s while triggering uevent: %m", path);
- return FALSE;
- }
-
- if (write (fd, str, strlen (str)) != (ssize_t) strlen (str))
- {
- udisks_warning ("Error writing '%s' to file %s: %m", str, path);
- close (fd);
- return FALSE;
- }
-
- close (fd);
- return TRUE;
-}
-
-typedef struct
-{
- UDisksLinuxBlockObject *object;
- GMainLoop *main_loop;
- guint serial;
- gchar *uevent_path;
- gboolean success;
-} SynthUeventData;
-
-static gboolean
-trigger_uevent_idle_cb (gpointer user_data)
-{
- SynthUeventData *data = user_data;
- gchar *str;
-
- str = g_strdup_printf ("change %s UDISKSSERIAL=%u", udisks_daemon_get_uuid (data->object->daemon), data->serial);
-
- if (! trigger_uevent (data->uevent_path, str))
- {
- /* kernel refused our string, try simple "change" but don't wait for it */
- trigger_uevent (data->uevent_path, "change");
- data->success = FALSE;
- g_main_loop_quit (data->main_loop);
- }
- g_free (str);
-
- /* remove the source */
- return FALSE;
-}
-
-static gboolean
-uevent_wait_timeout_cb (gpointer user_data)
-{
- SynthUeventData *data = user_data;
-
- data->success = FALSE;
- g_main_loop_quit (data->main_loop);
-
- /* remove the source */
- return FALSE;
-}
-
-static void
-uevent_probed_cb (UDisksLinuxProvider *provider,
- const gchar *action,
- UDisksLinuxDevice *device,
- gpointer user_data)
-{
- SynthUeventData *data = user_data;
- const gchar *received_serial_str;
- gint64 received_serial;
- gchar *endptr;
-
- received_serial_str = g_udev_device_get_property (device->udev_device, "SYNTH_ARG_UDISKSSERIAL");
- if (received_serial_str != NULL)
- {
- endptr = (gchar *) received_serial_str;
- received_serial = g_ascii_strtoll (received_serial_str, &endptr, 0);
- if (endptr != received_serial_str && received_serial == data->serial)
- {
- data->success = TRUE;
- g_main_loop_quit (data->main_loop);
- }
- }
-}
-
/**
* udisks_linux_block_object_trigger_uevent:
* @object: A #UDisksLinuxBlockObject.
*
* Triggers a 'change' uevent in the kernel.
*
- * The triggered event will bubble up from the kernel through the udev
- * stack and will eventually be received by the udisks daemon process
- * itself. This method does not wait for the event to be received.
+ * Refer to udisks_daemon_util_trigger_uevent() for detailed description.
*/
void
udisks_linux_block_object_trigger_uevent (UDisksLinuxBlockObject *object)
{
- UDisksLinuxDevice *device;
- gchar *path;
+ gchar *device_file;
g_return_if_fail (UDISKS_IS_LINUX_BLOCK_OBJECT (object));
- device = udisks_linux_block_object_get_device (object);
- path = g_strconcat (g_udev_device_get_sysfs_path (device->udev_device), "/uevent", NULL);
-
- trigger_uevent (path, "change");
-
- g_free (path);
- g_object_unref (device);
+ device_file = udisks_linux_block_object_get_device_file (object);
+ udisks_daemon_util_trigger_uevent (object->daemon, device_file);
+ g_free (device_file);
}
/**
@@ -1083,19 +983,10 @@ udisks_linux_block_object_trigger_uevent (UDisksLinuxBlockObject *object)
* @timeout_seconds: Maximum time to wait for the uevent (in seconds).
*
* Triggers a 'change' uevent in the kernel and waits until it's received and
- * processed by udisks.
- *
- * Unlike udisks_linux_block_object_trigger_uevent() that just triggers
- * a synthetic uevent to the kernel, this call will actually block and wait until
- * the #UDisksLinuxProvider receives the uevent, performs probing and processes
- * the uevent further down the UDisks object stack. Upon returning from this
- * function call the caller may assume the event has been fully processed, all
- * D-Bus objects are updated and settled. Typically used in busy wait for
- * a particular D-Bus interface.
+ * processed through the uevent queue.
*
- * Note that this uses synthetic uevent tagging and only works on linux kernel
- * 4.13 and higher. In case an older kernel is detected this acts like the classic
- * udisks_linux_block_object_trigger_uevent() call and %FALSE is returned.
+ * This is a convenient wrapper around udisks_daemon_util_trigger_uevent_sync().
+ * Refer to this function for detailed documentation.
*
* Returns: %TRUE if the uevent has been successfully received, %FALSE otherwise
* or when the kernel version is too old.
@@ -1104,59 +995,16 @@ gboolean
udisks_linux_block_object_trigger_uevent_sync (UDisksLinuxBlockObject *object,
guint timeout_seconds)
{
- UDisksLinuxDevice *device;
- UDisksLinuxProvider *provider;
- SynthUeventData data;
- GMainContext *main_context;
- GSource *idle_source;
- GSource *timeout_source;
+ gchar *device_file;
+ gboolean ret;
g_return_val_if_fail (UDISKS_IS_LINUX_BLOCK_OBJECT (object), FALSE);
- if (bd_utils_check_linux_version (4, 13, 0) < 0)
- {
- udisks_linux_block_object_trigger_uevent (object);
- return FALSE;
- }
-
- data.object = object;
- device = udisks_linux_block_object_get_device (object);
- data.uevent_path = g_strconcat (g_udev_device_get_sysfs_path (device->udev_device), "/uevent", NULL);
- data.serial = g_atomic_int_add (&uevent_serial, 1);
-
- main_context = g_main_context_new ();
- g_main_context_push_thread_default (main_context);
- data.main_loop = g_main_loop_new (main_context, FALSE);
-
- /* queue the actual trigger in the loop */
- idle_source = g_idle_source_new ();
- g_source_set_callback (idle_source, (GSourceFunc) trigger_uevent_idle_cb, &data, NULL);
- g_source_attach (idle_source, main_context);
- g_source_unref (idle_source);
+ device_file = udisks_linux_block_object_get_device_file (object);
+ ret = udisks_daemon_util_trigger_uevent_sync (object->daemon, device_file, timeout_seconds);
+ g_free (device_file);
- /* add timeout as a fallback */
- timeout_source = g_timeout_source_new_seconds (timeout_seconds);
- g_source_set_callback (timeout_source, (GSourceFunc) uevent_wait_timeout_cb, &data, NULL);
- g_source_attach (timeout_source, main_context);
- g_source_unref (timeout_source);
-
- /* catch incoming uevents */
- provider = udisks_daemon_get_linux_provider (object->daemon);
- g_signal_connect (provider, "uevent-probed", G_CALLBACK (uevent_probed_cb), &data);
-
- data.success = FALSE;
- g_main_loop_run (data.main_loop);
-
- g_signal_handlers_disconnect_by_func (provider, uevent_probed_cb, &data);
- g_main_context_pop_thread_default (main_context);
-
- g_main_loop_unref (data.main_loop);
- g_main_context_unref (main_context);
-
- g_free (data.uevent_path);
- g_object_unref (device);
-
- return data.success;
+ return ret;
}
/* ---------------------------------------------------------------------------------------------------- */
--
2.26.2

View File

@ -0,0 +1,27 @@
From 7fe04e70dc5a5ccf621a0beacc6d4b9e904037df Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Fri, 13 Nov 2020 16:57:24 +0100
Subject: [PATCH 2/2] udiskslinuxmanager: Trigger uevent after loop device
setup
---
src/udiskslinuxmanager.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/udiskslinuxmanager.c b/src/udiskslinuxmanager.c
index 1bbf980a..e0a83a80 100644
--- a/src/udiskslinuxmanager.c
+++ b/src/udiskslinuxmanager.c
@@ -430,6 +430,9 @@ handle_loop_setup (UDisksManager *object,
error = NULL;
wait_data.loop_device = loop_device;
wait_data.path = path;
+ udisks_daemon_util_trigger_uevent_sync (manager->daemon,
+ loop_device,
+ UDISKS_DEFAULT_WAIT_TIMEOUT);
loop_object = udisks_daemon_wait_for_object_sync (manager->daemon,
wait_for_loop_object,
&wait_data,
--
2.26.2

View File

@ -0,0 +1,405 @@
diff -up udisks-2.9.0/src/tests/dbus-tests/test_50_block.py.bak udisks-2.9.0/src/tests/dbus-tests/test_50_block.py
--- udisks-2.9.0/src/tests/dbus-tests/test_50_block.py.bak 2020-05-26 14:59:20.000000000 +0200
+++ udisks-2.9.0/src/tests/dbus-tests/test_50_block.py 2023-06-02 17:08:45.203845819 +0200
@@ -11,6 +11,8 @@ import udiskstestcase
class UdisksBlockTest(udiskstestcase.UdisksTestCase):
'''This is a basic block device test suite'''
+ LUKS_PASSPHRASE = 'shouldnotseeme'
+
def _close_luks(self, disk):
disk.Lock(self.no_options, dbus_interface=self.iface_prefix + '.Encrypted')
@@ -201,7 +203,7 @@ class UdisksBlockTest(udiskstestcase.Udi
# format the disk
disk = self.get_object('/block_devices/' + os.path.basename(self.vdevs[0]))
- disk.Format('xfs', {'encrypt.passphrase': 'test'}, dbus_interface=self.iface_prefix + '.Block')
+ disk.Format('xfs', {'encrypt.passphrase': self.LUKS_PASSPHRASE}, dbus_interface=self.iface_prefix + '.Block')
# cleanup -- close the luks and remove format
self.addCleanup(self.wipe_fs, self.vdevs[0])
@@ -209,7 +211,7 @@ class UdisksBlockTest(udiskstestcase.Udi
# configuration items as arrays of dbus.Byte
opts = self.str_to_ay('verify')
- passwd = self.str_to_ay('test')
+ passwd = self.str_to_ay(self.LUKS_PASSPHRASE)
# set the new configuration
conf = dbus.Dictionary({'passphrase-contents': passwd,
@@ -254,7 +256,7 @@ class UdisksBlockTest(udiskstestcase.Udi
# format the disk
disk = self.get_object('/block_devices/' + os.path.basename(self.vdevs[0]))
- disk.Format('xfs', {'encrypt.passphrase': 'test'}, dbus_interface=self.iface_prefix + '.Block')
+ disk.Format('xfs', {'encrypt.passphrase': self.LUKS_PASSPHRASE}, dbus_interface=self.iface_prefix + '.Block')
# cleanup -- close the luks and remove format
self.addCleanup(self.wipe_fs, self.vdevs[0])
diff -up udisks-2.9.0/src/tests/dbus-tests/test_70_encrypted.py.bak udisks-2.9.0/src/tests/dbus-tests/test_70_encrypted.py
--- udisks-2.9.0/src/tests/dbus-tests/test_70_encrypted.py.bak 2020-05-26 14:59:20.000000000 +0200
+++ udisks-2.9.0/src/tests/dbus-tests/test_70_encrypted.py 2023-06-02 17:07:33.828531988 +0200
@@ -40,6 +40,9 @@ def _get_blkid_version():
class UdisksEncryptedTest(udiskstestcase.UdisksTestCase):
'''This is an encrypted device test suite'''
+ PASSPHRASE = 'shouldnotseeme'
+ LUKS_NAME = 'myshinylittleluks'
+
def _create_luks(self, device, passphrase, binary=False):
raise NotImplementedError()
@@ -60,7 +63,7 @@ class UdisksEncryptedTest(udiskstestcase
disk_name = os.path.basename(self.vdevs[0])
disk = self.get_object('/block_devices/' + disk_name)
- self._create_luks(disk, 'test')
+ self._create_luks(disk, self.PASSPHRASE)
self.addCleanup(self._remove_luks, disk)
self.udev_settle()
@@ -124,7 +127,7 @@ class UdisksEncryptedTest(udiskstestcase
disk_name = os.path.basename(self.vdevs[0])
disk = self.get_object('/block_devices/' + disk_name)
- self._create_luks(disk, 'test')
+ self._create_luks(disk, self.PASSPHRASE)
self.addCleanup(self._remove_luks, disk)
self.udev_settle()
@@ -160,11 +163,11 @@ class UdisksEncryptedTest(udiskstestcase
# wrong password
msg = 'org.freedesktop.UDisks2.Error.Failed: Error unlocking %s *' % self.vdevs[0]
with six.assertRaisesRegex(self, dbus.exceptions.DBusException, msg):
- disk.Unlock('shbdkjaf', self.no_options,
+ disk.Unlock('abcdefghijklmn', self.no_options,
dbus_interface=self.iface_prefix + '.Encrypted')
# right password
- luks = disk.Unlock('test', self.no_options,
+ luks = disk.Unlock(self.PASSPHRASE, self.no_options,
dbus_interface=self.iface_prefix + '.Encrypted')
self.assertIsNotNone(luks)
self.assertTrue(os.path.exists('/dev/disk/by-uuid/%s' % luks_uuid))
@@ -180,7 +183,7 @@ class UdisksEncryptedTest(udiskstestcase
# read-only
ro_opts = dbus.Dictionary({'read-only': dbus.Boolean(True)}, signature=dbus.Signature('sv'))
- luks = disk.Unlock('test', ro_opts,
+ luks = disk.Unlock(self.PASSPHRASE, ro_opts,
dbus_interface=self.iface_prefix + '.Encrypted')
self.assertIsNotNone(luks)
self.assertTrue(os.path.exists('/dev/disk/by-uuid/%s' % luks_uuid))
@@ -196,13 +199,10 @@ class UdisksEncryptedTest(udiskstestcase
crypttab = self.read_file('/etc/crypttab')
self.addCleanup(self.write_file, '/etc/crypttab', crypttab)
- passwd = 'test'
- luks_name = 'myshinylittleluks'
-
disk_name = os.path.basename(self.vdevs[0])
disk = self.get_object('/block_devices/' + disk_name)
- self._create_luks(disk, passwd)
+ self._create_luks(disk, self.PASSPHRASE)
self.addCleanup(self._remove_luks, disk)
self.udev_settle()
@@ -212,22 +212,22 @@ class UdisksEncryptedTest(udiskstestcase
disk.Lock(self.no_options, dbus_interface=self.iface_prefix + '.Encrypted')
# add new entry to the crypttab
- new_crypttab = crypttab + '%s UUID=%s none\n' % (luks_name, disk_uuid)
+ new_crypttab = crypttab + '%s UUID=%s none\n' % (self.LUKS_NAME, disk_uuid)
self.write_file('/etc/crypttab', new_crypttab)
# give udisks time to react to change of the file
time.sleep(5)
dbus_conf = disk.GetSecretConfiguration(self.no_options, dbus_interface=self.iface_prefix + '.Block')
self.assertIsNotNone(dbus_conf)
- self.assertEqual(self.ay_to_str(dbus_conf[0][1]['name']), luks_name)
+ self.assertEqual(self.ay_to_str(dbus_conf[0][1]['name']), self.LUKS_NAME)
# unlock the device
- luks = disk.Unlock(passwd, self.no_options,
+ luks = disk.Unlock(self.PASSPHRASE, self.no_options,
dbus_interface=self.iface_prefix + '.Encrypted')
self.assertIsNotNone(luks)
# unlock should use name from crypttab for the /dev/mapper device
- dm_path = '/dev/mapper/%s' % luks_name
+ dm_path = '/dev/mapper/%s' % self.LUKS_NAME
self.assertTrue(os.path.exists(dm_path))
# preferred 'device' should be /dev/mapper/name too
@@ -242,8 +242,7 @@ class UdisksEncryptedTest(udiskstestcase
crypttab = self.read_file('/etc/crypttab')
self.addCleanup(self.write_file, '/etc/crypttab', crypttab)
- passwd = b'test\0test'
- luks_name = 'myshinylittleluks'
+ passwd = b'testtesttest\0testtesttest'
# create key file
_fd, key_file = tempfile.mkstemp()
@@ -264,14 +263,14 @@ class UdisksEncryptedTest(udiskstestcase
disk.Lock(self.no_options, dbus_interface=self.iface_prefix + '.Encrypted')
# add new entry to the crypttab
- new_crypttab = crypttab + '%s UUID=%s %s\n' % (luks_name, disk_uuid, key_file)
+ new_crypttab = crypttab + '%s UUID=%s %s\n' % (self.LUKS_NAME, disk_uuid, key_file)
self.write_file('/etc/crypttab', new_crypttab)
# give udisks time to react to change of the file
time.sleep(5)
dbus_conf = disk.GetSecretConfiguration(self.no_options, dbus_interface=self.iface_prefix + '.Block')
self.assertIsNotNone(dbus_conf)
- self.assertEqual(self.ay_to_str(dbus_conf[0][1]['name']), luks_name)
+ self.assertEqual(self.ay_to_str(dbus_conf[0][1]['name']), self.LUKS_NAME)
self.assertEqual(self.ay_to_str(dbus_conf[0][1]['passphrase-path']), key_file)
# unlock the device using empty passphrase (should use the key file)
@@ -280,7 +279,7 @@ class UdisksEncryptedTest(udiskstestcase
self.assertIsNotNone(luks)
# unlock should use name from crypttab for the /dev/mapper device
- dm_path = '/dev/mapper/%s' % luks_name
+ dm_path = '/dev/mapper/%s' % self.LUKS_NAME
self.assertTrue(os.path.exists(dm_path))
# preferred 'device' should be /dev/mapper/name too
@@ -293,7 +292,7 @@ class UdisksEncryptedTest(udiskstestcase
disk_name = os.path.basename(self.vdevs[0])
disk = self.get_object('/block_devices/' + disk_name)
- self._create_luks(disk, 'test')
+ self._create_luks(disk, self.PASSPHRASE)
self.addCleanup(self._remove_luks, disk)
self.udev_settle()
@@ -320,11 +319,11 @@ class UdisksEncryptedTest(udiskstestcase
disk_name = os.path.basename(self.vdevs[0])
disk = self.get_object('/block_devices/' + disk_name)
- self._create_luks(disk, 'test')
+ self._create_luks(disk, self.PASSPHRASE)
self.addCleanup(self._remove_luks, disk)
self.udev_settle()
- disk.ChangePassphrase('test', 'password', self.no_options,
+ disk.ChangePassphrase(self.PASSPHRASE, self.PASSPHRASE + '222', self.no_options,
dbus_interface=self.iface_prefix + '.Encrypted')
disk.Lock(self.no_options, dbus_interface=self.iface_prefix + '.Encrypted')
@@ -332,11 +331,11 @@ class UdisksEncryptedTest(udiskstestcase
# old password, should fail
msg = 'org.freedesktop.UDisks2.Error.Failed: Error unlocking %s *' % self.vdevs[0]
with six.assertRaisesRegex(self, dbus.exceptions.DBusException, msg):
- disk.Unlock('test', self.no_options,
+ disk.Unlock(self.PASSPHRASE, self.no_options,
dbus_interface=self.iface_prefix + '.Encrypted')
# new password
- luks = disk.Unlock('password', self.no_options,
+ luks = disk.Unlock(self.PASSPHRASE + '222', self.no_options,
dbus_interface=self.iface_prefix + '.Encrypted')
self.assertIsNotNone(luks)
@@ -347,7 +346,7 @@ class UdisksEncryptedTest(udiskstestcase
def test_resize(self):
device = self.get_device(self.vdevs[0])
- self._create_luks(device, 'test')
+ self._create_luks(device, self.PASSPHRASE)
self.addCleanup(self._remove_luks, device)
self.udev_settle()
@@ -376,8 +375,6 @@ class UdisksEncryptedTest(udiskstestcase
fstab = self.read_file('/etc/fstab')
self.addCleanup(self.write_file, '/etc/fstab', fstab)
- passphrase = 'test'
-
disk_name = os.path.basename(self.vdevs[0])
disk = self.get_object('/block_devices/' + disk_name)
@@ -388,7 +385,7 @@ class UdisksEncryptedTest(udiskstestcase
self.assertIsNotNone(part)
# create LUKS on the partition and add it to crypttab
- self._create_luks(part, passphrase)
+ self._create_luks(part, self.PASSPHRASE)
self.udev_settle()
conf = dbus.Dictionary({'name': self.str_to_ay('udisks_luks_test'),
@@ -525,10 +522,8 @@ class UdisksEncryptedTestLUKS2(UdisksEnc
super(UdisksEncryptedTestLUKS2, self).setUp()
def test_resize(self):
- passwd = 'test'
-
device = self.get_device(self.vdevs[0])
- self._create_luks(device, passwd)
+ self._create_luks(device, self.PASSPHRASE)
self.addCleanup(self._remove_luks, device)
self.udev_settle()
@@ -554,7 +549,7 @@ class UdisksEncryptedTestLUKS2(UdisksEnc
# right passphrase
d = dbus.Dictionary(signature='sv')
- d['passphrase'] = passwd
+ d['passphrase'] = self.PASSPHRASE
device.Resize(dbus.UInt64(100*1024*1024), d,
dbus_interface=self.iface_prefix + '.Encrypted')
@@ -563,7 +558,7 @@ class UdisksEncryptedTestLUKS2(UdisksEnc
# resize back to the original size (using binary passphrase)
d = dbus.Dictionary(signature='sv')
- d['keyfile_contents'] = self.str_to_ay(passwd, False)
+ d['keyfile_contents'] = self.str_to_ay(self.PASSPHRASE, False)
device.Resize(dbus.UInt64(clear_size), d,
dbus_interface=self.iface_prefix + '.Encrypted')
@@ -581,7 +576,7 @@ class UdisksEncryptedTestLUKS2(UdisksEnc
# create LUKS without specifying version
options = dbus.Dictionary(signature='sv')
- options['encrypt.passphrase'] = 'test'
+ options['encrypt.passphrase'] = self.PASSPHRASE
disk.Format('xfs', options,
dbus_interface=self.iface_prefix + '.Block')
@@ -617,14 +612,12 @@ class UdisksEncryptedTestLUKS2(UdisksEnc
@udiskstestcase.tag_test(udiskstestcase.TestTags.UNSTABLE)
def test_integrity(self):
- passwd = 'test'
-
cryptsetup_version = _get_cryptsetup_version()
if cryptsetup_version < LooseVersion('2.2.0'):
self.skipTest('Integrity devices are not marked as internal in cryptsetup < 2.2.0')
device = self.get_device(self.vdevs[0])
- self._create_luks_integrity(self.vdevs[0], passwd)
+ self._create_luks_integrity(self.vdevs[0], self.PASSPHRASE)
self.addCleanup(self._remove_luks, device)
self.udev_settle()
@@ -634,7 +627,7 @@ class UdisksEncryptedTestLUKS2(UdisksEnc
# the device is not opened, we need to read the UUID from LUKS metadata
luks_uuid = BlockDev.crypto_luks_uuid(self.vdevs[0])
- luks_path = device.Unlock('test', self.no_options,
+ luks_path = device.Unlock(self.PASSPHRASE, self.no_options,
dbus_interface=self.iface_prefix + '.Encrypted')
self.assertIsNotNone(luks_path)
self.assertTrue(os.path.exists('/dev/disk/by-uuid/%s' % luks_uuid))
diff -up udisks-2.9.0/src/tests/integration-test.bak udisks-2.9.0/src/tests/integration-test
--- udisks-2.9.0/src/tests/integration-test.bak 2020-05-26 14:59:20.000000000 +0200
+++ udisks-2.9.0/src/tests/integration-test 2023-06-02 16:59:52.841963720 +0200
@@ -1321,7 +1321,7 @@ class Luks(UDisksTestCase):
def setup_crypto_device(self):
self.fs_create(None, 'ext4', GLib.Variant('a{sv}', {
- 'encrypt.passphrase': GLib.Variant('s', 's3kr1t'),
+ 'encrypt.passphrase': GLib.Variant('s', 's3kr1ts3kr1t'),
'label': GLib.Variant('s', 'treasure')}))
self.client.settle()
crypt_obj = self.client.get_object(self.udisks_block().get_object_path())
@@ -1332,7 +1332,7 @@ class Luks(UDisksTestCase):
@staticmethod
def unlock_crypto_device(encrypted):
return encrypted.call_unlock_sync(
- 's3kr1t', no_options, None)
+ 's3kr1ts3kr1t', no_options, None)
def tearDown(self):
"""clean up behind failed test cases"""
@@ -1400,7 +1400,7 @@ class Luks(UDisksTestCase):
udev_dump = subprocess.Popen(['udevadm', 'info', '--export-db'],
stdout=subprocess.PIPE)
out = udev_dump.communicate()[0]
- self.assertFalse(b's3kr1t' in out, 'password in udev properties')
+ self.assertFalse(b's3kr1ts3kr1t' in out, 'password in udev properties')
self.assertFalse(b'essiv:sha' in out, 'key information in udev properties')
finally:
@@ -1510,18 +1510,18 @@ class Luks(UDisksTestCase):
encrypted = self.setup_crypto_device()
# wrong password, has bytes after a trailing '\0'
self.assertRaises(GLib.GError, encrypted.call_unlock_sync,
- '', Luks.keyfile_options(b's3kr1t\0X'), None)
+ '', Luks.keyfile_options(b's3kr1ts3kr1t\0X'), None)
self.assertRaises(GLib.GError, encrypted.call_unlock_sync,
- '', Luks.keyfile_options(b's3kr1t\n'), None)
+ '', Luks.keyfile_options(b's3kr1ts3kr1t\n'), None)
# correct password, specified as keyfile
- encrypted.call_unlock_sync('', Luks.keyfile_options(b's3kr1t'), None)
+ encrypted.call_unlock_sync('', Luks.keyfile_options(b's3kr1ts3kr1t'), None)
encrypted.call_lock_sync(no_options, None)
def test_plaintext_keyfile(self):
"""Setup a device using a plaintext keyfile."""
# Using a plaintext keyfile should be equivalent to passphrase
self.fs_create(None, 'ext4', GLib.Variant('a{sv}', {
- 'encrypt.passphrase': GLib.Variant('ay', _bytes_to_ay(b's3kr1t')),
+ 'encrypt.passphrase': GLib.Variant('ay', _bytes_to_ay(b's3kr1ts3kr1t')),
'label': GLib.Variant('s', 'treasure')}))
crypt_obj = self.client.get_object(self.udisks_block().get_object_path())
@@ -1532,16 +1532,16 @@ class Luks(UDisksTestCase):
self.assertRaises(GLib.GError, encrypted.call_unlock_sync,
'h4ckpassword', no_options, None)
self.assertRaises(GLib.GError, encrypted.call_unlock_sync,
- '', Luks.keyfile_options(b's3kr1t\0X'), None)
+ '', Luks.keyfile_options(b's3kr1ts3kr1t\0X'), None)
self.assertRaises(GLib.GError, encrypted.call_unlock_sync,
- '', Luks.keyfile_options(b's3kr1t\n'), None)
+ '', Luks.keyfile_options(b's3kr1ts3kr1t\n'), None)
# correct password
- encrypted.call_unlock_sync('', Luks.keyfile_options(b's3kr1t'), None)
+ encrypted.call_unlock_sync('', Luks.keyfile_options(b's3kr1ts3kr1t'), None)
encrypted.call_lock_sync(no_options, None)
# correct password, specified as passphrase
- encrypted.call_unlock_sync('s3kr1t', no_options, None)
+ encrypted.call_unlock_sync('s3kr1ts3kr1t', no_options, None)
encrypted.call_lock_sync(no_options, None)
def test_binary_keyfile(self):
@@ -1607,11 +1607,11 @@ class Luks(UDisksTestCase):
encrypted = self.setup_crypto_device()
# change: passphrase -> passphrase
- encrypted.call_change_passphrase_sync('s3kr1t', 'passphrase', no_options, None)
+ encrypted.call_change_passphrase_sync('s3kr1ts3kr1t', 'passphrase', no_options, None)
# verify new password:
self.assertRaises(GLib.GError, encrypted.call_unlock_sync,
- 's3kr1t', no_options, None)
+ 's3kr1ts3kr1t', no_options, None)
encrypted.call_unlock_sync('passphrase', no_options, None)
encrypted.call_lock_sync(no_options, None)
@@ -1644,7 +1644,7 @@ class Luks(UDisksTestCase):
# change: keyfile -> passphrase
encrypted.call_change_passphrase_sync(
- '', 's3kr1t', GLib.Variant('a{sv}', {
+ '', 's3kr1ts3kr1t', GLib.Variant('a{sv}', {
'old_keyfile_contents': GLib.Variant('ay', _bytes_to_ay(key_file_1)),
}),
None)
@@ -1652,7 +1652,7 @@ class Luks(UDisksTestCase):
# verify new password:
self.assertRaises(GLib.GError, encrypted.call_unlock_sync,
'', Luks.keyfile_options(key_file_1), None)
- encrypted.call_unlock_sync('s3kr1t', no_options, None)
+ encrypted.call_unlock_sync('s3kr1ts3kr1t', no_options, None)
encrypted.call_lock_sync(no_options, None)

View File

@ -0,0 +1,54 @@
From 2d5d2b7570b0f44c14b34b5dc831f174205c10f2 Mon Sep 17 00:00:00 2001
From: Tomas Bzatek <tbzatek@redhat.com>
Date: Wed, 15 Sep 2021 14:34:49 +0200
Subject: [PATCH] mount options: Always use errors=remount-ro for ext
filesystems
Default mount options are focused primarily on data safety, mounting
damaged ext2/3/4 filesystem as readonly would indicate something's wrong.
---
data/builtin_mount_options.conf | 9 +++++++++
src/tests/dbus-tests/test_80_filesystem.py | 6 ++++++
2 files changed, 15 insertions(+)
diff --git a/data/builtin_mount_options.conf b/data/builtin_mount_options.conf
index 37715cfa4..e0bd0ee1f 100644
--- a/data/builtin_mount_options.conf
+++ b/data/builtin_mount_options.conf
@@ -27,3 +27,12 @@ f2fs_allow=discard,nodiscard,compress_algorithm,compress_log_size,compress_exten
btrfs_allow=compress,compress-force,datacow,nodatacow,datasum,nodatasum,degraded,device,discard,nodiscard,subvol,subvolid,space_cache
f2fs_allow=discard,nodiscard,compress_algorithm,compress_log_size,compress_extension,alloc_mode
+
+ext2_defaults=errors=remount-ro
+ext2_allow=errors=remount-ro
+
+ext3_defaults=errors=remount-ro
+ext3_allow=errors=remount-ro
+
+ext4_defaults=errors=remount-ro
+ext4_allow=errors=remount-ro
diff --git a/src/tests/dbus-tests/test_80_filesystem.py b/src/tests/dbus-tests/test_80_filesystem.py
index 019880f57..2d1933240 100644
--- a/src/tests/dbus-tests/test_80_filesystem.py
+++ b/src/tests/dbus-tests/test_80_filesystem.py
@@ -321,6 +321,8 @@ def test_mount_auto(self):
_ret, out = self.run_command('mount | grep %s' % block_fs_dev)
self.assertIn(mnt_path, out)
self.assertIn('ro', out)
+ if self._fs_name.startswith('ext'):
+ self.assertIn('errors=remount-ro', out)
# dbus mountpoint
dbus_mounts = self.get_property(block_fs, '.Filesystem', 'MountPoints')
@@ -478,6 +480,10 @@ def test_custom_option(self, should_fail, dbus_option, should_be_present, config
if self._fs_name == "udf":
test_custom_option(self, False, None, False, "[defaults]\ndefaults=\nallow=exec,noexec,nodev,nosuid,atime,noatime,nodiratime,ro,rw,sync,dirsync,noload,uid=ignore,uid=forget\n")
test_custom_option(self, True, "uid=notallowed", True, "[defaults]\nallow=exec,noexec,nodev,nosuid,atime,noatime,nodiratime,ro,rw,sync,dirsync,noload,uid=ignore\n")
+ if self._fs_name.startswith("ext"):
+ test_custom_option(self, False, "errors=remount-ro", True, "", match_mount_option="errors=remount-ro")
+ test_custom_option(self, True, "errors=panic", False, "")
+ test_custom_option(self, True, "errors=continue", False, "")
# udev rules overrides
test_readonly(self, False, "", udev_rules_content = { "UDISKS_MOUNT_OPTIONS_DEFAULTS": "rw" })

View File

@ -1,14 +1,15 @@
%global glib2_version 2.50
%global glib2_version 2.36
%global gobject_introspection_version 1.30.0
%global polkit_version 0.102
%global systemd_version 208
%global libatasmart_version 0.17
%global dbus_version 1.4.0
%global with_gtk_doc 1
%global libblockdev_version 2.25
%global libblockdev_version 2.24
%define with_bcache 1
%define with_btrfs 1
%define with_vdo 0
%define with_lsm 1
%define with_zram 1
%define with_lvmcache 1
@ -17,9 +18,6 @@
%define default_luks_encryption luks1
%define is_fedora 0%{?rhel} == 0
%define is_git %(git show > /dev/null 2>&1 && echo 1 || echo 0)
%define git_hash %(git log -1 --pretty=format:"%h" || true)
%define build_date %(date '+%Y%m%d')
# bcache and zram are not available on RHEL
@ -29,10 +27,20 @@
%endif
# btrfs is not available on RHEL > 7
%if 0%{?rhel} > 7
%if 0%{?rhel} > 7 || %{with_btrfs} == 0
%define with_btrfs 0
%endif
# vdo is not available on Fedora
%if (0%{?fedora}) || %{with_vdo} == 0
%define with_vdo 0
%endif
# vdo is not available on i686
%ifnarch x86_64 aarch64 ppc64le s390x
%define with_vdo 0
%endif
# feature parity with existing RHEL 7 packages
%if (0%{?rhel}) && (0%{?rhel} <= 7)
%define with_lsm 0
@ -47,25 +55,57 @@
Name: udisks2
Summary: Disk Manager
Version: 2.9.2
Release: 6%{?dist}
Version: 2.9.0
Release: 16%{?dist}
License: GPLv2+
Group: System Environment/Libraries
URL: https://github.com/storaged-project/udisks
Source0: https://github.com/storaged-project/udisks/releases/download/udisks-%{version}/udisks-%{version}.tar.bz2
Patch0: udisks-2.10.0-dosfstools_4.2.patch
Patch1: udisks-2.10.0-dosfstools_4.2-reread_part.patch
Patch2: udisks-2.10.0-module-names.patch
Patch3: udisks-2.10.0-ata_conf_apply_GTask.patch
# https://github.com/storaged-project/udisks/pull/847
Patch4: ignore-apple-boot-part.patch
Patch5: udisks-2.10.0-g_mkdtemp-leak.patch
Patch6: udisks-2.10.0-mdraid-iochannel-data.patch
Patch7: udisks-2.10.0-mdraid-g_source_attach.patch
Patch8: udisks-2.10.0-Ignore-Extended-Boot-Loader-GPT-partition.patch
Patch9: udisks-2.10.0-tests-drive_ata-apm.patch
Patch10: udisks-2.10.0-tests-no-dev_disk-by-path.patch
Patch0: udisks-2.9.1-teardown-needle-match.patch
Patch1: udisks-2.9.1-lvm_vdo-test_resize_physical-size.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=1855785
Patch2: udisks-2.9.1-drive_ata_tests.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2120697
Patch3: udisks-2.10.0-block_format_ata_secure_erase.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2135773
Patch4: udisks-2.10.0-iscsi-auth-info.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=1845973
Patch10: udisks-2.9.1-daemon-Always-flush-interface-property-changes.patch
Patch11: udisks-2.9.1-lvm2-Always-flush-interface-property-changes.patch
Patch12: udisks-2.9.1-lsm-Always-flush-interface-property-changes.patch
Patch13: udisks-2.9.1-iscsi-Always-flush-interface-property-changes.patch
Patch14: udisks-2.9.1-zram-Always-flush-interface-property-changes.patch
Patch15: udisks-2.9.2-udisksdaemonutil-Refactor-udisks_daemon_util_trigger.patch
Patch16: udisks-2.9.2-udiskslinuxmanager-Trigger-uevent-after-loop-device-setup.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2004422
Patch17: udisks-2.9.4-ext-mount-options.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2213715
Patch18: udisks-2.10.0-iscsi_timeout.patch
Patch20: udisks-2.10.0-tests-drive_ata-apm.patch
Patch21: udisks-2.10.0-tests-no-dev_disk-by-path.patch
Patch22: tests-disable-zram.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2023880
# https://bugzilla.redhat.com/show_bug.cgi?id=2025483
Patch23: udisks-2.10.0-vdo_test_writeAmplificationRatio.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=1999149
Patch24: udisks-2.10.0-udiskslinuxencrypted_GError.patch
Patch25: udisks-2.10.0-udiskslinuxpartition_GError.patch
Patch26: udisks-2.10.0-udiskslinuxpartitiontable_GError.patch
Patch27: udisks-2.10.0-udiskslinuxfilesystem_GError.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=1966460
Patch28: udisks-2.10.0-iscsi_test_01_badauth.patch
Patch29: udisks-2.10.0-iscsi_test_02_lio_target_conf.patch
Patch31: udisks-2.10.0-iscsi_test_04_fix_test_login_chap_auth.patch
Patch32: udisks-2.10.0-iscsi_test_05_restart_iscsid.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2188991
Patch33: udisks-2.10.0-iscsi-CHAP-auth-algs.patch
Patch34: udisks-2.9.4-FIPS_LUKS_fixes-2.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2039772
Patch35: udisks-2.10.0-lvm2_update_epoch.patch
Patch36: udisks-2.10.0-lvm2_vgcreate_uevent_sync.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=2213193
Patch37: udisks-2.10.0-iscsi-ibft-chap-auth.patch
BuildRequires: make
BuildRequires: glib2-devel >= %{glib2_version}
BuildRequires: gobject-introspection-devel >= %{gobject_introspection_version}
BuildRequires: libgudev1-devel >= %{systemd_version}
@ -120,12 +160,6 @@ Requires: eject
# For utab monitor
Requires: libmount
%if ! (0%{?rhel} && 0%{?rhel} < 8)
# Not really needed but doesn't make much sense to use UDisks without polkit
# (weak deps don't work on older versions of RHEL)
Recommends: polkit
%endif
Requires: lib%{name}%{?_isa} = %{version}-%{release}
# For mkntfs (not available on rhel or on ppc/ppc64)
@ -147,6 +181,7 @@ manipulate disks, storage devices and technologies.
%package -n lib%{name}
Summary: Dynamic library to access the udisksd daemon
Group: System Environment/Libraries
License: LGPLv2+
Provides: libstoraged = %{version}-%{release}
Obsoletes: libstoraged
@ -157,6 +192,7 @@ access to the udisksd daemon.
%package -n %{name}-iscsi
Summary: Module for iSCSI
Group: System Environment/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release}
License: LGPLv2+
Requires: iscsi-initiator-utils
@ -169,6 +205,7 @@ This package contains module for iSCSI configuration.
%package -n %{name}-lvm2
Summary: Module for LVM2
Group: System Environment/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release}
License: LGPLv2+
Requires: lvm2
@ -183,6 +220,7 @@ This package contains module for LVM2 configuration.
%package -n lib%{name}-devel
Summary: Development files for lib%{name}
Group: Development/Libraries
Requires: lib%{name}%{?_isa} = %{version}-%{release}
License: LGPLv2+
Provides: libstoraged-devel = %{version}-%{release}
@ -195,6 +233,7 @@ dynamic library, which provides access to the udisksd daemon.
%if 0%{?with_bcache}
%package -n %{name}-bcache
Summary: Module for Bcache
Group: System Environment/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release}
License: LGPLv2+
Requires: libblockdev-kbd >= %{libblockdev_version}
@ -209,6 +248,7 @@ This package contains module for Bcache configuration.
%if 0%{?with_btrfs}
%package -n %{name}-btrfs
Summary: Module for BTRFS
Group: System Environment/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release}
License: LGPLv2+
Requires: libblockdev-btrfs >= %{libblockdev_version}
@ -223,6 +263,7 @@ This package contains module for BTRFS configuration.
%if 0%{?with_lsm}
%package -n %{name}-lsm
Summary: Module for LSM
Group: System Environment/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release}
License: LGPLv2+
Requires: libstoragemgmt
@ -238,6 +279,7 @@ This package contains module for LSM configuration.
%if 0%{?with_zram}
%package -n %{name}-zram
Summary: Module for ZRAM
Group: System Environment/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release}
License: LGPLv2+
Requires: libblockdev-kbd >= %{libblockdev_version}
@ -251,15 +293,60 @@ Obsoletes: storaged-zram
This package contains module for ZRAM configuration.
%endif
%if 0%{?with_vdo}
%package -n %{name}-vdo
Summary: Module for VDO
Group: System Environment/Libraries
Requires: %{name}%{?_isa} = %{version}-%{release}
License: LGPLv2+
Requires: vdo
Requires: libblockdev-vdo >= %{libblockdev_version}
BuildRequires: libblockdev-vdo-devel >= %{libblockdev_version}
%description -n %{name}-vdo
This package contains module for VDO management.
%endif
%prep
%autosetup -p1 -n udisks-%{version}
%setup -q -n udisks-%{version}
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch31 -p1
%patch32 -p1
%patch33 -p1
%patch34 -p1
%patch35 -p1
%patch36 -p1
%patch37 -p1
sed -i udisks/udisks2.conf.in -e "s/encryption=luks1/encryption=%{default_luks_encryption}/"
rm -f src/tests/dbus-tests/config_h.py
%build
autoreconf -ivf
# modules need to be explicitly enabled
%configure \
--sysconfdir=/etc \
%if %{with_gtk_doc}
--enable-gtk-doc \
%else
@ -271,7 +358,9 @@ autoreconf -ivf
%if 0%{?with_btrfs}
--enable-btrfs \
%endif
--disable-vdo \
%if 0%{?with_vdo}
--enable-vdo \
%endif
%if 0%{?with_zram}
--enable-zram \
%endif
@ -318,17 +407,13 @@ fi
%if 0%{?with_zram}
%post -n %{name}-zram
%systemd_post udisks2-zram-setup@.service
if [ -S /run/udev/control ]; then
udevadm control --reload
udevadm trigger
fi
%systemd_post zram-setup@.service
%preun -n %{name}-zram
%systemd_preun udisks2-zram-setup@.service
%systemd_preun zram-setup@.service
%postun -n %{name}-zram
%systemd_postun udisks2-zram-setup@.service
%systemd_postun zram-setup@.service
%endif
%files -f udisks2.lang
@ -407,6 +492,9 @@ fi
%if 0%{?with_zram}
%{_libdir}/pkgconfig/udisks2-zram.pc
%endif
%if 0%{?with_vdo}
%{_libdir}/pkgconfig/udisks2-vdo.pc
%endif
%if 0%{?with_bcache}
%files -n %{name}-bcache
@ -434,79 +522,85 @@ fi
%dir %{_sysconfdir}/udisks2/modules.conf.d
%{_libdir}/udisks2/modules/libudisks2_zram.so
%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.zram.policy
%{_unitdir}/udisks2-zram-setup@.service
%{_udevrulesdir}/90-udisks2-zram.rules
%{_unitdir}/zram-setup@.service
%endif
%if 0%{?with_vdo}
%files -n %{name}-vdo
%{_libdir}/udisks2/modules/libudisks2_vdo.so
%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.vdo.policy
%endif
%changelog
* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 2.9.2-6
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
* Thu Aug 03 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-16
- iscsi: Fix login on firmware-discovered nodes (#2213193)
- tests: Extend iscsi method call timeouts (#2213715)
* Thu Apr 22 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.2-5
- Fix Drive.ATA test failures
* Tue Jun 06 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-15
- Reimport gating tests
* Tue Apr 20 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.2-4
- Fix a couple of issues found by Coverity (#1938890)
- Ignore systemd "Extended Boot Loader" GPT partition
* Fri Jun 02 2023 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-14
- iscsi: CHAP auth algorithm selection fixes (#2188991)
- tests: Use stronger passphrases for LUKS tests
- lvm2: Improve uevent processing (#2039772)
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 2.9.2-3
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
* Tue Nov 01 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-13
- Fix iscsi test auth failures (#1966460)
* Fri Mar 26 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.2-2
- Fix FAT mkfs with dosfstools >= 4.2
- udiskslinuxdriveata: Use GTask to apply configuration in a thread
- Limit allowed module names
- 80-udisks2.rules: Ignore Apple boot partition from livecd-tools
* Wed Oct 19 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-12
- Fix iscsi authentication info override (#2135773)
* Thu Feb 04 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.2-1
- Version 2.9.2
* Fri Sep 16 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-11
- Fix the patch list
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 2.9.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Fri Sep 16 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-10
- Restrict ATA Secure Erase Format() options (#2120697)
* Mon Sep 07 2020 Neal Gompa <ngompa13@gmail.com> - 2.9.1-2
- Fix conditional around polkit Recommends for building on EL7
* Tue Feb 01 2022 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-9
- Fix LVM-VDO statistics tests (#2023880,#2025483)
- Fix GError ownership (#1999149)
* Wed Aug 12 2020 Tomas Bzatek <tbzatek@redhat.com> - 2.9.1-1
- Version 2.9.1
- Renamed zram-setup@.service to udisks2-zram-setup@.service
* Mon Oct 25 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-8
- CVE-2021-3802: Harden the default mount options for ext filesystems (#2004422)
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.9.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Fri Apr 23 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-7
- Do not build udisks2-zram (#1923078)
- Fix Drive.ATA test failures (#1926827)
* Tue Jan 26 2021 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-6
- Rebuilt for new docbook-style-xsl (#1853153)
* Mon Nov 16 2020 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-5
- Fix loop device setup
* Tue Nov 10 2020 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-4
- Fix Drive.Ata tests with system SAS drives (#1855785)
- Force D-Bus interfaces flush (#1845973)
* Mon Jun 22 2020 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-3
- Fix the UdisksLVMVDOTest.test_resize_physical test (#1845435)
* Mon Jun 22 2020 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-2
- Fix block tear-down functionality (#1843454)
- Fix libblockdev requires
* Tue May 26 2020 Tomas Bzatek <tbzatek@redhat.com> - 2.9.0-1
- Version 2.9.0
- Rebase to 2.9.0 (#1824147)
* Fri Jan 31 2020 Fedora Release Engineering <releng@fedoraproject.org> - 2.8.4-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Tue Oct 01 2019 Jonathan Lebon <jonathan@jlebon.com> - 2.8.4-3
- Don't trigger udev if socket is not accessible
* Sat Jul 27 2019 Fedora Release Engineering <releng@fedoraproject.org> - 2.8.4-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Mon Jul 22 2019 Tomas Bzatek <tbzatek@redhat.com> - 2.8.4-1
- Version 2.8.4
* Fri Jun 14 2019 Tomas Bzatek <tbzatek@redhat.com> - 2.8.3-2
- Minor test fixes
- Fix potential NULL dereference in UDisksLinuxPartition
* Thu Jun 13 2019 Tomas Bzatek <tbzatek@redhat.com> - 2.8.3-1
- Version 2.8.3
- Rebased to upstream 2.8.3 release (#1685210)
- Fix leaking filedescriptors (#1614774)
- Fix udisksctl pager scrolling (#1662336)
- Fix LVM2 plugin CreateSnapshot() error (#1668291)
- Add ISCSI plugin GetInitiatorNameRaw() method (#1710257)
* Fri Mar 15 2019 Debarshi Ray <rishi@fedoraproject.org> - 2.8.2-2
- Update for tmpfiles.d snippet
* Mon Mar 04 2019 Tomas Bzatek <tbzatek@redhat.com> - 2.8.2-1
- Version 2.8.2
* Sun Feb 03 2019 Fedora Release Engineering <releng@fedoraproject.org> - 2.8.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Wed Sep 26 2018 Vojtech Trefny <vtrefny@redhat.com> - 2.8.1-1
- Version 2.8.1
* Fri Sep 14 2018 Adam Williamson <awilliam@redhat.com> - 2.8.0-2
- Backport PR #576 to fix udev multipath device check (see RHBZ#1628192)
* Mon Oct 08 2018 Vojtech Trefny <vtrefny@redhat.com> - 2.8.0-2
- Fix string format vulnerability
Resolves: rhbz#1632831
* Mon Aug 13 2018 Tomas Bzatek <tbzatek@redhat.com> - 2.8.0-1
- Version 2.8.0