[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Tue Mar 6 15:05:03 MST 2012


The branch, master has been updated
       via  68b8407 s3:smbd: keep 'num_files' and 'files' directly under smbd_server_connection
       via  f6b6e96 s3:smbd: keep 'num_connections' and 'connections' directly under smbd_server_connection
       via  6ce72a0 s3:smbd: keep 'num_users' and 'users' directly under smbd_server_connection
       via  d95dbb8 s3:msdfs: set the 'cnum' field to invalid for faked connection_structs
      from  c7f6714 s4 dns: Fix TCP handling in the DNS server

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


- Log -----------------------------------------------------------------
commit 68b840726bdcb368b1cd8245c4089e5aa33dc386
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Mar 3 05:44:16 2012 +0100

    s3:smbd: keep 'num_files' and 'files' directly under smbd_server_connection
    
    The plan is to have files_struct as some kind of low level
    abstraction for a smb1/smb2 opens, that can be used by SMB_VFS modules.
    
    metze
    
    Autobuild-User: Stefan Metzmacher <metze at samba.org>
    Autobuild-Date: Tue Mar  6 23:04:01 CET 2012 on sn-devel-104

commit f6b6e963f65c39a0b34b5d23919c0c50e3e81168
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Mar 3 05:43:31 2012 +0100

    s3:smbd: keep 'num_connections' and 'connections' directly under smbd_server_connection
    
    The plan is to have connection_struct as some kind of low level
    abstraction for a smb1/smb2 tree connects, that can be used by SMB_VFS modules.
    
    metze

commit 6ce72a01abfcffd19313b50e15976582ae84c61c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Mar 3 05:41:43 2012 +0100

    s3:smbd: keep 'num_users' and 'users' directly under smbd_server_connection
    
    The plan is to have users_struct as some kind of low level
    abstraction for a smb1/smb2 session, that can be used by SMB_VFS modules.
    
    metze

commit d95dbb86c592590dd5b64d2e307470943260834d
Author: Stefan Metzmacher <metze at samba.org>
Date:   Sat Mar 3 06:19:28 2012 +0100

    s3:msdfs: set the 'cnum' field to invalid for faked connection_structs
    
    metze

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

Summary of changes:
 source3/smbd/conn.c           |  114 +++++++++++------------------------------
 source3/smbd/conn_idle.c      |   79 ++++++----------------------
 source3/smbd/files.c          |   14 +++---
 source3/smbd/globals.h        |   15 +++---
 source3/smbd/msdfs.c          |    4 +-
 source3/smbd/password.c       |   22 ++++----
 source3/smbd/process.c        |    7 +--
 source3/smbd/smb2_sesssetup.c |    3 +-
 source3/smbd/smb2_tcon.c      |    3 -
 9 files changed, 79 insertions(+), 182 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c
index e17d374..12002e3 100644
--- a/source3/smbd/conn.c
+++ b/source3/smbd/conn.c
@@ -37,7 +37,6 @@
 
 void conn_init(struct smbd_server_connection *sconn)
 {
-	sconn->smb1.tcons.Connections = NULL;
 	sconn->smb1.tcons.bmap = bitmap_talloc(sconn, BITMAP_BLOCK_SZ);
 }
 
@@ -47,7 +46,7 @@ void conn_init(struct smbd_server_connection *sconn)
 
 int conn_num_open(struct smbd_server_connection *sconn)
 {
-	return sconn->num_tcons_open;
+	return sconn->num_connections;
 }
 
 /****************************************************************************
@@ -57,29 +56,14 @@ int conn_num_open(struct smbd_server_connection *sconn)
 bool conn_snum_used(struct smbd_server_connection *sconn,
 		    int snum)
 {
-	if (sconn->using_smb2) {
-		/* SMB2 */
-		struct smbd_smb2_session *sess;
-		for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
-			struct smbd_smb2_tcon *ptcon;
-
-			for (ptcon = sess->tcons.list; ptcon; ptcon = ptcon->next) {
-				if (ptcon->compat_conn &&
-						ptcon->compat_conn->params &&
-						(ptcon->compat_conn->params->service == snum)) {
-					return true;
-				}
-			}
-		}
-	} else {
-		/* SMB1 */
-		connection_struct *conn;
-		for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) {
-			if (conn->params->service == snum) {
-				return true;
-			}
+	struct connection_struct *conn;
+
+	for (conn=sconn->connections; conn; conn=conn->next) {
+		if (conn->params->service == snum) {
+			return true;
 		}
 	}
+
 	return false;
 }
 
