[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