diff options
author | Ondrej Holy <oholy@redhat.com> | 2016-01-05 10:47:04 +0100 |
---|---|---|
committer | Ondrej Holy <oholy@redhat.com> | 2016-02-09 12:22:55 +0100 |
commit | b161a2b4a7cf3b9f525caf26206df92d451fcb39 (patch) | |
tree | 5b3dbd04ca4f12a820b6034c2b204c07c2022867 | |
parent | cf8a6cc2d9b13dc8fe949fa8b9eb320f8f06985e (diff) | |
download | gvfs-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.c | 19 |
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); } |