@@ -89,31 +73,15 @@ bool conn_snum_used(struct smbd_server_connection *sconn,
 
 connection_struct *conn_find(struct smbd_server_connection *sconn,unsigned cnum)
 {
-	if (sconn->using_smb2) {
-		/* SMB2 */
-		struct smbd_smb2_session *sess;
-		for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
-			struct smbd_smb2_tcon *ptcon;
-
-			for (ptcon = sess->tcons.list; ptcon; ptcon = ptcon->next) {
-				if (ptcon->compat_conn &&
-						ptcon->compat_conn->cnum == cnum) {
-					return ptcon->compat_conn;
-				}
-			}
-		}
-	} else {
-		/* SMB1 */
-		int count=0;
-		connection_struct *conn;
-		for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next,count++) {
-			if (conn->cnum == cnum) {
-				if (count > 10) {
-					DLIST_PROMOTE(sconn->smb1.tcons.Connections,
-						conn);
-				}
-				return conn;
+	size_t count=0;
+	struct connection_struct *conn;
+
+	for (conn=sconn->connections; conn; conn=conn->next,count++) {
+		if (conn->cnum == cnum) {
+			if (count > 10) {
+				DLIST_PROMOTE(sconn->connections, conn);
 			}
+			return conn;
 		}
 	}
 
@@ -141,6 +109,10 @@ connection_struct *conn_new(struct smbd_server_connection *sconn)
 			return NULL;
 		}
 		conn->sconn = sconn;
+
+		DLIST_ADD(sconn->connections, conn);
+		sconn->num_connections++;
+
 		return conn;
 	}
 
@@ -201,12 +173,11 @@ find_again:
 
 	bitmap_set(sconn->smb1.tcons.bmap, i);
 
-	sconn->num_tcons_open++;
-
 	string_set(&conn->connectpath,"");
 	string_set(&conn->origpath,"");
 
-	DLIST_ADD(sconn->smb1.tcons.Connections, conn);
+	DLIST_ADD(sconn->connections, conn);
+	sconn->num_connections++;
 
 	return conn;
 }
@@ -264,29 +235,11 @@ void conn_clear_vuid_caches(struct smbd_server_connection *sconn,uint16_t vuid)
 {
 	connection_struct *conn;
 
-	if (sconn->using_smb2) {
-		/* SMB2 */
-		struct smbd_smb2_session *sess;
-		for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
-			struct smbd_smb2_tcon *ptcon;
-
-			for (ptcon = sess->tcons.list; ptcon; ptcon = ptcon->next) {
-				if (ptcon->compat_conn) {
-					if (ptcon->compat_conn->vuid == vuid) {
-						ptcon->compat_conn->vuid = UID_FIELD_INVALID;
-					}
-					conn_clear_vuid_cache(ptcon->compat_conn, vuid);
-				}
-			}
-		}
-	} else {
-		/* SMB1 */
-		for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) {
-			if (conn->vuid == vuid) {
-				conn->vuid = UID_FIELD_INVALID;
-			}
-			conn_clear_vuid_cache(conn, vuid);
+	for (conn=sconn->connections; conn;conn=conn->next) {
+		if (conn->vuid == vuid) {
+			conn->vuid = UID_FIELD_INVALID;
 		}
+		conn_clear_vuid_cache(conn, vuid);
 	}
 }
 
@@ -339,16 +292,8 @@ void conn_free(connection_struct *conn)
 		return;
 	}
 
