void conn_init(struct smbd_server_connection *sconn)
{
- sconn->smb1.tcons.Connections = NULL;
sconn->smb1.tcons.bmap = bitmap_talloc(sconn, BITMAP_BLOCK_SZ);
}
int conn_num_open(struct smbd_server_connection *sconn)
{
- return sconn->num_tcons_open;
+ return sconn->num_connections;
}
/****************************************************************************
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;
}
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;
}
}
return NULL;
}
conn->sconn = sconn;
+
+ DLIST_ADD(sconn->connections, conn);
+ sconn->num_connections++;
+
return conn;
}
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;
}
{
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);
}
}
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()
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);
}
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;
}
}
}
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);
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;
}
}
/* 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);
}
} 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",
size_t num_users;
struct user_struct *users;
+ size_t num_connections;
+ struct connection_struct *connections;
+
struct files_struct *files;
struct bitmap *file_bmap;
int real_max_open_files;
unsigned long file_gen_counter;
int first_file;
- /* number of open connections (tcons) */
- int num_tcons_open;
-
struct pending_message_list *deferred_open_queue;
uint16_t next_vuid;
} sessions;
struct {
- connection_struct *Connections;
/* number of open connections */
struct bitmap *bmap;
} tcons;
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);
idr_remove(tcon->session->tcons.idtree, tcon->tid);
DLIST_REMOVE(tcon->session->tcons.list, tcon);
- SMB_ASSERT(tcon->session->sconn->num_tcons_open > 0);
- tcon->session->sconn->num_tcons_open--;
if (tcon->compat_conn) {
set_current_service(tcon->compat_conn, 0, true);
DLIST_ADD_END(req->session->tcons.list, tcon,
struct smbd_smb2_tcon *);
tcon->session = req->session;
- tcon->session->sconn->num_tcons_open++;
talloc_set_destructor(tcon, smbd_smb2_tcon_destructor);
compat_conn = make_connection_smb2(req->sconn,