From patchwork Mon Feb 7 13:54:36 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Layton X-Patchwork-Id: 538081 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 p17EF9hH015155 for ; Mon, 7 Feb 2011 14:15:21 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752769Ab1BGNyw (ORCPT ); Mon, 7 Feb 2011 08:54:52 -0500 Received: from mail-yw0-f46.google.com ([209.85.213.46]:58163 "EHLO mail-yw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752701Ab1BGNyw (ORCPT ); Mon, 7 Feb 2011 08:54:52 -0500 Received: by ywo7 with SMTP id 7so1424902ywo.19 for ; Mon, 07 Feb 2011 05:54:48 -0800 (PST) Received: by 10.100.95.10 with SMTP id s10mr9613073anb.5.1297086888370; Mon, 07 Feb 2011 05:54:48 -0800 (PST) Received: from salusa.poochiereds.net (cpe-071-070-153-003.nc.res.rr.com [71.70.153.3]) by mx.google.com with ESMTPS id d15sm5653126ana.35.2011.02.07.05.54.47 (version=SSLv3 cipher=RC4-MD5); Mon, 07 Feb 2011 05:54:47 -0800 (PST) From: Jeff Layton To: smfrench@gmail.com Cc: linux-cifs@vger.kernel.org, jg@cms.ac Subject: [PATCH 2/2] cifs: clarify the meaning of tcpStatus == CifsGood Date: Mon, 7 Feb 2011 08:54:36 -0500 Message-Id: <1297086876-19165-3-git-send-email-jlayton@redhat.com> X-Mailer: git-send-email 1.7.4 In-Reply-To: <1297086876-19165-1-git-send-email-jlayton@redhat.com> References: <1297086876-19165-1-git-send-email-jlayton@redhat.com> 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]); Mon, 07 Feb 2011 14:15:22 +0000 (UTC) difference between these two states, and we need to know this in order to know whether we can send an echo or not. Resolve this by adding a new statusEnum value -- CifsNeedNegotiate. When the socket has been connected but has not yet had a NEGOTIATE_PROTOCOL request done, set it to this value. Once the NEGOTIATE is done, cifs_negotiate_protocol will set tcpStatus to CifsGood. This also fixes and cleans the logic in cifs_reconnect and cifs_reconnect_tcon. The old code checked for specific states when what it really wants to know is whether the state has actually changed from CifsNeedReconnect. Reported-and-Tested-by: JG Signed-off-by: Jeff Layton --- fs/cifs/cifsglob.h | 3 ++- fs/cifs/cifssmb.c | 4 ++-- fs/cifs/connect.c | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h index edd5b29..5f333e0 100644 --- a/fs/cifs/cifsglob.h +++ b/fs/cifs/cifsglob.h @@ -92,7 +92,8 @@ enum statusEnum { CifsNew = 0, CifsGood, CifsExiting, - CifsNeedReconnect + CifsNeedReconnect, + CifsNeedNegotiate }; enum securityEnum { diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 904aa47..f4bd502 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c @@ -142,9 +142,9 @@ cifs_reconnect_tcon(struct cifsTconInfo *tcon, int smb_command) */ while (server->tcpStatus == CifsNeedReconnect) { wait_event_interruptible_timeout(server->response_q, - (server->tcpStatus == CifsGood), 10 * HZ); + (server->tcpStatus != CifsNeedReconnect), 10 * HZ); - /* is TCP session is reestablished now ?*/ + /* are we still trying to reconnect? */ if (server->tcpStatus != CifsNeedReconnect) break; diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 257b6d8..7deceae 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -199,8 +199,7 @@ cifs_reconnect(struct TCP_Server_Info *server) } spin_unlock(&GlobalMid_Lock); - while ((server->tcpStatus != CifsExiting) && - (server->tcpStatus != CifsGood)) { + while (server->tcpStatus == CifsNeedReconnect) { try_to_freeze(); /* we should try only the port we connected to before */ @@ -212,7 +211,7 @@ cifs_reconnect(struct TCP_Server_Info *server) atomic_inc(&tcpSesReconnectCount); spin_lock(&GlobalMid_Lock); if (server->tcpStatus != CifsExiting) - server->tcpStatus = CifsGood; + server->tcpStatus = CifsNeedNegotiate; spin_unlock(&GlobalMid_Lock); } } @@ -420,7 +419,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) pdu_length = 4; /* enough to get RFC1001 header */ incomplete_rcv: - if (echo_retries > 0 && + if (echo_retries > 0 && server->tcpStatus == CifsGood && time_after(jiffies, server->lstrp + (echo_retries * SMB_ECHO_INTERVAL))) { cERROR(1, "Server %s has not responded in %d seconds. " @@ -1732,6 +1731,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) cERROR(1, "Error connecting to socket. Aborting operation"); goto out_err_crypto_release; } + tcp_ses->tcpStatus = CifsNeedNegotiate; /* * since we're in a cifs function already, we know that