-	if (conn->sconn->using_smb2) {
-		/* SMB2 */
-		conn_free_internal(conn);
-		return;
-	}
-
-	/* SMB1 */
-	DLIST_REMOVE(conn->sconn->smb1.tcons.Connections, conn);
-
-	if (conn->sconn->smb1.tcons.bmap != NULL) {
+	if (!conn->sconn->using_smb2 &&
+	    conn->sconn->smb1.tcons.bmap != NULL) {
 		/*
 		 * Can be NULL for fake connections created by
 		 * create_conn_struct()
@@ -356,8 +301,9 @@ void conn_free(connection_struct *conn)
 		bitmap_clear(conn->sconn->smb1.tcons.bmap, conn->cnum);
 	}
 
-	SMB_ASSERT(conn->sconn->num_tcons_open > 0);
-	conn->sconn->num_tcons_open--;
+	DLIST_REMOVE(conn->sconn->connections, conn);
+	SMB_ASSERT(conn->sconn->num_connections > 0);
+	conn->sconn->num_connections--;
 
 	conn_free_internal(conn);
 }
diff --git a/source3/smbd/conn_idle.c b/source3/smbd/conn_idle.c
index c1949d3..dc213ea 100644
--- a/source3/smbd/conn_idle.c
+++ b/source3/smbd/conn_idle.c
@@ -30,30 +30,13 @@
 
 static void conn_lastused_update(struct smbd_server_connection *sconn,time_t t)
 {
-	if (sconn->using_smb2) {
-		/* SMB2 */
-		struct smbd_smb2_session *sess;
-		for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
-			struct smbd_smb2_tcon *ptcon;
-
-			for (ptcon = sess->tcons.list; ptcon; ptcon = ptcon->next) {
-				connection_struct *conn = ptcon->compat_conn;
-				/* Update if connection wasn't idle. */
-				if (conn && conn->lastused != conn->lastused_count) {
-					conn->lastused = t;
-					conn->lastused_count = t;
-				}
-			}
-		}
-	} else {
-		/* SMB1 */
-		connection_struct *conn;
-		for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) {
-			/* Update if connection wasn't idle. */
-			if (conn->lastused != conn->lastused_count) {
-				conn->lastused = t;
-				conn->lastused_count = t;
-			}
+	struct connection_struct *conn;
+
+	for (conn=sconn->connections; conn; conn=conn->next) {
+		/* Update if connection wasn't idle. */
+		if (conn->lastused != conn->lastused_count) {
+			conn->lastused = t;
+			conn->lastused_count = t;
 		}
 	}
 }
@@ -65,6 +48,7 @@ static void conn_lastused_update(struct smbd_server_connection *sconn,time_t t)
 bool conn_idle_all(struct smbd_server_connection *sconn, time_t t)
 {
 	int deadtime = lp_deadtime()*60;
+	struct connection_struct *conn;
 
 	conn_lastused_update(sconn, t);
 
@@ -72,45 +56,16 @@ bool conn_idle_all(struct smbd_server_connection *sconn, time_t t)
 		deadtime = DEFAULT_SMBD_TIMEOUT;
 	}
 
