summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2016-01-05 10:47:04 +0100
committerOndrej Holy <oholy@redhat.com>2016-02-09 12:28:28 +0100
commitea78c2bf2fdd357d69c50a66eb664cde76beb1b6 (patch)
treeb011b9122f6b1d31826d2a66d7fe6b263690a2f0
parent428adf56bbca298c0a92091de6dc10369d020a83 (diff)
downloadgvfs-ea78c2bf2fdd357d69c50a66eb664cde76beb1b6.tar.gz
ftp: Invalidate dir cache on write close
Wrong file size is cached if query_info is executed during write operation, because dir cache is invalidated on open_for_write. Wrong file size might cause that e.g. POSIX editors fails to read file content over fuse daemon. Invalidate the cache also on close_write to fix this issue. https://bugzilla.gnome.org/show_bug.cgi?id=760159
-rw-r--r--daemon/gvfsbackendftp.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/daemon/gvfsbackendftp.c b/daemon/gvfsbackendftp.c
index 20eb6422..d9feb620 100644
--- a/daemon/gvfsbackendftp.c
+++ b/daemon/gvfsbackendftp.c
@@ -928,6 +928,7 @@ do_start_write (GVfsFtpTask *task,
const char *format,
...)
{
+ GVfsJobOpenForWrite *job = G_VFS_JOB_OPEN_FOR_WRITE (task->job);
va_list varargs;
/* FIXME: can we honour the flags? */
@@ -946,10 +947,16 @@ do_start_write (GVfsFtpTask *task,
if (!g_vfs_ftp_task_is_in_error (task))
{
+ GIOStream *stream;
+
/* don't push the connection back, it's our handle now */
GVfsFtpConnection *conn = g_vfs_ftp_task_take_connection (task);
g_vfs_job_open_for_write_set_handle (G_VFS_JOB_OPEN_FOR_WRITE (task->job), conn);
g_vfs_job_open_for_write_set_can_seek (G_VFS_JOB_OPEN_FOR_WRITE (task->job), FALSE);
+
+ stream = g_vfs_ftp_connection_get_data_stream (conn);
+ g_object_set_data_full (G_OBJECT (stream), "g-vfs-backend-ftp-filename",
+ g_strdup (job->filename), g_free);
}
}
@@ -1086,12 +1093,22 @@ do_close_write (GVfsBackend *backend,
{
GVfsBackendFtp *ftp = G_VFS_BACKEND_FTP (backend);
GVfsFtpTask task = G_VFS_FTP_TASK_INIT (ftp, G_VFS_JOB (job));
+ GVfsFtpConnection *conn = handle;
+ GIOStream *stream;
+ const gchar *filename;
+ GVfsFtpFile *file;
- g_vfs_ftp_task_give_connection (&task, handle);
+ stream = g_vfs_ftp_connection_get_data_stream (conn);
+ filename = g_object_get_data (G_OBJECT (stream), "g-vfs-backend-ftp-filename");
+ file = g_vfs_ftp_file_new_from_gvfs (ftp, filename);
+ g_vfs_ftp_task_give_connection (&task, handle);
g_vfs_ftp_task_close_data_connection (&task);
g_vfs_ftp_task_receive (&task, 0, NULL);
+ g_vfs_ftp_dir_cache_purge_file (ftp->dir_cache, file);
+ g_vfs_ftp_file_free (file);
+
g_vfs_ftp_task_done (&task);
}