Skip to content

Commit

Permalink
CIFS: Simplify connection structure search calls
Browse files Browse the repository at this point in the history
Use separate functions for comparison between existing structure
and what we are requesting for to make server, session and tcon
search code easier to use on next superblock match call.

Reviewed-by: Jeff Layton <jlayton@samba.org>
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Signed-off-by: Steve French <sfrench@us.ibm.com>
  • Loading branch information
Pavel Shilovsky authored and Steve French committed May 23, 2011
1 parent c02324a commit 37bb04e
Showing 1 changed file with 56 additions and 34 deletions.
90 changes: 56 additions & 34 deletions fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -1642,24 +1642,33 @@ match_security(struct TCP_Server_Info *server, struct smb_vol *vol)
return true;
}

static int match_server(struct TCP_Server_Info *server, struct sockaddr *addr,
struct smb_vol *vol)
{
if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
return 0;

if (!match_address(server, addr,
(struct sockaddr *)&vol->srcaddr))
return 0;

if (!match_port(server, addr))
return 0;

if (!match_security(server, vol))
return 0;

return 1;
}

static struct TCP_Server_Info *
cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol)
{
struct TCP_Server_Info *server;

spin_lock(&cifs_tcp_ses_lock);
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns))
continue;

if (!match_address(server, addr,
(struct sockaddr *)&vol->srcaddr))
continue;

if (!match_port(server, addr))
continue;

if (!match_security(server, vol))
if (!match_server(server, addr, vol))
continue;

++server->srv_count;
Expand Down Expand Up @@ -1853,32 +1862,39 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
return ERR_PTR(rc);
}

static int match_session(struct cifsSesInfo *ses, struct smb_vol *vol)
{
switch (ses->server->secType) {
case Kerberos:
if (vol->cred_uid != ses->cred_uid)
return 0;
break;
default:
/* anything else takes username/password */
if (ses->user_name == NULL)
return 0;
if (strncmp(ses->user_name, vol->username,
MAX_USERNAME_SIZE))
return 0;
if (strlen(vol->username) != 0 &&
ses->password != NULL &&
strncmp(ses->password,
vol->password ? vol->password : "",
MAX_PASSWORD_SIZE))
return 0;
}
return 1;
}

static struct cifsSesInfo *
cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
{
struct cifsSesInfo *ses;

spin_lock(&cifs_tcp_ses_lock);
list_for_each_entry(ses, &server->smb_ses_list, smb_ses_list) {
switch (server->secType) {
case Kerberos:
if (vol->cred_uid != ses->cred_uid)
continue;
break;
default:
/* anything else takes username/password */
if (ses->user_name == NULL)
continue;
if (strncmp(ses->user_name, vol->username,
MAX_USERNAME_SIZE))
continue;
if (strlen(vol->username) != 0 &&
ses->password != NULL &&
strncmp(ses->password,
vol->password ? vol->password : "",
MAX_PASSWORD_SIZE))
continue;
}
if (!match_session(ses, vol))
continue;
++ses->ses_count;
spin_unlock(&cifs_tcp_ses_lock);
return ses;
Expand Down Expand Up @@ -2021,6 +2037,15 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
return ERR_PTR(rc);
}

static int match_tcon(struct cifsTconInfo *tcon, const char *unc)
{
if (tcon->tidStatus == CifsExiting)
return 0;
if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
return 0;
return 1;
}

static struct cifsTconInfo *
cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
{
Expand All @@ -2030,11 +2055,8 @@ cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
spin_lock(&cifs_tcp_ses_lock);
list_for_each(tmp, &ses->tcon_list) {
tcon = list_entry(tmp, struct cifsTconInfo, tcon_list);
if (tcon->tidStatus == CifsExiting)
if (!match_tcon(tcon, unc))
continue;
if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
continue;

++tcon->tc_count;
spin_unlock(&cifs_tcp_ses_lock);
return tcon;
Expand Down

0 comments on commit 37bb04e

Please sign in to comment.