Skip to content

Commit 3a7b6d0

Browse files
dhowellssmfrench
authored andcommitted
cifs: Don't need state locking in smb2_get_mid_entry()
There's no need to get ->srv_lock or ->ses_lock in smb2_get_mid_entry() as all that happens of relevance (to the lock) inside the locked sections is the reading of one status value in each. Replace the locking with READ_ONCE() and use a switch instead of a chain of if-statements. Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Paulo Alcantara (Red Hat) <pc@manguebit.org> cc: Shyam Prasad N <sprasad@microsoft.com> cc: Tom Talpey <tom@talpey.com> cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 87fba18 commit 3a7b6d0

1 file changed

Lines changed: 20 additions & 28 deletions

File tree

fs/smb/client/smb2transport.c

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -684,43 +684,35 @@ static int
684684
smb2_get_mid_entry(struct cifs_ses *ses, struct TCP_Server_Info *server,
685685
struct smb2_hdr *shdr, struct mid_q_entry **mid)
686686
{
687-
spin_lock(&server->srv_lock);
688-
if (server->tcpStatus == CifsExiting) {
689-
spin_unlock(&server->srv_lock);
687+
switch (READ_ONCE(server->tcpStatus)) {
688+
case CifsExiting:
690689
return -ENOENT;
691-
}
692-
693-
if (server->tcpStatus == CifsNeedReconnect) {
694-
spin_unlock(&server->srv_lock);
690+
case CifsNeedReconnect:
695691
cifs_dbg(FYI, "tcp session dead - return to caller to retry\n");
696692
return -EAGAIN;
697-
}
698-
699-
if (server->tcpStatus == CifsNeedNegotiate &&
700-
shdr->Command != SMB2_NEGOTIATE) {
701-
spin_unlock(&server->srv_lock);
702-
return -EAGAIN;
703-
}
704-
spin_unlock(&server->srv_lock);
705-
706-
spin_lock(&ses->ses_lock);
707-
if (ses->ses_status == SES_NEW) {
708-
if ((shdr->Command != SMB2_SESSION_SETUP) &&
709-
(shdr->Command != SMB2_NEGOTIATE)) {
710-
spin_unlock(&ses->ses_lock);
693+
case CifsNeedNegotiate:
694+
if (shdr->Command != SMB2_NEGOTIATE)
711695
return -EAGAIN;
712-
}
713-
/* else ok - we are setting up session */
696+
break;
697+
default:
698+
break;
714699
}
715700

716-
if (ses->ses_status == SES_EXITING) {
717-
if (shdr->Command != SMB2_LOGOFF) {
718-
spin_unlock(&ses->ses_lock);
701+
switch (READ_ONCE(ses->ses_status)) {
702+
case SES_NEW:
703+
if (shdr->Command != SMB2_SESSION_SETUP &&
704+
shdr->Command != SMB2_NEGOTIATE)
705+
return -EAGAIN;
706+
/* else ok - we are setting up session */
707+
break;
708+
case SES_EXITING:
709+
if (shdr->Command != SMB2_LOGOFF)
719710
return -EAGAIN;
720-
}
721711
/* else ok - we are shutting down the session */
712+
break;
713+
default:
714+
break;
722715
}
723-
spin_unlock(&ses->ses_lock);
724716

725717
*mid = smb2_mid_entry_alloc(shdr, server);
726718
if (*mid == NULL)

0 commit comments

Comments
 (0)