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

Reply via email to