svn commit: samba r24639 - in branches: SAMBA_3_0_25/source/param SAMBA_3_0_25/source/smbd SAMBA_3_2/source/param SAMBA_3_2/source/smbd SAMBA_3_2_0/source/param SAMBA_3_2_0/source/smbd

jra at samba.org jra at samba.org
Thu Aug 23 21:53:00 GMT 2007


Author: jra
Date: 2007-08-23 21:53:00 +0000 (Thu, 23 Aug 2007)
New Revision: 24639

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24639

Log:
Add parameter "directory name cache size" - parameterize
use of directory name cache, 100 by default. Will be needed
to turn this off for *BSD systems.
Jeremy.

Modified:
   branches/SAMBA_3_0_25/source/param/loadparm.c
   branches/SAMBA_3_0_25/source/smbd/dir.c
   branches/SAMBA_3_2/source/param/loadparm.c
   branches/SAMBA_3_2/source/smbd/dir.c
   branches/SAMBA_3_2_0/source/param/loadparm.c
   branches/SAMBA_3_2_0/source/smbd/dir.c


Changeset:
Modified: branches/SAMBA_3_0_25/source/param/loadparm.c
===================================================================
--- branches/SAMBA_3_0_25/source/param/loadparm.c	2007-08-23 21:34:08 UTC (rev 24638)
+++ branches/SAMBA_3_0_25/source/param/loadparm.c	2007-08-23 21:53:00 UTC (rev 24639)
@@ -456,6 +456,7 @@
 	int iAioReadSize;
 	int iAioWriteSize;
 	int iMap_readonly;
+	int iDirectoryNameCacheSize;
 	param_opt_struct *param_opt;
 
 	char dummy[3];		/* for alignment */
@@ -597,7 +598,11 @@
 	0,			/* iAioReadSize */
 	0,			/* iAioWriteSize */
 	MAP_READONLY_YES,	/* iMap_readonly */
-	
+#ifdef BROKEN_DIRECTORY_HANDLING
+	0,			/* iDirectoryNameCacheSize */
+#else
+	100,			/* iDirectoryNameCacheSize */
+#endif
 	NULL,			/* Parametric options */
 
 	""			/* dummy */
