Sorry for the mistake, but the LastDir singleton cache in vfs_ChDir()
actually plays an important role. When we're processing a stream of
SMB1/SMB2/SMB3 requests we don't want to add a chdir()/getcwd()
system call pair on every request if they're all on the same connection
and dealing with the same base path.
I did some testing with a program that times 1,000,000 chdir()
requests vs. 1,000,000 strcmp requests and it's a penalty of 10x
doing the system calls.
Just because it's old code, doesn't mean it's bad :-(.
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Thu Sep 13 21:31:42 CEST 2012 on sn-devel-104
struct vfs_init_function_entry *backends = NULL;
char *sparse_buf = NULL;
+char *LastDir = NULL;
struct smbd_parent_context *am_parent = NULL;
struct memcache *smbd_memcache_ctx = NULL;
struct vfs_init_function_entry;
extern struct vfs_init_function_entry *backends;
extern char *sparse_buf;
+extern char *LastDir;
struct smbd_parent_context;
extern struct smbd_parent_context *am_parent;
{
int ret;
+ if (!LastDir) {
+ LastDir = SMB_STRDUP("");
+ }
+
if (strcsequal(path,".")) {
return 0;
}
+ if (*path == '/' && strcsequal(LastDir,path)) {
+ return 0;
+ }
+
DEBUG(4,("vfs_ChDir to %s\n",path));
ret = SMB_VFS_CHDIR(conn,path);
if (ret == 0) {
+ /* Global cache. */
+ SAFE_FREE(LastDir);
+ LastDir = SMB_STRDUP(path);
+
+ /* conn cache. */
TALLOC_FREE(conn->cwd);
conn->cwd = vfs_GetWd(conn, conn);
DEBUG(4,("vfs_ChDir got %s\n",conn->cwd));