diff options
author | Jeremy Allison <jra@samba.org> | 2012-09-13 10:13:21 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2012-09-13 21:31:42 +0200 |
commit | 56b752512597acaffa94a979ef9140760e0f5cf3 (patch) | |
tree | 8a54245369ad6042366f4d24bffadd298efbecc4 | |
parent | 23158d72c8de9318e1f136331ef4d788df243af7 (diff) | |
download | samba-56b752512597acaffa94a979ef9140760e0f5cf3.tar.gz samba-56b752512597acaffa94a979ef9140760e0f5cf3.tar.bz2 samba-56b752512597acaffa94a979ef9140760e0f5cf3.zip |
Sigh :-(. Removing optimization prematurely is the root of all evil :-(.
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
-rw-r--r-- | source3/smbd/globals.c | 1 | ||||
-rw-r--r-- | source3/smbd/globals.h | 1 | ||||
-rw-r--r-- | source3/smbd/vfs.c | 13 |
3 files changed, 15 insertions, 0 deletions
diff --git a/source3/smbd/globals.c b/source3/smbd/globals.c index 874f35d1f6..80f6a66427 100644 --- a/source3/smbd/globals.c +++ b/source3/smbd/globals.c @@ -85,6 +85,7 @@ int conn_ctx_stack_ndx = 0; 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; diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index 1cefe51faa..566f04d71f 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -101,6 +101,7 @@ extern int conn_ctx_stack_ndx; 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; diff --git a/source3/smbd/vfs.c b/source3/smbd/vfs.c index 7d194404f4..fe99ee29e9 100644 --- a/source3/smbd/vfs.c +++ b/source3/smbd/vfs.c @@ -801,14 +801,27 @@ int vfs_ChDir(connection_struct *conn, const char *path) { 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)); |