This patch is derived from upstream commit 2520aea6 and fixes upstream issues
285 and 302.  See https://gitlab.gnome.org/GNOME/gcr/merge_requests/387,
https://gitlab.gnome.org/GNOME/gnome-control-center/issues/285 and
https://gitlab.gnome.org/GNOME/gnome-control-center/issues/302.

diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c
index e2276a295b3fd9de01b30fc3369069b5d33ba5b7..ff47c1fef2493bcc7ab34f9e8716d570d8d370ed 100644
--- a/panels/info/cc-info-overview-panel.c
+++ b/panels/info/cc-info-overview-panel.c
@@ -36,6 +36,7 @@
 #include <glibtop/mountlist.h>
 #include <glibtop/mem.h>
 #include <glibtop/sysinfo.h>
+#include <udisks/udisks.h>
 
 #include <gdk/gdk.h>
 
@@ -81,9 +82,7 @@ typedef struct
 
   GCancellable   *cancellable;
 
-  /* Free space */
-  GList          *primary_mounts;
-  guint64         total_bytes;
+  UDisksClient   *client;
 
   GraphicsData   *graphics_data;
 } CcInfoOverviewPanelPrivate;
@@ -96,8 +95,6 @@ struct _CcInfoOverviewPanel
  CcInfoOverviewPanelPrivate *priv;
 };
 
-static void get_primary_disc_info_start (CcInfoOverviewPanel *self);
-
 typedef struct
 {
   char *major;
@@ -486,111 +483,51 @@ get_os_type (void)
 }
 
 static void
-query_done (GFile               *file,
-            GAsyncResult        *res,
-            CcInfoOverviewPanel *self)
+get_primary_disc_info (CcInfoOverviewPanel *self)
 {
   CcInfoOverviewPanelPrivate *priv;
-  g_autoptr(GFileInfo) info = NULL;
-  g_autoptr(GError) error = NULL;
-
-  info = g_file_query_filesystem_info_finish (file, res, &error);
-  if (info != NULL)
-    {
-      priv = cc_info_overview_panel_get_instance_private (self);
-      priv->total_bytes += g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE);
-    }
-  else
-    {
-      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
-          return;
-      else
-        {
-          g_autofree char *path = NULL;
-          path = g_file_get_path (file);
-          g_warning ("Failed to get filesystem free space for '%s': %s", path, error->message);
-        }
-    }
+  GDBusObjectManager *manager;
+  g_autolist(GDBusObject) objects = NULL;
+  GList *l;
+  guint64 total_size;
 
