From patchwork Sun Apr 10 10:05:52 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Shilovsky X-Patchwork-Id: 696451 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3AA6dqq010224 for ; Sun, 10 Apr 2011 10:06:39 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755890Ab1DJKGh (ORCPT ); Sun, 10 Apr 2011 06:06:37 -0400 Received: from mail-fx0-f46.google.com ([209.85.161.46]:65153 "EHLO mail-fx0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755796Ab1DJKGg (ORCPT ); Sun, 10 Apr 2011 06:06:36 -0400 Received: by fxm17 with SMTP id 17so3051550fxm.19 for ; Sun, 10 Apr 2011 03:06:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:sender:from:to:subject:date:message-id:x-mailer; bh=4oZyhOsQjm4m9qagX5f5iz5MZEpvJbHyjJxgHG8AFZs=; b=Wo35sQn+UTnRU63okz6TQRwCmTus5DoxjxWpT0TRhy9GVJPFfp2+gkKTf0QTOB/gW5 Co2uAMRHT6SPnhNs7Sutt7nxsx8Otnh5+7b6WL7rvCqZA8e2thS/PWzZtwuw03dbyBoU aMxJo0aN2mHFtIp3u6JMwsnwu/Q2evKnrSdkM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:subject:date:message-id:x-mailer; b=rYJYcGqXPrrtMYhcO3cpfRWfz13ztc/tY8LhC0pZ6srWXqOvUstrd2WgffctH8vtqF ho53I5gR97/2iWc4bqdMOkLN4sw1NqJEwVc645CmQPiqkqdBCQDoGxplgMdzoIBp02MZ p5CPB3Qy8Ku0Ngvdg5mdGXAabFuxDZJA3Lql4= Received: by 10.223.1.201 with SMTP id 9mr1245623fag.91.1302429995209; Sun, 10 Apr 2011 03:06:35 -0700 (PDT) Received: from localhost.localdomain ([79.126.100.31]) by mx.google.com with ESMTPS id n26sm1306634fam.13.2011.04.10.03.06.34 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 10 Apr 2011 03:06:34 -0700 (PDT) From: Pavel Shilovsky To: linux-cifs@vger.kernel.org Subject: [PATCH 1/3] CIFS: Simplify connection structure search calls Date: Sun, 10 Apr 2011 14:05:52 +0400 Message-Id: <1302429954-9927-1-git-send-email-piastry@etersoft.ru> X-Mailer: git-send-email 1.7.1 Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Sun, 10 Apr 2011 10:06:39 +0000 (UTC) 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. Signed-off-by: Pavel Shilovsky --- fs/cifs/connect.c | 104 ++++++++++++++++++++++++++++++++--------------------- 1 files changed, 63 insertions(+), 41 deletions(-) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 3ab54a0..bf610ab 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -1638,32 +1638,41 @@ match_security(struct TCP_Server_Info *server, struct smb_vol *vol) return true; } -static struct TCP_Server_Info * -cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol) +static int match_server(struct TCP_Server_Info *server, 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 (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns)) + return 0; - if (!match_address(server, addr, - (struct sockaddr *)&vol->srcaddr)) - continue; + if (!match_address(server, addr, + (struct sockaddr *)&vol->srcaddr)) + return 0; #ifdef CONFIG_CIFS_SMB2 - if ((server->is_smb2 == true) && (vol->use_smb2 == false)) - continue; + if ((server->is_smb2 == true) && (vol->use_smb2 == false)) + return 0; - if ((server->is_smb2 == false) && (vol->use_smb2 == true)) - continue; + if ((server->is_smb2 == false) && (vol->use_smb2 == true)) + return 0; #endif /* CONFIG_CIFS_SMB2 */ - if (!match_port(server, addr)) - continue; + 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; - if (!match_security(server, vol)) + spin_lock(&cifs_tcp_ses_lock); + list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) { + if (!match_server(server, addr, vol)) continue; ++server->srv_count; @@ -1863,6 +1872,30 @@ out_err: return ERR_PTR(rc); } +static int match_session(struct cifs_ses *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 cifs_ses * cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol) { @@ -1870,25 +1903,8 @@ cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol) 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; @@ -2031,6 +2047,15 @@ get_ses_fail: return ERR_PTR(rc); } +static int match_tcon(struct cifs_tcon *tcon, const char *unc) +{ + if (tcon->tidStatus == CifsExiting) + return 0; + if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE)) + return 0; + return 1; +} + static struct cifs_tcon * cifs_find_tcon(struct cifs_ses *ses, const char *unc) { @@ -2040,11 +2065,8 @@ cifs_find_tcon(struct cifs_ses *ses, const char *unc) spin_lock(&cifs_tcp_ses_lock); list_for_each(tmp, &ses->tcon_list) { tcon = list_entry(tmp, struct cifs_tcon, tcon_list); - if (tcon->tidStatus == CifsExiting) - continue; - if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE)) + if (!match_tcon(tcon, unc)) continue; - ++tcon->tc_count; spin_unlock(&cifs_tcp_ses_lock); return tcon;