Blame SOURCES/smb-Improve-enumeration-performance.patch

7d234d
diff --git a/configure.ac b/configure.ac
7d234d
index daeee728..689667e5 100644
7d234d
--- a/configure.ac
7d234d
+++ b/configure.ac
7d234d
@@ -551,6 +551,11 @@ if test "x$enable_samba" != "xno"; then
7d234d
         AC_DEFINE(HAVE_SMBC_SETOPTIONPROTOCOLS, 1, [Define to 1 if smbc_setOptionProtocols() is available]),
7d234d
         []
7d234d
     )
7d234d
+
7d234d
+    AC_CHECK_LIB(smbclient, smbc_readdirplus2,
7d234d
+        AC_DEFINE(HAVE_SMBC_READDIRPLUS2, 1, [Define to 1 if smbc_readdirplus2() is available]),
7d234d
+        []
7d234d
+    )
7d234d
   fi
7d234d
 fi
7d234d
 
7d234d
diff --git a/daemon/gvfsbackendsmb.c b/daemon/gvfsbackendsmb.c
7d234d
index 9571fa0d..ce151648 100644
7d234d
--- a/daemon/gvfsbackendsmb.c
7d234d
+++ b/daemon/gvfsbackendsmb.c
7d234d
@@ -1738,25 +1738,34 @@ do_enumerate (GVfsBackend *backend,
7d234d
 	      GFileQueryInfoFlags flags)
7d234d
 {
7d234d
   GVfsBackendSmb *op_backend = G_VFS_BACKEND_SMB (backend);
7d234d
-  struct stat st;
7d234d
-  int res;
7d234d
+  struct stat st = { 0 };
7d234d
   GError *error;
7d234d
   SMBCFILE *dir;
7d234d
-  char dirents[1024*4];
7d234d
-  struct smbc_dirent *dirp;
7d234d
   GFileInfo *info;
7d234d
   GString *uri;
7d234d
-  int uri_start_len;
7d234d
   smbc_opendir_fn smbc_opendir;
7d234d
+  smbc_closedir_fn smbc_closedir;
7d234d
+#ifndef HAVE_SMBC_READDIRPLUS2
7d234d
+  int res;
7d234d
+  char dirents[1024*4];
7d234d
+  struct smbc_dirent *dirp;
7d234d
+  int uri_start_len;
7d234d
   smbc_getdents_fn smbc_getdents;
7d234d
   smbc_stat_fn smbc_stat;
7d234d
-  smbc_closedir_fn smbc_closedir;
7d234d
+#else
7d234d
+  smbc_readdirplus2_fn smbc_readdirplus2;
7d234d
+  const struct libsmb_file_info *exstat;
7d234d
+#endif
7d234d
 
7d234d
   uri = create_smb_uri_string (op_backend->server, op_backend->port, op_backend->share, filename);
7d234d
   
7d234d
   smbc_opendir = smbc_getFunctionOpendir (op_backend->smb_context);
7d234d
+#ifndef HAVE_SMBC_READDIRPLUS2
7d234d
   smbc_getdents = smbc_getFunctionGetdents (op_backend->smb_context);
7d234d
   smbc_stat = smbc_getFunctionStat (op_backend->smb_context);
7d234d
+#else
7d234d
+  smbc_readdirplus2 = smbc_getFunctionReaddirPlus2 (op_backend->smb_context);
7d234d
+#endif
7d234d
   smbc_closedir = smbc_getFunctionClosedir (op_backend->smb_context);
7d234d
   
7d234d
   dir = smbc_opendir (op_backend->smb_context, uri->str);
7d234d
@@ -1776,6 +1785,8 @@ do_enumerate (GVfsBackend *backend,
7d234d
 
7d234d
   if (uri->str[uri->len - 1] != '/')
7d234d
     g_string_append_c (uri, '/');
7d234d
+
7d234d
+#ifndef HAVE_SMBC_READDIRPLUS2
7d234d
   uri_start_len = uri->len;
7d234d
 
7d234d
   while (TRUE)
7d234d
@@ -1827,9 +1838,27 @@ do_enumerate (GVfsBackend *backend,
7d234d
 	  dirp = (struct smbc_dirent *) (((char *)dirp) + dirlen);
7d234d
 	  res -= dirlen;
7d234d
 	}
7d234d
+   }
7d234d
+#else
7d234d
+  while ((exstat = smbc_readdirplus2 (op_backend->smb_context, dir, &st)) != NULL)
7d234d
+    {
7d234d
+      if ((S_ISREG (st.st_mode) ||
7d234d
+           S_ISDIR (st.st_mode) ||
7d234d
+           S_ISLNK (st.st_mode)) &&
7d234d
+          g_strcmp0 (exstat->name, ".") != 0 &&
7d234d
+          g_strcmp0 (exstat->name, "..") != 0)
7d234d
+        {
7d234d
+          info = g_file_info_new ();
7d234d
+          set_info_from_stat (op_backend, info, &st, exstat->name, matcher);
7d234d
+          g_vfs_job_enumerate_add_info (job, info);
7d234d
+          g_object_unref (info);
7d234d
+        }
7d234d
+
7d234d
+      memset (&st, 0, sizeof (struct stat));
7d234d
     }
7d234d
-      
7d234d
-  res = smbc_closedir (op_backend->smb_context, dir);
7d234d
+#endif
7d234d
+
7d234d
+  smbc_closedir (op_backend->smb_context, dir);
7d234d
 
7d234d
   g_vfs_job_enumerate_done (job);
7d234d
 
7d234d
diff --git a/meson.build b/meson.build
7d234d
index 6ae768d9..d3f59457 100644
7d234d
--- a/meson.build
7d234d
+++ b/meson.build
7d234d
@@ -418,6 +418,7 @@ if enable_samba
7d234d
   smbclient_dep = dependency('smbclient')
7d234d
 
7d234d
   config_h.set('HAVE_SMBC_SETOPTIONPROTOCOLS', cc.has_function('smbc_setOptionProtocols', dependencies: smbclient_dep))
7d234d
+  config_h.set('HAVE_SMBC_READDIRPLUS2', cc.has_function('smbc_readdirplus2', dependencies: smbclient_dep))
7d234d
 endif
7d234d
 
7d234d
 # *** Check for libarchive ***
7d234d
-- 
7d234d
2.26.2
7d234d