+ GSubprocess *subprocess;
+ GError *error = NULL;
+ GTask *task;
+
+ task = g_task_new (volume, cancellable, callback, user_data);
+
+ if (g_task_return_error_if_cancelled (task))
+ {
+ g_object_unref (task);
+ return;
+ }
+
+ subprocess = g_subprocess_newv (argv, G_SUBPROCESS_FLAGS_STDOUT_SILENCE | G_SUBPROCESS_FLAGS_STDERR_PIPE, &error);
+ g_assert_no_error (error);
+
+ g_subprocess_communicate_utf8_async (subprocess, NULL,
+ g_task_get_cancellable (task),
+ eject_mount_done, task);
+}
+
+static void
+g_unix_volume_mount (GVolume *volume,
+ GMountMountFlags flags,
+ GMountOperation *mount_operation,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GUnixVolume *unix_volume = G_UNIX_VOLUME (volume);
+ const gchar *argv[] = { "mount", NULL, NULL };
+
+ if (unix_volume->mount_path != NULL)
+ argv[1] = unix_volume->mount_path;
+ else
+ argv[1] = unix_volume->device_path;
+
+ eject_mount_do (volume, cancellable, callback, user_data, argv);