-	if (sconn->using_smb2) {
-		/* SMB2 */
-		struct smbd_smb2_session *sess;
-		for (sess = sconn->smb2.sessions.list; sess; sess = sess->next) {
-			struct smbd_smb2_tcon *ptcon;
-
-			for (ptcon = sess->tcons.list; ptcon; ptcon = ptcon->next) {
-				time_t age;
-				connection_struct *conn = ptcon->compat_conn;
-
-				if (conn == NULL) {
-					continue;
-				}
+	for (conn=sconn->connections;conn;conn=conn->next) {
+		time_t age = t - conn->lastused;
 
-				age = t - conn->lastused;
-				/* close dirptrs on connections that are idle */
-				if (age > DPTR_IDLE_TIMEOUT) {
-					dptr_idlecnum(conn);
-				}
-
-				if (conn->num_files_open > 0 || age < deadtime) {
-					return false;
-				}
-			}
+		/* close dirptrs on connections that are idle */
+		if (age > DPTR_IDLE_TIMEOUT) {
+			dptr_idlecnum(conn);
 		}
-	} else {
-		/* SMB1 */
-		connection_struct *conn;
-		for (conn=sconn->smb1.tcons.Connections;conn;conn=conn->next) {
-			time_t age = t - conn->lastused;
 
-			/* close dirptrs on connections that are idle */
-			if (age > DPTR_IDLE_TIMEOUT) {
-				dptr_idlecnum(conn);
-			}
-
-			if (conn->num_files_open > 0 || age < deadtime) {
-				return false;
-			}
+		if (conn->num_files_open > 0 || age < deadtime) {
+			return false;
 		}
 	}
 
@@ -149,7 +104,7 @@ bool conn_close_all(struct smbd_server_connection *sconn)
 		/* SMB1 */
 		connection_struct *conn, *next;
 
-		for (conn=sconn->smb1.tcons.Connections;conn;conn=next) {
+		for (conn=sconn->connections;conn;conn=next) {
 			next=conn->next;
 			set_current_service(conn, 0, True);
 			close_cnum(conn, conn->vuid);
@@ -195,7 +150,7 @@ void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename
 		}
 	} else {
 		/* SMB1 */
-		for (conn=sconn->smb1.tcons.Connections;conn;conn=next) {
+		for (conn=sconn->connections;conn;conn=next) {
 			next=conn->next;
 			if (strequal(lp_servicename(SNUM(conn)), sharename)) {
 				DEBUG(1,("Forcing close of share %s cnum=%d\n",
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 4a8967e..10a0b81 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -105,7 +105,6 @@ NTSTATUS file_new(struct smb_request *req, connection_struct *conn,
 	sconn->first_file = (i+1) % (sconn->real_max_open_files);
 
 	bitmap_set(sconn->file_bmap, i);
-	sconn->files_used += 1;
 
 	fsp->fnum = i + FILE_HANDLE_OFFSET;
 	SMB_ASSERT(fsp->fnum < 65536);
@@ -123,9 +122,10 @@ NTSTATUS file_new(struct smb_request *req, connection_struct *conn,
 	}
 
 	DLIST_ADD(sconn->files, fsp);
+	sconn->num_files += 1;
 
-	DEBUG(5,("allocated file structure %d, fnum = %d (%d used)\n",
-		 i, fsp->fnum, sconn->files_used));
+	DEBUG(5,("allocated file structure %d, fnum = %d (%u used)\n",
+		 i, fsp->fnum, (unsigned int)sconn->num_files));
 
 	if (req != NULL) {
 		req->chain_fsp = fsp;
@@ -435,6 +435,8 @@ void file_free(struct smb_request *req, files_struct *fsp)
 	struct smbd_server_connection *sconn = fsp->conn->sconn;
 
 	DLIST_REMOVE(sconn->files, fsp);
+	SMB_ASSERT(sconn->num_files > 0);
+	sconn->num_files--;
 
 	TALLOC_FREE(fsp->fake_file_handle);
 
@@ -460,10 +462,8 @@ void file_free(struct smb_request *req, files_struct *fsp)
 	TALLOC_FREE(fsp->update_write_time_event);
 
 	bitmap_clear(sconn->file_bmap, fsp->fnum - FILE_HANDLE_OFFSET);
-	sconn->files_used--;
-
-	DEBUG(5,("freed files structure %d (%d used)\n",
-		 fsp->fnum, sconn->files_used));
+	DEBUG(5,("freed files structure %d (%u used)\n",
+		 fsp->fnum, (unsigned int)sconn->num_files));
 
 	fsp->conn->num_files_open--;
 
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index 075dc56..bfa649b 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -452,17 +452,21 @@ struct smbd_server_connection {
 	bool using_smb2;
 	int trans_num;
 
+	size_t num_users;
+	struct user_struct *users;
+
+	size_t num_connections;
+	struct connection_struct *connections;
+
+	size_t num_files;
 	struct files_struct *files;
+
 	struct bitmap *file_bmap;
 	int real_max_open_files;
-	int files_used;
 	struct fsp_singleton_cache fsp_fi_cache;
 	unsigned long file_gen_counter;
 	int first_file;
 
-	/* number of open connections (tcons) */
-	int num_tcons_open;
-
 	struct pending_message_list *deferred_open_queue;
 
 
@@ -535,12 +539,9 @@ struct smbd_server_connection {
 			 * this holds info on user ids that are already
 			 * validated for this VC
 			 */
-			user_struct *validated_users;
 			uint16_t next_vuid;
-			int num_validated_vuids;
 		} sessions;
 		struct {
-			connection_struct *Connections;
 			/* number of open connections */
 			struct bitmap *bmap;
 		} tcons;
diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c
index a00fd6f..7dc604c 100644
--- a/source3/smbd/msdfs.c
+++ b/source3/smbd/msdfs.c
@@ -263,9 +263,11 @@ NTSTATUS create_conn_struct(TALLOC_CTX *ctx,
 	}
 
 	conn->params->service = snum;
+	conn->cnum = (unsigned)-1;
 
 	conn->sconn = sconn;
-	conn->sconn->num_tcons_open++;
+	DLIST_ADD(sconn->connections, conn);
+	conn->sconn->num_connections++;
 
 	if (session_info != NULL) {
 		conn->session_info = copy_session_info(conn, session_info);
diff --git a/source3/smbd/password.c b/source3/smbd/password.c
index 27ba3bd..39cde15 100644
--- a/source3/smbd/password.c
+++ b/source3/smbd/password.c
@@ -52,7 +52,7 @@ static user_struct *get_valid_user_struct_internal(
 	if (vuid == UID_FIELD_INVALID)
 		return NULL;
 
-	usp=sconn->smb1.sessions.validated_users;
+	usp=sconn->users;
 	for (;usp;usp=usp->next,count++) {
 		if (vuid == usp->vuid) {
 			switch (server_allocated) {
@@ -69,8 +69,7 @@ static user_struct *get_valid_user_struct_internal(
 					break;
 			}
 			if (count > 10) {
-				DLIST_PROMOTE(sconn->smb1.sessions.validated_users,
-					      usp);
+				DLIST_PROMOTE(sconn->users, usp);
 			}
 			return usp;
 		}
@@ -128,14 +127,15 @@ void invalidate_vuid(struct smbd_server_connection *sconn, uint16 vuid)
 		TALLOC_FREE(vuser->gensec_security);
 	}
 
-	DLIST_REMOVE(sconn->smb1.sessions.validated_users, vuser);
+	DLIST_REMOVE(sconn->users, vuser);
+	SMB_ASSERT(sconn->num_users > 0);
+	sconn->num_users--;
 
 	/* clear the vuid from the 'cache' on each connection, and
 	   from the vuid 'owner' of connections */
 	conn_clear_vuid_caches(sconn, vuid);
 
 	TALLOC_FREE(vuser);
-	sconn->smb1.sessions.num_validated_vuids--;
 }
 
 /****************************************************************************
@@ -148,9 +148,8 @@ void invalidate_all_vuids(struct smbd_server_connection *sconn)
 		return;
 	}
 
-	while (sconn->smb1.sessions.validated_users != NULL) {
-		invalidate_vuid(sconn,
-				sconn->smb1.sessions.validated_users->vuid);
+	while (sconn->users != NULL) {
+		invalidate_vuid(sconn, sconn->users->vuid);
 	}
 }
 
@@ -173,7 +172,7 @@ int register_initial_vuid(struct smbd_server_connection *sconn)
 	user_struct *vuser;
 
 	/* Limit allowed vuids to 16bits - VUID_OFFSET. */
-	if (sconn->smb1.sessions.num_validated_vuids >= 0xFFFF-VUID_OFFSET) {
+	if (sconn->num_users >= 0xFFFF-VUID_OFFSET) {
 		return UID_FIELD_INVALID;
 	}
 
@@ -201,9 +200,10 @@ int register_initial_vuid(struct smbd_server_connection *sconn)
 	 * to NTLMSSP.
 	 */
 	increment_next_vuid(&sconn->smb1.sessions.next_vuid);
-	sconn->smb1.sessions.num_validated_vuids++;
 
-	DLIST_ADD(sconn->smb1.sessions.validated_users, vuser);
+	sconn->num_users++;
+	DLIST_ADD(sconn->users, vuser);
+
 	return vuser->vuid;
 }
 
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 1131318..f87eccf 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -2984,20 +2984,17 @@ static void smbd_id_cache_kill(struct messaging_context *msg_ctx,
 {
 	const char *msg = (data && data->data)
 		? (const char *)data->data : "<NULL>";
-	struct user_struct *validated_users;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list