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