From 7fd9061afbd0ec4664adb17aed706e12fd5f3eee Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Wed, 15 Apr 2009 14:41:27 -0400 Subject: [PATCH 13/13] pass the 'flush' mount option for vfat This mount option makes the vfat filesystem driver flush data more often. As a consequence 1. users never get to see the gnome-disk-utility notification daemon dialog just added http://people.freedesktop.org/~david/gdu-unmount-busy-1.png but that's useful for other filesystems as well. 2. The Nautilus copy dialog stays up until things are on the disk We do this in gvfs rather than DeviceKit-disks because in some scenarios 'flush' may be unwanted and there is currently no way to turn it off (e.g. no 'noflush' or 'flush=0' option). Ideally the kernel would get this kind of thing right by itself. --- monitor/gdu/ggduvolume.c | 36 +++++++++++++++++++++++++++++++++--- 1 files changed, 33 insertions(+), 3 deletions(-) diff --git a/monitor/gdu/ggduvolume.c b/monitor/gdu/ggduvolume.c index 49494a1..871a1c5 100644 --- a/monitor/gdu/ggduvolume.c +++ b/monitor/gdu/ggduvolume.c @@ -648,6 +648,27 @@ g_gdu_volume_get_mount (GVolume *volume) /* ---------------------------------------------------------------------------------------------------- */ +static gchar ** +get_mount_options (GduDevice *device) +{ + gchar **ret; + + /* one day we might read this from user settings */ + if (g_strcmp0 (gdu_device_id_get_usage (device), "filesystem") == 0 && + g_strcmp0 (gdu_device_id_get_type (device), "vfat") == 0) + { + ret = g_new0 (gchar *, 2); + ret[0] = g_strdup ("flush"); + ret[1] = NULL; + } + else + ret = NULL; + + return ret; +} + +/* ---------------------------------------------------------------------------------------------------- */ + struct MountOpData { GGduVolume *volume; @@ -735,8 +756,11 @@ mount_obtain_authz_cb (GObject *source_object, } else { + gchar **mount_options; /* got the authz, now try again */ - gdu_device_op_filesystem_mount (data->device_to_mount, mount_cb, data); + mount_options = get_mount_options (data->device_to_mount); + gdu_device_op_filesystem_mount (data->device_to_mount, mount_options, mount_cb, data); + g_strfreev (mount_options); goto out; } @@ -842,7 +866,10 @@ mount_cleartext_device (MountOpData *data, } else { - gdu_device_op_filesystem_mount (data->device_to_mount, mount_cb, data); + gchar **mount_options; + mount_options = get_mount_options (data->device_to_mount); + gdu_device_op_filesystem_mount (data->device_to_mount, mount_options, mount_cb, data); + g_strfreev (mount_options); } g_object_unref (pool); @@ -1260,8 +1287,11 @@ g_gdu_volume_mount (GVolume *_volume, } else { + gchar **mount_options; data->device_to_mount = g_object_ref (device); - gdu_device_op_filesystem_mount (data->device_to_mount, mount_cb, data); + mount_options = get_mount_options (data->device_to_mount); + gdu_device_op_filesystem_mount (data->device_to_mount, mount_options, mount_cb, data); + g_strfreev (mount_options); } out: -- 1.6.2.2