summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Holy <oholy@redhat.com>2020-09-24 10:19:22 +0200
committerOndrej Holy <oholy@redhat.com>2020-09-24 10:51:39 +0200
commit5c0bc82e7c22fd1fa88b243c53d6c677ed19541f (patch)
treeaedb229c733734228af48f26c39ff215f20772cf
parentb03b7955cf25e863c1aac2853ddaf647bfb70ea8 (diff)
downloadgvfs-wip/oholy/trash-performance.tar.gz
trash: Do not fail when G_FILE_COPY_NO_FALLBACK_FOR_MOVE is usedwip/oholy/trash-performance
Restoring files from the trash folder is slow in Nautilus as it attempts to do it recursively. This is because G_IO_ERROR_NOT_SUPPORTED is returned from g_file_move when G_FILE_COPY_NO_FALLBACK_FOR_MOVE flag is used. The error is returned from client-side for pull/push operations after commit 2e765449 as in the most cases the copy-and-delete approach is really used there. But the problem is that it is not in all cases, like in the trash backend case, where the native move operation is used in fact. Let's handle the G_FILE_COPY_NO_FALLBACK_FOR_MOVE flag directly in the backends, but not in the trash backend. Fixes: https://gitlab.gnome.org/GNOME/nautilus/-/issues/1589
-rw-r--r--client/gdaemonfile.c8
-rw-r--r--daemon/gvfsbackenddav.c7
-rw-r--r--daemon/gvfsbackendftp.c9
-rw-r--r--daemon/gvfsbackendgoogle.c6
-rw-r--r--daemon/gvfsbackendgphoto2.c8
-rw-r--r--daemon/gvfsbackendmtp.c14
-rw-r--r--daemon/gvfsbackendsftp.c16
7 files changed, 60 insertions, 8 deletions
diff --git a/client/gdaemonfile.c b/client/gdaemonfile.c
index 2a8c1511..f11cf91c 100644
--- a/client/gdaemonfile.c
+++ b/client/gdaemonfile.c
@@ -2689,14 +2689,6 @@ file_transfer (GFile *source,
return FALSE;
}
- if (!native_transfer && remove_source &&
- (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE))
- {
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
- _("Operation not supported"));
- return FALSE;
- }
-
if (!native_transfer && local_path == NULL)
{
/* This will cause the fallback code to be involved */
diff --git a/daemon/gvfsbackenddav.c b/daemon/gvfsbackenddav.c
index 5929ab6a..d5c6516d 100644
--- a/daemon/gvfsbackenddav.c
+++ b/daemon/gvfsbackenddav.c
@@ -3477,6 +3477,13 @@ try_push (GVfsBackend *backend,
GFile *source;
PushHandle *handle;
+ if (remove_source && (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE))
+ {
+ g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ _("Operation not supported"));
+ return TRUE;
+ }
+
handle = g_slice_new0 (PushHandle);
handle->backend = g_object_ref (backend);
handle->job = g_object_ref (G_VFS_JOB (job));
diff --git a/daemon/gvfsbackendftp.c b/daemon/gvfsbackendftp.c
index 1d9de93a..e86f5e91 100644
--- a/daemon/gvfsbackendftp.c
+++ b/daemon/gvfsbackendftp.c
@@ -1657,6 +1657,15 @@ do_pull (GVfsBackend * backend,
src = g_vfs_ftp_file_new_from_gvfs (ftp, source);
dest = g_file_new_for_path (local_path);
+ if (remove_source && (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE))
+ {
+ g_set_error_literal (&task.error,
+ G_IO_ERROR,
+ G_IO_ERROR_NOT_SUPPORTED,
+ _("Operation not supported"));
+ goto out;
+ }
+
/* If the source is a symlink, then it needs to be handled specially. */
if (flags & G_FILE_COPY_NOFOLLOW_SYMLINKS)
{
diff --git a/daemon/gvfsbackendgoogle.c b/daemon/gvfsbackendgoogle.c
index d4b074e2..27c9eba0 100644
--- a/daemon/gvfsbackendgoogle.c
+++ b/daemon/gvfsbackendgoogle.c
@@ -2777,6 +2777,12 @@ g_vfs_backend_google_push (GVfsBackend *_self,
g_rec_mutex_lock (&self->mutex);
g_debug ("+ push: %s -> %s, %d\n", local_path, destination, flags);
+ if (remove_source && (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE))
+ {
+ g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Operation not supported"));
+ goto out;
+ }
+
if (flags & G_FILE_COPY_BACKUP)
{
/* Return G_IO_ERROR_NOT_SUPPORTED instead of
diff --git a/daemon/gvfsbackendgphoto2.c b/daemon/gvfsbackendgphoto2.c
index 3120b389..71139b6c 100644
--- a/daemon/gvfsbackendgphoto2.c
+++ b/daemon/gvfsbackendgphoto2.c
@@ -3243,6 +3243,14 @@ do_pull (GVfsBackend *backend,
split_filename_with_ignore_prefix (gphoto2_backend, source, &dir, &name);
+ if (remove_source && (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE))
+ {
+ g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
+ G_IO_ERROR_NOT_SUPPORTED,
+ _("Operation not supported"));
+ goto out;
+ }
+
if (remove_source && !gphoto2_backend->can_delete)
{
g_vfs_job_failed (G_VFS_JOB (job), G_IO_ERROR,
diff --git a/daemon/gvfsbackendmtp.c b/daemon/gvfsbackendmtp.c
index 7777c66b..42c2955e 100644
--- a/daemon/gvfsbackendmtp.c
+++ b/daemon/gvfsbackendmtp.c
@@ -1711,6 +1711,13 @@ do_pull (GVfsBackend *backend,
GFileInfo *info = NULL;
guint64 mtime;
+ if (remove_source && (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE)) {
+ g_vfs_job_failed (G_VFS_JOB (job),
+ G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ _("Operation not supported"));
+ goto exit;
+ }
+
CacheEntry *entry = get_cache_entry (G_VFS_BACKEND_MTP (backend), source);
if (entry == NULL) {
g_vfs_job_failed_literal (G_VFS_JOB (job),
@@ -2005,6 +2012,13 @@ do_push (GVfsBackend *backend,
gchar **elements = g_strsplit_set (destination, "/", -1);
unsigned int ne = g_strv_length (elements);
+ if (remove_source && (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE)) {
+ g_vfs_job_failed (G_VFS_JOB (job),
+ G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ _("Operation not supported"));
+ goto exit;
+ }
+
if (ne < 3) {
g_vfs_job_failed_literal (G_VFS_JOB (job),
G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED,
diff --git a/daemon/gvfsbackendsftp.c b/daemon/gvfsbackendsftp.c
index 1bb4a673..f843dec4 100644
--- a/daemon/gvfsbackendsftp.c
+++ b/daemon/gvfsbackendsftp.c
@@ -6216,6 +6216,14 @@ try_push (GVfsBackend *backend,
GFile *source;
SftpPushHandle *handle;
+ if (remove_source && (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE))
+ {
+ g_vfs_job_failed (G_VFS_JOB (op_job),
+ G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ _("Operation not supported"));
+ return TRUE;
+ }
+
if (!connection_is_usable (&op_backend->data_connection))
{
g_vfs_job_failed (G_VFS_JOB (op_job),
@@ -6765,6 +6773,14 @@ try_pull (GVfsBackend *backend,
SftpPullHandle *handle;
Command commands[2];
+ if (remove_source && (flags & G_FILE_COPY_NO_FALLBACK_FOR_MOVE))
+ {
+ g_vfs_job_failed (G_VFS_JOB (job),
+ G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ _("Operation not supported"));
+ return TRUE;
+ }
+
if (!connection_is_usable (&op_backend->data_connection))
{
g_vfs_job_failed (G_VFS_JOB (job),