diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4438026 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/udisks-2.9.0.tar.bz2 diff --git a/EMPTY b/EMPTY deleted file mode 100644 index 0519ecb..0000000 --- a/EMPTY +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sources b/sources new file mode 100644 index 0000000..615c536 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (udisks-2.9.0.tar.bz2) = 314355c9b0cc562b2359ea77137b3f2189c48e642c67cc9d9ed07048176967b67e78dfb3190dd160db2f92e8143a4f005bf2cc1aa814388a79201705e5297d0c diff --git a/tests-disable-zram.patch b/tests-disable-zram.patch new file mode 100644 index 0000000..3439866 --- /dev/null +++ b/tests-disable-zram.patch @@ -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') diff --git a/udisks-2.10.0-tests-drive_ata-apm.patch b/udisks-2.10.0-tests-drive_ata-apm.patch new file mode 100644 index 0000000..3dcc1eb --- /dev/null +++ b/udisks-2.10.0-tests-drive_ata-apm.patch @@ -0,0 +1,64 @@ +From c21ad308b1313a35cafa1664e5eb4772925bc005 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 22 Apr 2021 18:05:29 +0200 +Subject: [PATCH 1/2] tests: Mark Drive.ATA tests as unstable + +Some of the tests operate on physical ATA drives, comparing values between +smartctl output and udisks. Different libraries used, different approach +to retrieve some ATA features and values. Turned out this is not working +correctly on some SATA disks with each approach giving slightly different +results, presumably for the quirks in place. +--- + src/tests/dbus-tests/test_drive_ata.py | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/src/tests/dbus-tests/test_drive_ata.py b/src/tests/dbus-tests/test_drive_ata.py +index 3187367e..e91bd02f 100644 +--- a/src/tests/dbus-tests/test_drive_ata.py ++++ b/src/tests/dbus-tests/test_drive_ata.py +@@ -4,7 +4,7 @@ import re + import unittest + import time + +-from udiskstestcase import UdisksTestCase ++import udiskstestcase + + SMART_CMDLINE_FAIL = 1 << 0 + SMART_OPEN_READ_FAIL = 1 << 1 +@@ -32,7 +32,7 @@ def _get_sata_disks(): + + + for disk in _get_sata_disks(): +- ret, out = UdisksTestCase.run_command("smartctl -a /dev/%s" % disk) ++ ret, out = udiskstestcase.UdisksTestCase.run_command("smartctl -a /dev/%s" % disk) + + # Only the following bits in the exit status mean the device failed to + # provide valid SMART data, others may be set for different reasons (see +@@ -46,7 +46,7 @@ for disk in _get_sata_disks(): + else: + smart_unsupported.add(disk) + +-class UdisksDriveAtaTest(UdisksTestCase): ++class UdisksDriveAtaTest(udiskstestcase.UdisksTestCase): + '''Noninvasive tests for the Drive.Ata interface''' + + def get_smart_setting(self, disk, attr, out_prefix): +@@ -102,6 +102,7 @@ class UdisksDriveAtaTest(UdisksTestCase) + intro_data = drive_intro.Introspect() + self.assertNotIn('interface name="org.freedesktop.UDisks2.Drive.Ata"', intro_data) + ++ @udiskstestcase.tag_test(udiskstestcase.TestTags.UNSTABLE) + @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) + # nineth field is the raw value + self.assertEqual(int(pwon_s.value / 3600), int(pwon_attr[8])) + ++ @udiskstestcase.tag_test(udiskstestcase.TestTags.UNSTABLE) + @unittest.skipUnless(smart_supported, "No disks supporting S.M.A.R.T. available") + def test_smart_get_attributes(self): + for disk in smart_supported: +-- +2.30.2 + diff --git a/udisks-2.10.0-tests-no-dev_disk-by-path.patch b/udisks-2.10.0-tests-no-dev_disk-by-path.patch new file mode 100644 index 0000000..044a8aa --- /dev/null +++ b/udisks-2.10.0-tests-no-dev_disk-by-path.patch @@ -0,0 +1,43 @@ +From 1358d1e5208d71d5a70f17a242eda00f079a9d0b Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +Date: Thu, 22 Apr 2021 18:20:48 +0200 +Subject: [PATCH 2/2] tests: Handle missing /dev/disk/by-path gracefully + +Limited testing environments may not have this path always available. +--- + src/tests/dbus-tests/test_drive_ata.py | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +diff --git a/src/tests/dbus-tests/test_drive_ata.py b/src/tests/dbus-tests/test_drive_ata.py +index e91bd02f..37740c60 100644 +--- a/src/tests/dbus-tests/test_drive_ata.py ++++ b/src/tests/dbus-tests/test_drive_ata.py +@@ -20,14 +20,17 @@ 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) ++ try: ++ 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) ++ except: ++ pass + return sata_disks + + +-- +2.30.2 + diff --git a/udisks-2.10.0-udiskslinuxencrypted_GError.patch b/udisks-2.10.0-udiskslinuxencrypted_GError.patch new file mode 100644 index 0000000..572a187 --- /dev/null +++ b/udisks-2.10.0-udiskslinuxencrypted_GError.patch @@ -0,0 +1,30 @@ +From 486778c778a4ddb24395408c6b267e702e19ae02 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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; + } + diff --git a/udisks-2.10.0-udiskslinuxfilesystem_GError.patch b/udisks-2.10.0-udiskslinuxfilesystem_GError.patch new file mode 100644 index 0000000..dae7068 --- /dev/null +++ b/udisks-2.10.0-udiskslinuxfilesystem_GError.patch @@ -0,0 +1,49 @@ +From 223256777f6e269b8501d95a64c4c6095a7a8a3e Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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; + } + diff --git a/udisks-2.10.0-udiskslinuxpartition_GError.patch b/udisks-2.10.0-udiskslinuxpartition_GError.patch new file mode 100644 index 0000000..d2bdec4 --- /dev/null +++ b/udisks-2.10.0-udiskslinuxpartition_GError.patch @@ -0,0 +1,70 @@ +From 7c9933c0f80faaabbed607983fdf77f8c4562df6 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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; + } + } diff --git a/udisks-2.10.0-udiskslinuxpartitiontable_GError.patch b/udisks-2.10.0-udiskslinuxpartitiontable_GError.patch new file mode 100644 index 0000000..d97851e --- /dev/null +++ b/udisks-2.10.0-udiskslinuxpartitiontable_GError.patch @@ -0,0 +1,73 @@ +From f486a9fa22c2f9785a4a8fc58eb3be7b0cf934ce Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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; + } diff --git a/udisks-2.10.0-vdo_test_writeAmplificationRatio.patch b/udisks-2.10.0-vdo_test_writeAmplificationRatio.patch new file mode 100644 index 0000000..e232e77 --- /dev/null +++ b/udisks-2.10.0-vdo_test_writeAmplificationRatio.patch @@ -0,0 +1,25 @@ +From 0edd6f5579c964323d86897aff9476c20d7901ba Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +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' diff --git a/udisks-2.9.1-daemon-Always-flush-interface-property-changes.patch b/udisks-2.9.1-daemon-Always-flush-interface-property-changes.patch new file mode 100644 index 0000000..5698c5b --- /dev/null +++ b/udisks-2.9.1-daemon-Always-flush-interface-property-changes.patch @@ -0,0 +1,190 @@ +From e039516b103eb9749a3e261c5ee1a9bc110676cf Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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 + diff --git a/udisks-2.9.1-drive_ata_tests.patch b/udisks-2.9.1-drive_ata_tests.patch new file mode 100644 index 0000000..1882642 --- /dev/null +++ b/udisks-2.9.1-drive_ata_tests.patch @@ -0,0 +1,39 @@ +commit 214d65ae4d2b779fc1674420a042082ae029eb6b +Author: Vojtech Trefny +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 diff --git a/udisks-2.9.1-iscsi-Always-flush-interface-property-changes.patch b/udisks-2.9.1-iscsi-Always-flush-interface-property-changes.patch new file mode 100644 index 0000000..7fade24 --- /dev/null +++ b/udisks-2.9.1-iscsi-Always-flush-interface-property-changes.patch @@ -0,0 +1,25 @@ +From 195f3b030de32f5993da736c75e6a9bd76e6a7c7 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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 + diff --git a/udisks-2.9.1-lsm-Always-flush-interface-property-changes.patch b/udisks-2.9.1-lsm-Always-flush-interface-property-changes.patch new file mode 100644 index 0000000..cfd77da --- /dev/null +++ b/udisks-2.9.1-lsm-Always-flush-interface-property-changes.patch @@ -0,0 +1,25 @@ +From 861a0d8721536e2d210b79c845bb4f5b266b037f Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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 + diff --git a/udisks-2.9.1-lvm2-Always-flush-interface-property-changes.patch b/udisks-2.9.1-lvm2-Always-flush-interface-property-changes.patch new file mode 100644 index 0000000..8a920f2 --- /dev/null +++ b/udisks-2.9.1-lvm2-Always-flush-interface-property-changes.patch @@ -0,0 +1,110 @@ +From 39d13907f712269bb9debd0fd8a0852347c98136 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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 + diff --git a/udisks-2.9.1-lvm_vdo-test_resize_physical-size.patch b/udisks-2.9.1-lvm_vdo-test_resize_physical-size.patch new file mode 100644 index 0000000..cd2f1b5 --- /dev/null +++ b/udisks-2.9.1-lvm_vdo-test_resize_physical-size.patch @@ -0,0 +1,34 @@ +From 890a0f3ca8cb5894d1764752c98b90dcb6274d6d Mon Sep 17 00:00:00 2001 +From: Vojtech Trefny +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, diff --git a/udisks-2.9.1-teardown-needle-match.patch b/udisks-2.9.1-teardown-needle-match.patch new file mode 100644 index 0000000..2d1d5ed --- /dev/null +++ b/udisks-2.9.1-teardown-needle-match.patch @@ -0,0 +1,29 @@ +From fdf6b233df960e6903c62b86735d86c59d967d12 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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 + diff --git a/udisks-2.9.1-zram-Always-flush-interface-property-changes.patch b/udisks-2.9.1-zram-Always-flush-interface-property-changes.patch new file mode 100644 index 0000000..4bc30aa --- /dev/null +++ b/udisks-2.9.1-zram-Always-flush-interface-property-changes.patch @@ -0,0 +1,24 @@ +From 724ff8679e0ae0fd4d84f4e6c1b36007e648e8ca Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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 + diff --git a/udisks-2.9.2-udisksdaemonutil-Refactor-udisks_daemon_util_trigger.patch b/udisks-2.9.2-udisksdaemonutil-Refactor-udisks_daemon_util_trigger.patch new file mode 100644 index 0000000..3d2aa1b --- /dev/null +++ b/udisks-2.9.2-udisksdaemonutil-Refactor-udisks_daemon_util_trigger.patch @@ -0,0 +1,528 @@ +From 8d5c90a1f4bbe548a1ae361f8d69970669d6e72e Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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 + + +
+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 + #include + ++#include ++ + #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 + #include + +-#include +- + #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 + diff --git a/udisks-2.9.2-udiskslinuxmanager-Trigger-uevent-after-loop-device-setup.patch b/udisks-2.9.2-udiskslinuxmanager-Trigger-uevent-after-loop-device-setup.patch new file mode 100644 index 0000000..c37d942 --- /dev/null +++ b/udisks-2.9.2-udiskslinuxmanager-Trigger-uevent-after-loop-device-setup.patch @@ -0,0 +1,27 @@ +From 7fe04e70dc5a5ccf621a0beacc6d4b9e904037df Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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 + diff --git a/udisks-2.9.4-ext-mount-options.patch b/udisks-2.9.4-ext-mount-options.patch new file mode 100644 index 0000000..475eaec --- /dev/null +++ b/udisks-2.9.4-ext-mount-options.patch @@ -0,0 +1,54 @@ +From 2d5d2b7570b0f44c14b34b5dc831f174205c10f2 Mon Sep 17 00:00:00 2001 +From: Tomas Bzatek +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" }) diff --git a/udisks2.spec b/udisks2.spec new file mode 100644 index 0000000..acae95f --- /dev/null +++ b/udisks2.spec @@ -0,0 +1,690 @@ +%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.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 + +# valid options are 'luks1' or 'luks2' +%define default_luks_encryption luks1 + +%define is_fedora 0%{?rhel} == 0 + + +# bcache and zram are not available on RHEL +%if (0%{?rhel}) +%define with_bcache 0 +%define with_zram 0 +%endif + +# btrfs is not available on 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 +%define with_lvmcache 0 +%endif + +# default to LUKS2 for RHEL > 7 +%if 0%{?rhel} > 7 +%define default_luks_encryption luks2 +%endif + + +Name: udisks2 +Summary: Disk Manager +Version: 2.9.0 +Release: 9%{?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.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=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 +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 + +BuildRequires: glib2-devel >= %{glib2_version} +BuildRequires: gobject-introspection-devel >= %{gobject_introspection_version} +BuildRequires: libgudev1-devel >= %{systemd_version} +BuildRequires: libatasmart-devel >= %{libatasmart_version} +BuildRequires: polkit-devel >= %{polkit_version} +BuildRequires: systemd >= %{systemd_version} +BuildRequires: systemd-devel >= %{systemd_version} +BuildRequires: libacl-devel +BuildRequires: chrpath +BuildRequires: gtk-doc +BuildRequires: gettext-devel +BuildRequires: redhat-rpm-config +BuildRequires: libblockdev-devel >= %{libblockdev_version} +BuildRequires: libblockdev-part-devel >= %{libblockdev_version} +BuildRequires: libblockdev-loop-devel >= %{libblockdev_version} +BuildRequires: libblockdev-swap-devel >= %{libblockdev_version} +BuildRequires: libblockdev-mdraid-devel >= %{libblockdev_version} +BuildRequires: libblockdev-fs-devel >= %{libblockdev_version} +BuildRequires: libblockdev-crypto-devel >= %{libblockdev_version} +BuildRequires: libmount-devel +BuildRequires: libuuid-devel + +Requires: libblockdev >= %{libblockdev_version} +Requires: libblockdev-part >= %{libblockdev_version} +Requires: libblockdev-loop >= %{libblockdev_version} +Requires: libblockdev-swap >= %{libblockdev_version} +Requires: libblockdev-mdraid >= %{libblockdev_version} +Requires: libblockdev-fs >= %{libblockdev_version} +Requires: libblockdev-crypto >= %{libblockdev_version} + +# Needed for the systemd-related macros used in this file +%{?systemd_requires} +BuildRequires: systemd + +# Needed to pull in the system bus daemon +Requires: dbus >= %{dbus_version} +# Needed to pull in the udev daemon +Requires: udev >= %{systemd_version} +# We need at least this version for bugfixes/features etc. +Requires: libatasmart >= %{libatasmart_version} +# For mount, umount, mkswap +Requires: util-linux +# For mkfs.ext3, mkfs.ext3, e2label +Requires: e2fsprogs +# For mkfs.xfs, xfs_admin +Requires: xfsprogs +# For mkfs.vfat +Requires: dosfstools +Requires: gdisk +# For ejecting removable disks +Requires: eject +# For utab monitor +Requires: libmount + +Requires: lib%{name}%{?_isa} = %{version}-%{release} + +# For mkntfs (not available on rhel or on ppc/ppc64) +%if ! 0%{?rhel} +%ifnarch ppc ppc64 +Requires: ntfsprogs +%endif +%endif + +# For /proc/self/mountinfo, only available in 2.6.26 or higher +Conflicts: kernel < 2.6.26 + +Provides: storaged = %{version}-%{release} +Obsoletes: storaged + +%description +The Udisks project provides a daemon, tools and libraries to access and +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 + +%description -n lib%{name} +This package contains the dynamic library, which provides +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 +BuildRequires: iscsi-initiator-utils-devel +Provides: storaged-iscsi = %{version}-%{release} +Obsoletes: storaged-iscsi + +%description -n %{name}-iscsi +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 +Requires: libblockdev-lvm >= %{libblockdev_version} +BuildRequires: lvm2-devel +BuildRequires: libblockdev-lvm-devel >= %{libblockdev_version} +Provides: storaged-lvm2 = %{version}-%{release} +Obsoletes: storaged-lvm2 + +%description -n %{name}-lvm2 +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} +Obsoletes: libstoraged-devel + +%description -n lib%{name}-devel +This package contains the development files for the library lib%{name}, a +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} +BuildRequires: libblockdev-kbd-devel >= %{libblockdev_version} +Provides: storaged-bcache = %{version}-%{release} +Obsoletes: storaged-bcache + +%description -n %{name}-bcache +This package contains module for Bcache configuration. +%endif + +%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} +BuildRequires: libblockdev-btrfs-devel >= %{libblockdev_version} +Provides: storaged-btrfs = %{version}-%{release} +Obsoletes: storaged-btrfs + +%description -n %{name}-btrfs +This package contains module for BTRFS configuration. +%endif + +%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 +BuildRequires: libstoragemgmt-devel +BuildRequires: libconfig-devel +Provides: storaged-lsm = %{version}-%{release} +Obsoletes: storaged-lsm + +%description -n %{name}-lsm +This package contains module for LSM configuration. +%endif + +%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} +Requires: libblockdev-swap >= %{libblockdev_version} +BuildRequires: libblockdev-kbd-devel >= %{libblockdev_version} +BuildRequires: libblockdev-swap-devel +Provides: storaged-zram = %{version}-%{release} +Obsoletes: storaged-zram + +%description -n %{name}-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 +%setup -q -n udisks-%{version} +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch10 -p1 +%patch11 -p1 +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 +%patch16 -p1 +%patch17 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 +%patch23 -p1 +%patch24 -p1 +%patch25 -p1 +%patch26 -p1 +%patch27 -p1 +sed -i udisks/udisks2.conf.in -e "s/encryption=luks1/encryption=%{default_luks_encryption}/" + +%build +autoreconf -ivf +# modules need to be explicitly enabled +%configure \ + --sysconfdir=/etc \ +%if %{with_gtk_doc} + --enable-gtk-doc \ +%else + --disable-gtk-doc \ +%endif +%if 0%{?with_bcache} + --enable-bcache \ +%endif +%if 0%{?with_btrfs} + --enable-btrfs \ +%endif +%if 0%{?with_vdo} + --enable-vdo \ +%endif +%if 0%{?with_zram} + --enable-zram \ +%endif +%if 0%{?with_lsm} + --enable-lsm \ +%endif +%if 0%{?with_lvmcache} + --enable-lvmcache \ +%endif + --enable-lvm2 \ + --enable-iscsi +make %{?_smp_mflags} + +%install +make install DESTDIR=%{buildroot} +%if %{with_gtk_doc} == 0 +rm -fr %{buildroot}/%{_datadir}/gtk-doc/html/udisks2 +%endif + +find %{buildroot} -name \*.la -o -name \*.a | xargs rm + +chrpath --delete %{buildroot}/%{_sbindir}/umount.udisks2 +chrpath --delete %{buildroot}/%{_bindir}/udisksctl +chrpath --delete %{buildroot}/%{_libexecdir}/udisks2/udisksd + +%find_lang udisks2 + +%post -n %{name} +%systemd_post udisks2.service +# skip retriggering if udevd isn't even accessible, e.g. containers or +# rpm-ostree-based systems +if [ -S /run/udev/control ]; then + udevadm control --reload + udevadm trigger +fi + +%preun -n %{name} +%systemd_preun udisks2.service + +%postun -n %{name} +%systemd_postun_with_restart udisks2.service + +%ldconfig_scriptlets -n lib%{name} + +%if 0%{?with_zram} +%post -n %{name}-zram +%systemd_post zram-setup@.service + +%preun -n %{name}-zram +%systemd_preun zram-setup@.service + +%postun -n %{name}-zram +%systemd_postun zram-setup@.service +%endif + +%files -f udisks2.lang +%doc README.md AUTHORS NEWS HACKING +%license COPYING + +%dir %{_sysconfdir}/udisks2 +%if %{is_fedora} +%dir %{_sysconfdir}/udisks2/modules.conf.d +%endif +%{_sysconfdir}/udisks2/udisks2.conf +%{_sysconfdir}/udisks2/mount_options.conf.example + +%{_datadir}/dbus-1/system.d/org.freedesktop.UDisks2.conf +%{_datadir}/bash-completion/completions/udisksctl +%{_tmpfilesdir}/%{name}.conf +%{_unitdir}/udisks2.service +%{_udevrulesdir}/80-udisks2.rules +%{_sbindir}/umount.udisks2 + + +%dir %{_libdir}/udisks2 +%dir %{_libdir}/udisks2/modules +%dir %{_libexecdir}/udisks2 +%{_libexecdir}/udisks2/udisksd + +%{_bindir}/udisksctl + +%{_mandir}/man1/udisksctl.1* +%{_mandir}/man5/udisks2.conf.5* +%{_mandir}/man8/udisksd.8* +%{_mandir}/man8/udisks.8* +%{_mandir}/man8/umount.udisks2.8* + +%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.policy +%{_datadir}/dbus-1/system-services/org.freedesktop.UDisks2.service + +# Permissions for local state data are 0700 to avoid leaking information +# about e.g. mounts to unprivileged users +%attr(0700,root,root) %dir %{_localstatedir}/lib/udisks2 + +%files -n lib%{name} +%{_libdir}/libudisks2.so.* +%{_libdir}/girepository-1.0/UDisks-2.0.typelib + +%files -n %{name}-lvm2 +%{_libdir}/udisks2/modules/libudisks2_lvm2.so +%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.lvm2.policy + +%files -n %{name}-iscsi +%{_libdir}/udisks2/modules/libudisks2_iscsi.so +%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.iscsi.policy + +%files -n lib%{name}-devel +%{_libdir}/libudisks2.so +%dir %{_includedir}/udisks2 +%dir %{_includedir}/udisks2/udisks +%{_includedir}/udisks2/udisks/*.h +%{_datadir}/gir-1.0/UDisks-2.0.gir +%if %{with_gtk_doc} +%dir %{_datadir}/gtk-doc/html/udisks2 +%{_datadir}/gtk-doc/html/udisks2/* +%endif +%{_libdir}/pkgconfig/udisks2.pc +%{_libdir}/pkgconfig/udisks2-lvm2.pc +%{_libdir}/pkgconfig/udisks2-iscsi.pc +%if 0%{?with_bcache} +%{_libdir}/pkgconfig/udisks2-bcache.pc +%endif +%if 0%{?with_btrfs} +%{_libdir}/pkgconfig/udisks2-btrfs.pc +%endif +%if 0%{?with_lsm} +%{_libdir}/pkgconfig/udisks2-lsm.pc +%endif +%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 +%{_libdir}/udisks2/modules/libudisks2_bcache.so +%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.bcache.policy +%endif + +%if 0%{?with_btrfs} +%files -n %{name}-btrfs +%{_libdir}/udisks2/modules/libudisks2_btrfs.so +%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.btrfs.policy +%endif + +%if 0%{?with_lsm} +%files -n %{name}-lsm +%dir %{_sysconfdir}/udisks2/modules.conf.d +%{_libdir}/udisks2/modules/libudisks2_lsm.so +%{_mandir}/man5/udisks2_lsm.conf.* +%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.lsm.policy +%attr(0600,root,root) %{_sysconfdir}/udisks2/modules.conf.d/udisks2_lsm.conf +%endif + +%if 0%{?with_zram} +%files -n %{name}-zram +%dir %{_sysconfdir}/udisks2/modules.conf.d +%{_libdir}/udisks2/modules/libudisks2_zram.so +%{_datadir}/polkit-1/actions/org.freedesktop.UDisks2.zram.policy +%{_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 Feb 01 2022 Tomas Bzatek - 2.9.0-9 +- Fix LVM-VDO statistics tests (#2023880,#2025483) +- Fix GError ownership (#1999149) + +* Mon Oct 25 2021 Tomas Bzatek - 2.9.0-8 +- CVE-2021-3802: Harden the default mount options for ext filesystems (#2004422) + +* Fri Apr 23 2021 Tomas Bzatek - 2.9.0-7 +- Do not build udisks2-zram (#1923078) +- Fix Drive.ATA test failures (#1926827) + +* Tue Jan 26 2021 Tomas Bzatek - 2.9.0-6 +- Rebuilt for new docbook-style-xsl (#1853153) + +* Mon Nov 16 2020 Tomas Bzatek - 2.9.0-5 +- Fix loop device setup + +* Tue Nov 10 2020 Tomas Bzatek - 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 - 2.9.0-3 +- Fix the UdisksLVMVDOTest.test_resize_physical test (#1845435) + +* Mon Jun 22 2020 Tomas Bzatek - 2.9.0-2 +- Fix block tear-down functionality (#1843454) +- Fix libblockdev requires + +* Tue May 26 2020 Tomas Bzatek - 2.9.0-1 +- Rebase to 2.9.0 (#1824147) + +* Fri Jun 14 2019 Tomas Bzatek - 2.8.3-2 +- Minor test fixes +- Fix potential NULL dereference in UDisksLinuxPartition + +* Thu Jun 13 2019 Tomas Bzatek - 2.8.3-1 +- 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) + +* Mon Oct 08 2018 Vojtech Trefny - 2.8.0-2 +- Fix string format vulnerability + Resolves: rhbz#1632831 + +* Mon Aug 13 2018 Tomas Bzatek - 2.8.0-1 +- Version 2.8.0 + +* Tue Jul 24 2018 Adam Williamson - 2.7.7-3 +- Rebuild for new libconfig + +* Sat Jul 14 2018 Fedora Release Engineering - 2.7.7-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Wed Jul 04 2018 Vojtech Trefny - 2.7.7-1 +- Version 2.7.7 + +* Thu Feb 08 2018 Vojtech Trefny - 2.7.6-1 +- Version 2.7.6 + +* Fri Feb 02 2018 Igor Gnatenko - 2.7.5-2 +- Switch to %%ldconfig_scriptlets + +* Mon Dec 04 2017 Vojtech Trefny - 2.7.5-1 +- Version 2.7.5 + +* Wed Nov 01 2017 Vojtech Trefny - 2.7.4-1 +- Version 2.7.4 + +* Thu Aug 31 2017 Vojtech Trefny - 2.7.3-1 +- Version 2.7.3 + +* Thu Aug 03 2017 Vojtech Trefny - 2.7.2-1 +- Version 2.7.2 + +* Thu Aug 03 2017 Fedora Release Engineering - 2.7.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Thu Jul 27 2017 Fedora Release Engineering - 2.7.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 03 2017 Vojtech Trefny - 2.7.1-1 +- Version 2.7.1 + +* Tue Jun 20 2017 Vojtech Trefny - 2.7.0-3 +- Do not try to remove changed_blacklist hash table in finalize + +* Mon Jun 19 2017 Vojtech Trefny - 2.7.0-2 +- Fix how UDisksClient filters property changes + +* Fri Jun 02 2017 Vojtech Trefny - 2.7.0-1 +- Version 2.7.0 + +* Mon May 15 2017 Vojtech Trefny - 2.6.5-1 +- Version 2.6.5 + +* Tue Mar 14 2017 Vojtech Trefny - 2.6.4-1 +- Version 2.6.4 + +* Mon Nov 14 2016 Tomas Smetana - 2.6.3-1 +- Version 2.6.3 + +* Thu Jun 16 2016 Tomas Smetana - 2.6.2-1 +- Version 2.6.2; aimed to replace udisks2 + +* Wed Apr 27 2016 Peter Hatina - 2.6.0-3 +- Add support for libblockdev-part plugin which replaces + parted calls + +* Wed Mar 16 2016 Peter Hatina - 2.6.0-2 +- Fix permissions set for storaged_lsm.conf so it is readable only by root + +* Mon Mar 14 2016 Peter Hatina - 2.6.0-1 +- Upgrade to 2.6.0 + +* Wed Feb 10 2016 Peter Hatina - 2.5.0-3 +- Package template zram-setup@.service file + +* Wed Feb 10 2016 Peter Hatina - 2.5.0-2 +- Add udisksd configuration file and its man page + +* Thu Jan 28 2016 Peter Hatina - 2.5.0-1 +- UDisks2 drop-in replacement + +* Thu Jan 21 2016 Peter Hatina - 2.4.0-3 +- Redesign subpackage dependencies +- Make GTK documentation generation configurable + +* Wed Jan 20 2016 Peter Hatina - 2.4.0-2 +- Reload udev rules and trigger events when installed + +* Wed Jan 13 2016 Peter Hatina - 2.4.0-1 +- Upgrade to 2.4.0 + +* Wed Sep 30 2015 Peter Hatina - 2.3.0-2 +- Add Fedora/RHEL package configuration options + +* Mon Sep 14 2015 Peter Hatina - 2.3.0-1 +- Change BuildRequires from pkgconfig macro to -devel packages +- Upgrade to 2.3.0 + +* Mon Aug 24 2015 Peter Hatina - 2.2.0-1 +- Upgrade to 2.2.0 + +* Fri Jul 3 2015 Peter Hatina - 2.1.1-1 +- Upgrade to 2.1.1 + +* Wed Jun 24 2015 Peter Hatina - 2.1.0-4 +- Add Requires for storaged modules + +* Wed Jun 24 2015 Peter Hatina - 2.1.0-3 +- Changes for EPEL-7 + - Lower systemd required version to 208 + - Rewrite BuildRequires for systemd-devel + +* Fri Jun 19 2015 Fedora Release Engineering - 2.1.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Thu Jun 11 2015 Peter Hatina - 2.1.0-1 +- Update to upstream 2.1.0 + +* Thu Apr 02 2015 Peter Hatina - 2.0.0-1 +- Rebase to the new Storaged implementation +- Upstream: https://storaged.org + +* Tue Sep 16 2014 Stef Walter - 0.3.1-1 +- Update to upstream 0.3.1 + +* Mon Aug 18 2014 Fedora Release Engineering - 0.3.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Sun Jun 08 2014 Fedora Release Engineering - 0.3.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Tue Apr 08 2014 Patrick Uiterwijk - 0.3.0-1 +- Update to upstream 0.3.0 + +* Fri Jan 31 2014 Patrick Uiterwijk - 0.2.0-1 +- Update to upstream 0.2.0 + +* Thu Jan 16 2014 Patrick Uiterwijk - 0.1.0-2 +- Removed double systemd BuildRequire +- Rewritten summary and description + +* Sun Jan 12 2014 Patrick Uiterwijk - 0.1.0-1 +- Rename from udisks2-lvm