[gvfs] ftp: Invalidate dir cache on write close



commit b161a2b4a7cf3b9f525caf26206df92d451fcb39
Author: Ondrej Holy <oholy redhat com>
Date:   Tue Jan 5 10:47:04 2016 +0100

    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

 daemon/gvfsbackendftp.c |   19 ++++++++++++++++++-
 1 files changed, 18 insertions(+), 1 deletions(-)
---
diff --git a/daemon/gvfsbackendftp.c b/daemon/gvfsbackendftp.c
index 20eb642..d9feb62 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);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]