-  /* And onto the next element */
-  get_primary_disc_info_start (self);
-}
-
-static void
-get_primary_disc_info_start (CcInfoOverviewPanel *self)
-{
-  GUnixMountEntry *mount;
-  g_autoptr(GFile) file = NULL;
-  CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
+  priv = cc_info_overview_panel_get_instance_private (self);
+  total_size = 0;
 
-  if (priv->primary_mounts == NULL)
+  if (!priv->client)
     {
-      g_autofree char *size = NULL;
-
-      size = g_format_size (priv->total_bytes);
-      gtk_label_set_text (GTK_LABEL (priv->disk_label), size);
-
+      gtk_label_set_text (GTK_LABEL (priv->disk_label), _("Unknown"));
       return;
     }
 
-  mount = priv->primary_mounts->data;
-  priv->primary_mounts = g_list_remove (priv->primary_mounts, mount);
-  file = g_file_new_for_path (g_unix_mount_get_mount_path (mount));
-  g_unix_mount_free (mount);
-
-  g_file_query_filesystem_info_async (file,
-                                      G_FILE_ATTRIBUTE_FILESYSTEM_SIZE,
-                                      0,
-                                      priv->cancellable,
-                                      (GAsyncReadyCallback) query_done,
-                                      self);
-}
-
-static void
-get_primary_disc_info (CcInfoOverviewPanel *self)
-{
-  GList *points;
-  GList *p;
-  GHashTable *hash;
-  CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
-
-  hash = g_hash_table_new (g_str_hash, g_str_equal);
-  points = g_unix_mount_points_get (NULL);
-
-  /* If we do not have /etc/fstab around, try /etc/mtab */
-  if (points == NULL)
-    points = g_unix_mounts_get (NULL);
+  manager = udisks_client_get_object_manager (priv->client);
+  objects = g_dbus_object_manager_get_objects (manager);
 
-  for (p = points; p != NULL; p = p->next)
+  for (l = objects; l != NULL; l = l->next)
     {
-      GUnixMountEntry *mount = p->data;
-      const char *mount_path;
-      const char *device_path;
-
-      mount_path = g_unix_mount_get_mount_path (mount);
-      device_path = g_unix_mount_get_device_path (mount);
-
-      /* Do not count multiple mounts with same device_path, because it is
-       * probably something like btrfs subvolume. Use only the first one in
-       * order to count the real size. */
-      if (gsd_should_ignore_unix_mount (mount) ||
-          gsd_is_removable_mount (mount) ||
-          g_str_has_prefix (mount_path, "/media/") ||
-          g_str_has_prefix (mount_path, g_get_home_dir ()) ||
-          g_hash_table_lookup (hash, device_path) != NULL)
+      UDisksDrive *drive;
+      drive = udisks_object_peek_drive (UDISKS_OBJECT (l->data));
+
+      /* Skip removable devices */
+      if (drive == NULL ||
+          udisks_drive_get_removable (drive) ||
+          udisks_drive_get_ejectable (drive))
         {
-          g_unix_mount_free (mount);
           continue;
         }
 
-      priv->primary_mounts = g_list_prepend (priv->primary_mounts, mount);
-      g_hash_table_insert (hash, (gpointer) device_path, (gpointer) device_path);
+      total_size += udisks_drive_get_size (drive);
     }
-  g_list_free (points);
-  g_hash_table_destroy (hash);
 
-  priv->cancellable = g_cancellable_new ();
-  get_primary_disc_info_start (self);
+  if (total_size > 0)
+    {
+      g_autofree gchar *size = g_format_size (total_size);
+      gtk_label_set_text (GTK_LABEL (priv->disk_label), size);
+    }
+  else
+    {
+      gtk_label_set_text (GTK_LABEL (priv->disk_label), _("Unknown"));
+    }
 }
 
 static char *
@@ -852,8 +789,7 @@ cc_info_overview_panel_finalize (GObject *object)
       g_clear_object (&priv->cancellable);
     }
 
-  if (priv->primary_mounts)
-    g_list_free_full (priv->primary_mounts, (GDestroyNotify) g_unix_mount_free);
+  g_clear_object (&priv->client);
 
   g_free (priv->gnome_version);
   g_free (priv->gnome_date);
@@ -895,6 +831,7 @@ static void
 cc_info_overview_panel_init (CcInfoOverviewPanel *self)
 {
   CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self);
+  g_autoptr(GError) error = NULL;
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
@@ -907,6 +844,12 @@ cc_info_overview_panel_init (CcInfoOverviewPanel *self)
   else
     gtk_widget_destroy (priv->updates_button);
 
+  priv->client = udisks_client_new_sync (NULL, &error);
+
+  if (error != NULL)
+      g_warning ("Unable to get UDisks client: %s. Disk information will not be available.",
+                 error->message);
+
   info_overview_panel_setup_overview (self);
   info_overview_panel_setup_virt (self);
 }
diff --git a/panels/info/meson.build b/panels/info/meson.build
index 03742551314f91b60e3ec1caad153ff314b93310..c54e5fdaff3c6ddb59cca8ee9a2bf5a0212bf196 100644
--- a/panels/info/meson.build
+++ b/panels/info/meson.build
@@ -61,6 +61,7 @@ sources += gnome.compile_resources(
 
 deps = common_deps + [
   polkit_gobject_dep,
+  dependency('udisks2', version: '>= 2.1.8'),
   dependency('libgtop-2.0')
 ]