[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Mar 22 15:11:02 MDT 2013


The branch, master has been updated
       via  12ebb1b smbd: Tune "dir" a bit.
      from  84dad60 Fix bug #9733 - smbcontrol close-share is not working.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 12ebb1ba1599dd30db9376a64530667656b803b8
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Mar 21 22:00:06 2013 +0100

    smbd: Tune "dir" a bit.
    
    for i in $(seq 1 20000) ; do echo dir ; done | smbclient //127.0.0.1/tmp -U%
    
    without and with this patch:
    
    $ time bin/smbd -d0 -i
    smbd version 4.1.0pre1-GIT-1f139ae started.
    Copyright Andrew Tridgell and the Samba Team 1992-2013
    Beendet
    
    real    0m28.342s
    user    0m10.249s
    sys     0m10.513s
    
    $ time bin/smbd -d0 -i
    smbd version 4.1.0pre1-GIT-1f139ae started.
    Copyright Andrew Tridgell and the Samba Team 1992-2013
    Beendet
    
    real    0m27.348s
    user    0m9.089s
    sys     0m10.853s
    
    The "real" timestamp is irrelevant, this also contains the time between
    starting smbd and the smbclient job. It's the "user" time. The result that this
    patch improves the time spent in user space by 10% is consistent.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Fri Mar 22 22:10:57 CET 2013 on sn-devel-104

-----------------------------------------------------------------------

Summary of changes:
 source3/smbd/dir.c |   25 +++++++++++++++++++------
 1 files changed, 19 insertions(+), 6 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 525f20e..f1c177f 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -1038,12 +1038,14 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 			   long *_prev_offset)
 {
 	connection_struct *conn = dirptr->conn;
-	bool needslash;
+	size_t slashlen;
+	size_t pathlen;
 
 	*_smb_fname = NULL;
 	*_mode = 0;
 
-	needslash = ( dirptr->path[strlen(dirptr->path) -1] != '/');
+	pathlen = strlen(dirptr->path);
+	slashlen = ( dirptr->path[pathlen-1] != '/') ? 1 : 0;
 
 	while (true) {
 		long cur_offset;
@@ -1087,16 +1089,27 @@ bool smbd_dirptr_get_entry(TALLOC_CTX *ctx,
 			continue;
 		}
 
-		pathreal = talloc_asprintf(ctx, "%s%s%s",
-					   dirptr->path,
-					   needslash?"/":"",
-					   dname);
+		/*
+		 * This used to be
+		 * pathreal = talloc_asprintf(ctx, "%s%s%s", dirptr->path,
+		 *			      needslash?"/":"", dname);
+		 * but this was measurably slower than doing the memcpy.
+		 */
+
+		pathreal = talloc_array(
+			ctx, char,
+			pathlen + slashlen + talloc_get_size(dname));
 		if (!pathreal) {
 			TALLOC_FREE(dname);
 			TALLOC_FREE(fname);
 			return false;
 		}
 
+		memcpy(pathreal, dirptr->path, pathlen);
+		pathreal[pathlen] = '/';
+		memcpy(pathreal + slashlen + pathlen, dname,
+		       talloc_get_size(dname));
+
 		/* Create smb_fname with NULL stream_name. */
 		ZERO_STRUCT(smb_fname);
 		smb_fname.base_name = pathreal;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list