diff --git a/daemon/gvfschannel.c b/daemon/gvfschannel.c
index 94b1667..01c40e6 100644
--- a/daemon/gvfschannel.c
+++ b/daemon/gvfschannel.c
@@ -84,6 +84,7 @@ struct _GVfsChannelPrivate
   GInputStream *command_stream;
   GOutputStream *reply_stream;
   int remote_fd;
+  gboolean cancelled;
   
   GVfsBackendHandle backend_handle;
   GVfsJob *current_job;
@@ -340,7 +341,8 @@ got_request (GVfsChannel *channel,
   command = g_ntohl (request->command);
   arg1 = g_ntohl (request->arg1);
 
-  if (command == G_VFS_DAEMON_SOCKET_PROTOCOL_REQUEST_CANCEL)
+  if (command == G_VFS_DAEMON_SOCKET_PROTOCOL_REQUEST_CANCEL ||
+      channel->priv->cancelled)
     {
       if (arg1 == channel->priv->current_job_seq_nr &&
 	  channel->priv->current_job != NULL)
@@ -364,6 +366,8 @@ got_request (GVfsChannel *channel,
 	    }
 	}
 
+      channel->priv->cancelled = TRUE;
+      
       /* Cancel ops get no return */
       g_free (data);
       return;
@@ -604,7 +608,8 @@ send_reply_cb (GObject *source_object,
       g_vfs_job_source_new_job (G_VFS_JOB_SOURCE (channel), channel->priv->current_job);
     }
   /* Start queued request or readahead */
-  else if (!start_queued_request (channel) &&
+  else if (!channel->priv->cancelled &&
+	   !start_queued_request (channel) &&
 	   class->readahead)
     {
       /* No queued requests, maybe we want to do a readahead call */
