summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--monitor/udisks2/gvfsudisks2volume.c17
-rw-r--r--monitor/udisks2/gvfsudisks2volume.h3
-rw-r--r--monitor/udisks2/gvfsudisks2volumemonitor.c66
3 files changed, 56 insertions, 30 deletions
diff --git a/monitor/udisks2/gvfsudisks2volume.c b/monitor/udisks2/gvfsudisks2volume.c
index 85242672..89c24136 100644
--- a/monitor/udisks2/gvfsudisks2volume.c
+++ b/monitor/udisks2/gvfsudisks2volume.c
@@ -56,6 +56,9 @@ struct _GVfsUDisks2Volume
GVfsUDisks2Mount *mount; /* owned by volume monitor */
GVfsUDisks2Drive *drive; /* owned by volume monitor */
+ /* If TRUE, the volume was discovered at coldplug time */
+ gboolean coldplug;
+
/* exactly one of these are set */
UDisksBlock *block;
GUnixMountPoint *mount_point;
@@ -326,14 +329,18 @@ update_volume (GVfsUDisks2Volume *volume)
*/
if (udisks_block_get_hint_auto (volume->block))
{
+ gboolean just_plugged_in = FALSE;
/* Also, if a volume (partition) appear _much later_ than when media was inserted it
* can only be because the media was repartitioned. We don't want to automount
* such volumes. So only mark volumes appearing just after their drive.
+ *
+ * There's a catch here - if the volume was discovered at coldplug-time (typically
+ * when the user desktop session started), we can't use this heuristic
*/
if (g_get_real_time () - udisks_drive_get_time_media_detected (udisks_drive) < 5 * G_USEC_PER_SEC)
- {
- volume->should_automount = TRUE;
- }
+ just_plugged_in = TRUE;
+ if (volume->coldplug || just_plugged_in)
+ volume->should_automount = TRUE;
}
g_object_unref (udisks_drive);
@@ -472,12 +479,14 @@ gvfs_udisks2_volume_new (GVfsUDisks2VolumeMonitor *monitor,
UDisksBlock *block,
GUnixMountPoint *mount_point,
GVfsUDisks2Drive *drive,
- GFile *activation_root)
+ GFile *activation_root,
+ gboolean coldplug)
{
GVfsUDisks2Volume *volume;
volume = g_object_new (GVFS_TYPE_UDISKS2_VOLUME, NULL);
volume->monitor = monitor;
+ volume->coldplug = coldplug;
volume->sort_key = g_strdup_printf ("gvfs.time_detected_usec.%" G_GINT64_FORMAT, g_get_real_time ());
diff --git a/monitor/udisks2/gvfsudisks2volume.h b/monitor/udisks2/gvfsudisks2volume.h
index 1635ad2c..586e5f62 100644
--- a/monitor/udisks2/gvfsudisks2volume.h
+++ b/monitor/udisks2/gvfsudisks2volume.h
@@ -41,7 +41,8 @@ GVfsUDisks2Volume *gvfs_udisks2_volume_new (GVfsUDisks2VolumeMonitor *
UDisksBlock *block,
GUnixMountPoint *mount_point,
GVfsUDisks2Drive *drive,
- GFile *activation_root);
+ GFile *activation_root,
+ gboolean coldplug);
void gvfs_udisks2_volume_removed (GVfsUDisks2Volume *volume);
UDisksBlock *gvfs_udisks2_volume_get_block (GVfsUDisks2Volume *volume);
diff --git a/monitor/udisks2/gvfsudisks2volumemonitor.c b/monitor/udisks2/gvfsudisks2volumemonitor.c
index 3d5cbd52..1ea86b20 100644
--- a/monitor/udisks2/gvfsudisks2volumemonitor.c
+++ b/monitor/udisks2/gvfsudisks2volumemonitor.c
@@ -71,24 +71,30 @@ static void object_list_free (GList *objects);
static UDisksClient *get_udisks_client_sync (GError **error);
static void update_all (GVfsUDisks2VolumeMonitor *monitor,
- gboolean emit_changes);
+ gboolean emit_changes,
+ gboolean coldplug);
static void update_drives (GVfsUDisks2VolumeMonitor *monitor,
GList **added_drives,
- GList **removed_drives);
+ GList **removed_drives,
+ gboolean coldplug);
static void update_volumes (GVfsUDisks2VolumeMonitor *monitor,
GList **added_volumes,
- GList **removed_volumes);
+ GList **removed_volumes,
+ gboolean coldplug);
static void update_fstab_volumes (GVfsUDisks2VolumeMonitor *monitor,
GList **added_volumes,
- GList **removed_volumes);
+ GList **removed_volumes,
+ gboolean coldplug);
static void update_mounts (GVfsUDisks2VolumeMonitor *monitor,
GList **added_mounts,
- GList **removed_mounts);
+ GList **removed_mounts,
+ gboolean coldplug);
static void update_discs (GVfsUDisks2VolumeMonitor *monitor,
GList **added_volumes,
GList **removed_volumes,
GList **added_mounts,
- GList **removed_mounts);
+ GList **removed_mounts,
+ gboolean coldplug);
static void on_client_changed (UDisksClient *client,
@@ -320,7 +326,7 @@ gvfs_udisks2_volume_monitor_init (GVfsUDisks2VolumeMonitor *monitor)
G_CALLBACK (mountpoints_changed),
monitor);
- update_all (monitor, FALSE);
+ update_all (monitor, FALSE, TRUE);
}
static gboolean
@@ -388,7 +394,7 @@ gvfs_udisks2_volume_monitor_update (GVfsUDisks2VolumeMonitor *monitor)
{
g_return_if_fail (GVFS_IS_UDISKS2_VOLUME_MONITOR (monitor));
udisks_client_settle (monitor->client);
- update_all (monitor, TRUE);
+ update_all (monitor, TRUE, FALSE);
}
/* ---------------------------------------------------------------------------------------------------- */
@@ -496,7 +502,7 @@ on_client_changed (UDisksClient *client,
gpointer user_data)
{
GVfsUDisks2VolumeMonitor *monitor = GVFS_UDISKS2_VOLUME_MONITOR (user_data);
- update_all (monitor, TRUE);
+ update_all (monitor, TRUE, FALSE);
}
static void
@@ -504,7 +510,7 @@ mountpoints_changed (GUnixMountMonitor *mount_monitor,
gpointer user_data)
{
GVfsUDisks2VolumeMonitor *monitor = GVFS_UDISKS2_VOLUME_MONITOR (user_data);
- update_all (monitor, TRUE);
+ update_all (monitor, TRUE, FALSE);
}
static void
@@ -512,14 +518,15 @@ mounts_changed (GUnixMountMonitor *mount_monitor,
gpointer user_data)
{
GVfsUDisks2VolumeMonitor *monitor = GVFS_UDISKS2_VOLUME_MONITOR (user_data);
- update_all (monitor, TRUE);
+ update_all (monitor, TRUE, FALSE);
}
/* ---------------------------------------------------------------------------------------------------- */
static void
update_all (GVfsUDisks2VolumeMonitor *monitor,
- gboolean emit_changes)
+ gboolean emit_changes,
+ gboolean coldplug)
{
GList *added_drives, *removed_drives;
GList *added_volumes, *removed_volumes;
@@ -532,13 +539,14 @@ update_all (GVfsUDisks2VolumeMonitor *monitor,
added_mounts = NULL;
removed_mounts = NULL;
- update_drives (monitor, &added_drives, &removed_drives);
- update_volumes (monitor, &added_volumes, &removed_volumes);
- update_fstab_volumes (monitor, &added_volumes, &removed_volumes);
- update_mounts (monitor, &added_mounts, &removed_mounts);
+ update_drives (monitor, &added_drives, &removed_drives, coldplug);
+ update_volumes (monitor, &added_volumes, &removed_volumes, coldplug);
+ update_fstab_volumes (monitor, &added_volumes, &removed_volumes, coldplug);
+ update_mounts (monitor, &added_mounts, &removed_mounts, coldplug);
update_discs (monitor,
&added_volumes, &removed_volumes,
- &added_mounts, &removed_mounts);
+ &added_mounts, &removed_mounts,
+ coldplug);
if (emit_changes)
{
@@ -1219,7 +1227,8 @@ find_mount_by_mount_path (GVfsUDisks2VolumeMonitor *monitor,
static void
update_drives (GVfsUDisks2VolumeMonitor *monitor,
GList **added_drives,
- GList **removed_drives)
+ GList **removed_drives,
+ gboolean coldplug)
{
GList *cur_udisks_drives;
GList *new_udisks_drives;
@@ -1303,7 +1312,8 @@ update_drives (GVfsUDisks2VolumeMonitor *monitor,
static void
update_volumes (GVfsUDisks2VolumeMonitor *monitor,
GList **added_volumes,
- GList **removed_volumes)
+ GList **removed_volumes,
+ gboolean coldplug)
{
GList *cur_block_volumes;
GList *new_block_volumes;
@@ -1369,7 +1379,8 @@ update_volumes (GVfsUDisks2VolumeMonitor *monitor,
block,
NULL, /* mount_point */
drive,
- NULL); /* activation_root */
+ NULL, /* activation_root */
+ coldplug);
if (volume != NULL)
{
monitor->volumes = g_list_prepend (monitor->volumes, volume);
@@ -1478,7 +1489,8 @@ mount_point_has_device (GVfsUDisks2VolumeMonitor *monitor,
static void
update_fstab_volumes (GVfsUDisks2VolumeMonitor *monitor,
GList **added_volumes,
- GList **removed_volumes)
+ GList **removed_volumes,
+ gboolean coldplug)
{
GList *cur_mount_points;
GList *new_mount_points;
@@ -1543,7 +1555,8 @@ update_fstab_volumes (GVfsUDisks2VolumeMonitor *monitor,
NULL, /* block */
mount_point,
NULL, /* drive */
- NULL); /* activation_root */
+ NULL, /* activation_root */
+ coldplug);
if (volume != NULL)
{
GVfsUDisks2Mount *mount;
@@ -1573,7 +1586,8 @@ update_fstab_volumes (GVfsUDisks2VolumeMonitor *monitor,
static void
update_mounts (GVfsUDisks2VolumeMonitor *monitor,
GList **added_mounts,
- GList **removed_mounts)
+ GList **removed_mounts,
+ gboolean coldplug)
{
GList *cur_mounts;
GList *new_mounts;
@@ -1689,7 +1703,8 @@ update_discs (GVfsUDisks2VolumeMonitor *monitor,
GList **added_volumes,
GList **removed_volumes,
GList **added_mounts,
- GList **removed_mounts)
+ GList **removed_mounts,
+ gboolean coldplug)
{
GList *objects;
GList *cur_disc_drives;
@@ -1790,7 +1805,8 @@ update_discs (GVfsUDisks2VolumeMonitor *monitor,
block,
NULL, /* mount_point */
find_drive_for_udisks_drive (monitor, udisks_drive),
- activation_root);
+ activation_root,
+ coldplug);
if (volume != NULL)
{
monitor->disc_volumes = g_list_prepend (monitor->disc_volumes, volume);