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:22:55 +0100
commitb161a2b4a7cf3b9f525caf26206df92d451fcb39 (patch)
tree5b3dbd04ca4f12a820b6034c2b204c07c2022867
parentcf8a6cc2d9b13dc8fe949fa8b9eb320f8f06985e (diff)
downloadgvfs-b161a2b4a7cf3b9f525caf26206df92d451fcb39.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);
}