@@ -1012,6 +1017,7 @@
 	{"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, FLAG_ADVANCED}, 
 	{"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, FLAG_ADVANCED}, 
 	{"change notify", P_BOOL, P_LOCAL, &sDefault.bChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
+	{"directory name cache size", P_INTEGER, P_LOCAL, &sDefault.iDirectoryNameCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
 	{"kernel change notify", P_BOOL, P_LOCAL, &sDefault.bKernelChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
 
 	{"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_ADVANCED}, 
@@ -2140,6 +2146,7 @@
 FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
 FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
 FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
+FN_LOCAL_INTEGER(lp_directory_name_cache_size, iDirectoryNameCacheSize)
 FN_LOCAL_CHAR(lp_magicchar, magic_char)
 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
 FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)

Modified: branches/SAMBA_3_0_25/source/smbd/dir.c
===================================================================
--- branches/SAMBA_3_0_25/source/smbd/dir.c	2007-08-23 21:34:08 UTC (rev 24638)
+++ branches/SAMBA_3_0_25/source/smbd/dir.c	2007-08-23 21:53:00 UTC (rev 24639)
@@ -33,8 +33,6 @@
 
 /* Make directory handle internals available. */
 
-#define NAME_CACHE_SIZE 100
-
 struct name_cache_entry {
 	char *name;
 	long offset;
@@ -45,6 +43,7 @@
 	SMB_STRUCT_DIR *dir;
 	long offset;
 	char *dir_path;
+	size_t name_cache_size;
 	struct name_cache_entry *name_cache;
 	unsigned int name_cache_index;
 	unsigned int file_number;
@@ -1062,12 +1061,14 @@
 struct smb_Dir *OpenDir(connection_struct *conn, const char *name, const char *mask, uint32 attr)
 {
 	struct smb_Dir *dirp = SMB_MALLOC_P(struct smb_Dir);
+
 	if (!dirp) {
 		return NULL;
 	}
 	ZERO_STRUCTP(dirp);
 
 	dirp->conn = conn;
+	dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn));
 
 	dirp->dir_path = SMB_STRDUP(name);
 	if (!dirp->dir_path) {
@@ -1079,9 +1080,14 @@
 		goto fail;
 	}
 
-	dirp->name_cache = SMB_CALLOC_ARRAY(struct name_cache_entry, NAME_CACHE_SIZE);
-	if (!dirp->name_cache) {
-		goto fail;
+	if (dirp->name_cache_size) {
+		dirp->name_cache = SMB_CALLOC_ARRAY(struct name_cache_entry,
+				dirp->name_cache_size);
+		if (!dirp->name_cache) {
+			goto fail;
+		}
+	} else {
+		dirp->name_cache = NULL;
 	}
 
 	dirhandles_open++;
@@ -1114,7 +1120,7 @@
 	}
 	SAFE_FREE(dirp->dir_path);
 	if (dirp->name_cache) {
-		for (i = 0; i < NAME_CACHE_SIZE; i++) {
+		for (i = 0; i < dirp->name_cache_size; i++) {
 			SAFE_FREE(dirp->name_cache[i].name);
 		}
 	}
@@ -1230,7 +1236,12 @@
 {
 	struct name_cache_entry *e;
 
-	dirp->name_cache_index = (dirp->name_cache_index+1) % NAME_CACHE_SIZE;
+	if (!dirp->name_cache_size || !dirp->name_cache) {
+		return;
+	}
+
+	dirp->name_cache_index = (dirp->name_cache_index+1) %
+					dirp->name_cache_size;
 	e = &dirp->name_cache[dirp->name_cache_index];
 	SAFE_FREE(e->name);
 	e->name = SMB_STRDUP(name);
@@ -1249,20 +1260,22 @@
 	connection_struct *conn = dirp->conn;
 
 	/* Search back in the name cache. */
-	for (i = dirp->name_cache_index; i >= 0; i--) {
-		struct name_cache_entry *e = &dirp->name_cache[i];
-		if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
-			*poffset = e->offset;
-			SeekDir(dirp, e->offset);
-			return True;
+	if (dirp->name_cache_size && dirp->name_cache) {
+		for (i = dirp->name_cache_index; i >= 0; i--) {
+			struct name_cache_entry *e = &dirp->name_cache[i];
+			if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
+				*poffset = e->offset;
+				SeekDir(dirp, e->offset);
+				return True;
+			}
 		}
-	}
-	for (i = NAME_CACHE_SIZE-1; i > dirp->name_cache_index; i--) {
-		struct name_cache_entry *e = &dirp->name_cache[i];
-		if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
-			*poffset = e->offset;
-			SeekDir(dirp, e->offset);
-			return True;
+		for (i = dirp->name_cache_size - 1; i > dirp->name_cache_index; i--) {
+			struct name_cache_entry *e = &dirp->name_cache[i];
+			if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
+				*poffset = e->offset;
+				SeekDir(dirp, e->offset);
+				return True;
+			}
 		}
 	}
 

Modified: branches/SAMBA_3_2/source/param/loadparm.c
===================================================================
--- branches/SAMBA_3_2/source/param/loadparm.c	2007-08-23 21:34:08 UTC (rev 24638)
+++ branches/SAMBA_3_2/source/param/loadparm.c	2007-08-23 21:53:00 UTC (rev 24639)
@@ -471,6 +471,7 @@
 	int iAioReadSize;
 	int iAioWriteSize;
 	int iMap_readonly;
+	int iDirectoryNameCacheSize;
 	param_opt_struct *param_opt;
 
 	char dummy[3];		/* for alignment */
@@ -611,7 +612,11 @@
 	0,			/* iAioReadSize */
 	0,			/* iAioWriteSize */
 	MAP_READONLY_YES,	/* iMap_readonly */
-	
+#ifdef BROKEN_DIRECTORY_HANDLING
+	0,			/* iDirectoryNameCacheSize */
+#else
+	100,			/* iDirectoryNameCacheSize */
+#endif
 	NULL,			/* Parametric options */
 
 	""			/* dummy */
@@ -1031,6 +1036,7 @@
 	{"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, FLAG_ADVANCED}, 
 	{"keepalive", P_INTEGER, P_GLOBAL, &Globals.iKeepalive, NULL, NULL, FLAG_ADVANCED}, 
 	{"change notify", P_BOOL, P_LOCAL, &sDefault.bChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
+	{"directory name cache size", P_INTEGER, P_LOCAL, &sDefault.iDirectoryNameCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
 	{"kernel change notify", P_BOOL, P_LOCAL, &sDefault.bKernelChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
 
 	{"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_ADVANCED}, 
@@ -2178,6 +2184,7 @@
 FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
 FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
 FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
+FN_LOCAL_INTEGER(lp_directory_name_cache_size, iDirectoryNameCacheSize)
 FN_LOCAL_CHAR(lp_magicchar, magic_char)
 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
 FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)

Modified: branches/SAMBA_3_2/source/smbd/dir.c
===================================================================
--- branches/SAMBA_3_2/source/smbd/dir.c	2007-08-23 21:34:08 UTC (rev 24638)
+++ branches/SAMBA_3_2/source/smbd/dir.c	2007-08-23 21:53:00 UTC (rev 24639)
@@ -32,8 +32,6 @@
 
 /* Make directory handle internals available. */
 
-#define NAME_CACHE_SIZE 100
-
 struct name_cache_entry {
 	char *name;
 	long offset;
@@ -44,6 +42,7 @@
 	SMB_STRUCT_DIR *dir;
 	long offset;
 	char *dir_path;
+	size_t name_cache_size;
 	struct name_cache_entry *name_cache;
 	unsigned int name_cache_index;
 	unsigned int file_number;
@@ -1061,12 +1060,14 @@
 struct smb_Dir *OpenDir(connection_struct *conn, const char *name, const char *mask, uint32 attr)
 {
 	struct smb_Dir *dirp = SMB_MALLOC_P(struct smb_Dir);
+
 	if (!dirp) {
 		return NULL;
 	}
 	ZERO_STRUCTP(dirp);
 
 	dirp->conn = conn;
+	dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn));
 
 	dirp->dir_path = SMB_STRDUP(name);
 	if (!dirp->dir_path) {
@@ -1078,9 +1079,14 @@
 		goto fail;
 	}
 
-	dirp->name_cache = SMB_CALLOC_ARRAY(struct name_cache_entry, NAME_CACHE_SIZE);
-	if (!dirp->name_cache) {
-		goto fail;
+	if (dirp->name_cache_size) {
+		dirp->name_cache = SMB_CALLOC_ARRAY(struct name_cache_entry,
+				dirp->name_cache_size);
+		if (!dirp->name_cache) {
+			goto fail;
+		}
+	} else {
+		dirp->name_cache = NULL;
 	}
 
 	dirhandles_open++;
@@ -1113,7 +1119,7 @@
 	}
 	SAFE_FREE(dirp->dir_path);
 	if (dirp->name_cache) {
-		for (i = 0; i < NAME_CACHE_SIZE; i++) {
+		for (i = 0; i < dirp->name_cache_size; i++) {
 			SAFE_FREE(dirp->name_cache[i].name);
 		}
 	}
@@ -1229,7 +1235,12 @@
 {
 	struct name_cache_entry *e;
 
-	dirp->name_cache_index = (dirp->name_cache_index+1) % NAME_CACHE_SIZE;
+	if (!dirp->name_cache_size || !dirp->name_cache) {
+		return;
+	}
+
+	dirp->name_cache_index = (dirp->name_cache_index+1) %
+					dirp->name_cache_size;
 	e = &dirp->name_cache[dirp->name_cache_index];
 	SAFE_FREE(e->name);
 	e->name = SMB_STRDUP(name);
@@ -1248,20 +1259,22 @@
 	connection_struct *conn = dirp->conn;
 
 	/* Search back in the name cache. */
-	for (i = dirp->name_cache_index; i >= 0; i--) {
-		struct name_cache_entry *e = &dirp->name_cache[i];
-		if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
-			*poffset = e->offset;
-			SeekDir(dirp, e->offset);
-			return True;
+	if (dirp->name_cache_size && dirp->name_cache) {
+		for (i = dirp->name_cache_index; i >= 0; i--) {
+			struct name_cache_entry *e = &dirp->name_cache[i];
+			if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
+				*poffset = e->offset;
+				SeekDir(dirp, e->offset);
+				return True;
+			}
 		}
-	}
-	for (i = NAME_CACHE_SIZE-1; i > dirp->name_cache_index; i--) {
-		struct name_cache_entry *e = &dirp->name_cache[i];
-		if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
-			*poffset = e->offset;
-			SeekDir(dirp, e->offset);
-			return True;
+		for (i = dirp->name_cache_size - 1; i > dirp->name_cache_index; i--) {
+			struct name_cache_entry *e = &dirp->name_cache[i];
+			if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
+				*poffset = e->offset;
+				SeekDir(dirp, e->offset);
+				return True;
+			}
 		}
 	}
 

Modified: branches/SAMBA_3_2_0/source/param/loadparm.c
===================================================================
--- branches/SAMBA_3_2_0/source/param/loadparm.c	2007-08-23 21:34:08 UTC (rev 24638)
+++ branches/SAMBA_3_2_0/source/param/loadparm.c	2007-08-23 21:53:00 UTC (rev 24639)
@@ -473,6 +473,7 @@
 	int iAioReadSize;
 	int iAioWriteSize;
 	int iMap_readonly;
+	int iDirectoryNameCacheSize;
 	param_opt_struct *param_opt;
 
 	char dummy[3];		/* for alignment */
@@ -614,7 +615,11 @@
 	0,			/* iAioReadSize */
 	0,			/* iAioWriteSize */
 	MAP_READONLY_YES,	/* iMap_readonly */
-	
+#ifdef BROKEN_DIRECTORY_HANDLING
+	0,			/* iDirectoryNameCacheSize */
+#else
+	100,			/* iDirectoryNameCacheSize */
+#endif
 	NULL,			/* Parametric options */
 
 	""			/* dummy */
@@ -1036,6 +1041,7 @@
 	{"getwd cache", P_BOOL, P_GLOBAL, &use_getwd_cache, NULL, NULL, FLAG_ADVANCED}, 
 	{"keepalive", P_INTEGER, P_GLOBAL, &keepalive, NULL, NULL, FLAG_ADVANCED}, 
 	{"change notify", P_BOOL, P_LOCAL, &sDefault.bChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
+	{"directory name cache size", P_INTEGER, P_LOCAL, &sDefault.iDirectoryNameCacheSize, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
 	{"kernel change notify", P_BOOL, P_LOCAL, &sDefault.bKernelChangeNotify, NULL, NULL, FLAG_ADVANCED | FLAG_SHARE },
 
 	{"lpq cache time", P_INTEGER, P_GLOBAL, &Globals.lpqcachetime, NULL, NULL, FLAG_ADVANCED}, 
@@ -2183,6 +2189,7 @@
 FN_LOCAL_INTEGER(lp_aio_read_size, iAioReadSize)
 FN_LOCAL_INTEGER(lp_aio_write_size, iAioWriteSize)
 FN_LOCAL_INTEGER(lp_map_readonly, iMap_readonly)
+FN_LOCAL_INTEGER(lp_directory_name_cache_size, iDirectoryNameCacheSize)
 FN_LOCAL_CHAR(lp_magicchar, magic_char)
 FN_GLOBAL_INTEGER(lp_winbind_cache_time, &Globals.winbind_cache_time)
 FN_GLOBAL_LIST(lp_winbind_nss_info, &Globals.szWinbindNssInfo)

Modified: branches/SAMBA_3_2_0/source/smbd/dir.c
===================================================================
--- branches/SAMBA_3_2_0/source/smbd/dir.c	2007-08-23 21:34:08 UTC (rev 24638)
+++ branches/SAMBA_3_2_0/source/smbd/dir.c	2007-08-23 21:53:00 UTC (rev 24639)
@@ -32,8 +32,6 @@
 
 /* Make directory handle internals available. */
 
-#define NAME_CACHE_SIZE 100
-
 struct name_cache_entry {
 	char *name;
 	long offset;
@@ -44,6 +42,7 @@
 	SMB_STRUCT_DIR *dir;
 	long offset;
 	char *dir_path;
+	size_t name_cache_size;
 	struct name_cache_entry *name_cache;
 	unsigned int name_cache_index;
 	unsigned int file_number;
@@ -1061,12 +1060,14 @@
 struct smb_Dir *OpenDir(connection_struct *conn, const char *name, const char *mask, uint32 attr)
 {
 	struct smb_Dir *dirp = SMB_MALLOC_P(struct smb_Dir);
+
 	if (!dirp) {
 		return NULL;
 	}
 	ZERO_STRUCTP(dirp);
 
 	dirp->conn = conn;
+	dirp->name_cache_size = lp_directory_name_cache_size(SNUM(conn));
 
 	dirp->dir_path = SMB_STRDUP(name);
 	if (!dirp->dir_path) {
@@ -1078,9 +1079,14 @@
 		goto fail;
 	}
 
-	dirp->name_cache = SMB_CALLOC_ARRAY(struct name_cache_entry, NAME_CACHE_SIZE);
-	if (!dirp->name_cache) {
-		goto fail;
+	if (dirp->name_cache_size) {
+		dirp->name_cache = SMB_CALLOC_ARRAY(struct name_cache_entry,
+				dirp->name_cache_size);
+		if (!dirp->name_cache) {
+			goto fail;
+		}
+	} else {
+		dirp->name_cache = NULL;
 	}
 
 	dirhandles_open++;
@@ -1113,7 +1119,7 @@
 	}
 	SAFE_FREE(dirp->dir_path);
 	if (dirp->name_cache) {
-		for (i = 0; i < NAME_CACHE_SIZE; i++) {
+		for (i = 0; i < dirp->name_cache_size; i++) {
 			SAFE_FREE(dirp->name_cache[i].name);
 		}
 	}
@@ -1229,7 +1235,12 @@
 {
 	struct name_cache_entry *e;
 
-	dirp->name_cache_index = (dirp->name_cache_index+1) % NAME_CACHE_SIZE;
+	if (!dirp->name_cache_size || !dirp->name_cache) {
+		return;
+	}
+
+	dirp->name_cache_index = (dirp->name_cache_index+1) %
+					dirp->name_cache_size;
 	e = &dirp->name_cache[dirp->name_cache_index];
 	SAFE_FREE(e->name);
 	e->name = SMB_STRDUP(name);
@@ -1248,20 +1259,22 @@
 	connection_struct *conn = dirp->conn;
 
 	/* Search back in the name cache. */
-	for (i = dirp->name_cache_index; i >= 0; i--) {
-		struct name_cache_entry *e = &dirp->name_cache[i];
-		if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
-			*poffset = e->offset;
-			SeekDir(dirp, e->offset);
-			return True;
+	if (dirp->name_cache_size && dirp->name_cache) {
+		for (i = dirp->name_cache_index; i >= 0; i--) {
+			struct name_cache_entry *e = &dirp->name_cache[i];
+			if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
+				*poffset = e->offset;
+				SeekDir(dirp, e->offset);
+				return True;
+			}
 		}
-	}
-	for (i = NAME_CACHE_SIZE-1; i > dirp->name_cache_index; i--) {
-		struct name_cache_entry *e = &dirp->name_cache[i];
-		if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
-			*poffset = e->offset;
-			SeekDir(dirp, e->offset);
-			return True;
+		for (i = dirp->name_cache_size - 1; i > dirp->name_cache_index; i--) {
+			struct name_cache_entry *e = &dirp->name_cache[i];
+			if (e->name && (conn->case_sensitive ? (strcmp(e->name, name) == 0) : strequal(e->name, name))) {
+				*poffset = e->offset;
+				SeekDir(dirp, e->offset);
+				return True;
+			}
 		}
 	}
 



More information about the samba-cvs mailing list