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