[gvfs/gnome-3-18] sftp: Fail cancelled jobs



commit 1085c645cb460753b42dc20f0376f38cd7e8d817
Author: Ross Lagerwall <rosslagerwall gmail com>
Date:   Sat Dec 5 14:34:53 2015 +0000

    sftp: Fail cancelled jobs
    
    Fail jobs which have been marked as cancelled, otherwise the job remains
    and blocks unmounting. This can be reproduced by cancelling while
    copying a large file to/from a mount and then trying to unmount it.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=759061

 daemon/gvfsbackendsftp.c |   27 ++++++++++++++++++++++-----
 1 files changed, 22 insertions(+), 5 deletions(-)
---
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c
index a9dc781..b758103 100644
--- a/daemon/gvfsbackendsftp.c
+++ b/daemon/gvfsbackendsftp.c
@@ -5195,6 +5195,23 @@ try_set_attribute (GVfsBackend *backend,
   return TRUE;
 }
 
+/* Return true if the job is finished or cancelled, failing it if needed. */
+static gboolean
+check_finished_or_cancelled_job (GVfsJob *job)
+{
+  if (g_vfs_job_is_finished (job))
+    return TRUE;
+
+  if (g_vfs_job_is_cancelled (job))
+    {
+      g_vfs_job_failed (job, G_IO_ERROR, G_IO_ERROR_CANCELLED,
+                        _("Operation was cancelled"));
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 /* The push sliding window mechanism is based on the one in the OpenSSH sftp
  * client. */
 
@@ -5457,7 +5474,7 @@ push_source_close_cb (GObject *source, GAsyncResult *res, gpointer user_data)
   g_input_stream_close_finish (handle->in, res, NULL);
   g_clear_object (&handle->in);
 
-  if (g_vfs_job_is_finished (handle->job) || g_vfs_job_is_cancelled (handle->job))
+  if (check_finished_or_cancelled_job (handle->job))
     {
       sftp_push_handle_free (handle);
       return;
@@ -5484,7 +5501,7 @@ push_write_reply (GVfsBackendSftp *backend,
 
   handle->num_req--;
 
-  if (g_vfs_job_is_finished (job) || g_vfs_job_is_cancelled (job))
+  if (check_finished_or_cancelled_job (job))
     {
       sftp_push_handle_free (handle);
       return;
@@ -5534,7 +5551,7 @@ push_read_cb (GObject *source, GAsyncResult *res, gpointer user_data)
 
   count = g_input_stream_read_finish (handle->in, res, &error);
 
-  if (g_vfs_job_is_finished (handle->job) || g_vfs_job_is_cancelled (handle->job))
+  if (check_finished_or_cancelled_job (handle->job))
     {
       g_clear_error (&error);
       sftp_push_handle_free (handle);
@@ -6201,7 +6218,7 @@ pull_read_reply (GVfsBackendSftp *backend,
 
   handle->num_req--;
 
-  if (g_vfs_job_is_finished (job) || g_vfs_job_is_cancelled (job))
+  if (check_finished_or_cancelled_job (job))
     {
     }
   else if (reply_type == SSH_FXP_STATUS)
@@ -6283,7 +6300,7 @@ pull_fstat_reply (GVfsBackendSftp *backend,
 {
   SftpPullHandle *handle = user_data;
 
-  if (g_vfs_job_is_finished (job) || g_vfs_job_is_cancelled (job))
+  if (check_finished_or_cancelled_job (job))
     {
       handle->size = PULL_SIZE_INVALID;
       sftp_pull_handle_free (handle);


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