diff options
Diffstat (limited to 'fs/cifs/cifssmb.c')
-rw-r--r-- | fs/cifs/cifssmb.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 7e83b356cc9e..2f2632b6df5a 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -91,13 +91,13 @@ static void mark_open_files_invalid(struct cifsTconInfo *pTcon) | |||
91 | struct list_head *tmp1; | 91 | struct list_head *tmp1; |
92 | 92 | ||
93 | /* list all files open on tree connection and mark them invalid */ | 93 | /* list all files open on tree connection and mark them invalid */ |
94 | write_lock(&GlobalSMBSeslock); | 94 | spin_lock(&cifs_file_list_lock); |
95 | list_for_each_safe(tmp, tmp1, &pTcon->openFileList) { | 95 | list_for_each_safe(tmp, tmp1, &pTcon->openFileList) { |
96 | open_file = list_entry(tmp, struct cifsFileInfo, tlist); | 96 | open_file = list_entry(tmp, struct cifsFileInfo, tlist); |
97 | open_file->invalidHandle = true; | 97 | open_file->invalidHandle = true; |
98 | open_file->oplock_break_cancelled = true; | 98 | open_file->oplock_break_cancelled = true; |
99 | } | 99 | } |
100 | write_unlock(&GlobalSMBSeslock); | 100 | spin_unlock(&cifs_file_list_lock); |
101 | /* BB Add call to invalidate_inodes(sb) for all superblocks mounted | 101 | /* BB Add call to invalidate_inodes(sb) for all superblocks mounted |
102 | to this tcon */ | 102 | to this tcon */ |
103 | } | 103 | } |
@@ -503,7 +503,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
503 | 503 | ||
504 | if (rsp->EncryptionKeyLength == | 504 | if (rsp->EncryptionKeyLength == |
505 | cpu_to_le16(CIFS_CRYPTO_KEY_SIZE)) { | 505 | cpu_to_le16(CIFS_CRYPTO_KEY_SIZE)) { |
506 | memcpy(server->cryptKey, rsp->EncryptionKey, | 506 | memcpy(ses->server->cryptkey, rsp->EncryptionKey, |
507 | CIFS_CRYPTO_KEY_SIZE); | 507 | CIFS_CRYPTO_KEY_SIZE); |
508 | } else if (server->secMode & SECMODE_PW_ENCRYPT) { | 508 | } else if (server->secMode & SECMODE_PW_ENCRYPT) { |
509 | rc = -EIO; /* need cryptkey unless plain text */ | 509 | rc = -EIO; /* need cryptkey unless plain text */ |
@@ -574,7 +574,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
574 | server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); | 574 | server->timeAdj = (int)(__s16)le16_to_cpu(pSMBr->ServerTimeZone); |
575 | server->timeAdj *= 60; | 575 | server->timeAdj *= 60; |
576 | if (pSMBr->EncryptionKeyLength == CIFS_CRYPTO_KEY_SIZE) { | 576 | if (pSMBr->EncryptionKeyLength == CIFS_CRYPTO_KEY_SIZE) { |
577 | memcpy(server->cryptKey, pSMBr->u.EncryptionKey, | 577 | memcpy(ses->server->cryptkey, pSMBr->u.EncryptionKey, |
578 | CIFS_CRYPTO_KEY_SIZE); | 578 | CIFS_CRYPTO_KEY_SIZE); |
579 | } else if ((pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC) | 579 | } else if ((pSMBr->hdr.Flags2 & SMBFLG2_EXT_SEC) |
580 | && (pSMBr->EncryptionKeyLength == 0)) { | 580 | && (pSMBr->EncryptionKeyLength == 0)) { |
@@ -593,9 +593,9 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
593 | rc = -EIO; | 593 | rc = -EIO; |
594 | goto neg_err_exit; | 594 | goto neg_err_exit; |
595 | } | 595 | } |
596 | read_lock(&cifs_tcp_ses_lock); | 596 | spin_lock(&cifs_tcp_ses_lock); |
597 | if (server->srv_count > 1) { | 597 | if (server->srv_count > 1) { |
598 | read_unlock(&cifs_tcp_ses_lock); | 598 | spin_unlock(&cifs_tcp_ses_lock); |
599 | if (memcmp(server->server_GUID, | 599 | if (memcmp(server->server_GUID, |
600 | pSMBr->u.extended_response. | 600 | pSMBr->u.extended_response. |
601 | GUID, 16) != 0) { | 601 | GUID, 16) != 0) { |
@@ -605,7 +605,7 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
605 | 16); | 605 | 16); |
606 | } | 606 | } |
607 | } else { | 607 | } else { |
608 | read_unlock(&cifs_tcp_ses_lock); | 608 | spin_unlock(&cifs_tcp_ses_lock); |
609 | memcpy(server->server_GUID, | 609 | memcpy(server->server_GUID, |
610 | pSMBr->u.extended_response.GUID, 16); | 610 | pSMBr->u.extended_response.GUID, 16); |
611 | } | 611 | } |
@@ -620,13 +620,15 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses) | |||
620 | rc = 0; | 620 | rc = 0; |
621 | else | 621 | else |
622 | rc = -EINVAL; | 622 | rc = -EINVAL; |
623 | 623 | if (server->secType == Kerberos) { | |
624 | if (server->sec_kerberos || server->sec_mskerberos) | 624 | if (!server->sec_kerberos && |
625 | server->secType = Kerberos; | 625 | !server->sec_mskerberos) |
626 | else if (server->sec_ntlmssp) | 626 | rc = -EOPNOTSUPP; |
627 | server->secType = RawNTLMSSP; | 627 | } else if (server->secType == RawNTLMSSP) { |
628 | else | 628 | if (!server->sec_ntlmssp) |
629 | rc = -EOPNOTSUPP; | 629 | rc = -EOPNOTSUPP; |
630 | } else | ||
631 | rc = -EOPNOTSUPP; | ||
630 | } | 632 | } |
631 | } else | 633 | } else |
632 | server->capabilities &= ~CAP_EXTENDED_SECURITY; | 634 | server->capabilities &= ~CAP_EXTENDED_SECURITY; |