summaryrefslogtreecommitdiff
path: root/source3/smbd/conn.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2012-03-03 05:43:31 +0100
committerStefan Metzmacher <metze@samba.org>2012-03-06 21:26:05 +0100
commitf6b6e963f65c39a0b34b5d23919c0c50e3e81168 (patch)
tree723f3ce852a5b5d6eb110db958a6660eb27239ce /source3/smbd/conn.c
parent6ce72a01abfcffd19313b50e15976582ae84c61c (diff)
downloadsamba-f6b6e963f65c39a0b34b5d23919c0c50e3e81168.tar.gz
samba-f6b6e963f65c39a0b34b5d23919c0c50e3e81168.tar.bz2
samba-f6b6e963f65c39a0b34b5d23919c0c50e3e81168.zip
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
Diffstat (limited to 'source3/smbd/conn.c')
-rw-r--r--source3/smbd/conn.c114
1 files changed, 30 insertions, 84 deletions
diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c
index e17d3744e5..12002e37a2 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);
}