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 <me...@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 <me...@samba.org> Autobuild-Date: Tue Mar 6 23:04:01 CET 2012 on sn-devel-104 commit f6b6e963f65c39a0b34b5d23919c0c50e3e81168 Author: Stefan Metzmacher <me...@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 <me...@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 <me...@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