diff options
Diffstat (limited to 'fs/cifs/misc.c')
| -rw-r--r-- | fs/cifs/misc.c | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index 3ccadc1326d6..1c681f6a6803 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
| @@ -347,7 +347,7 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ , | |||
| 347 | if (current_fsuid() != treeCon->ses->linux_uid) { | 347 | if (current_fsuid() != treeCon->ses->linux_uid) { |
| 348 | cFYI(1, "Multiuser mode and UID " | 348 | cFYI(1, "Multiuser mode and UID " |
| 349 | "did not match tcon uid"); | 349 | "did not match tcon uid"); |
| 350 | read_lock(&cifs_tcp_ses_lock); | 350 | spin_lock(&cifs_tcp_ses_lock); |
| 351 | list_for_each(temp_item, &treeCon->ses->server->smb_ses_list) { | 351 | list_for_each(temp_item, &treeCon->ses->server->smb_ses_list) { |
| 352 | ses = list_entry(temp_item, struct cifsSesInfo, smb_ses_list); | 352 | ses = list_entry(temp_item, struct cifsSesInfo, smb_ses_list); |
| 353 | if (ses->linux_uid == current_fsuid()) { | 353 | if (ses->linux_uid == current_fsuid()) { |
| @@ -361,7 +361,7 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ , | |||
| 361 | } | 361 | } |
| 362 | } | 362 | } |
| 363 | } | 363 | } |
| 364 | read_unlock(&cifs_tcp_ses_lock); | 364 | spin_unlock(&cifs_tcp_ses_lock); |
| 365 | } | 365 | } |
| 366 | } | 366 | } |
| 367 | } | 367 | } |
| @@ -551,7 +551,7 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 551 | return false; | 551 | return false; |
| 552 | 552 | ||
| 553 | /* look up tcon based on tid & uid */ | 553 | /* look up tcon based on tid & uid */ |
| 554 | read_lock(&cifs_tcp_ses_lock); | 554 | spin_lock(&cifs_tcp_ses_lock); |
| 555 | list_for_each(tmp, &srv->smb_ses_list) { | 555 | list_for_each(tmp, &srv->smb_ses_list) { |
| 556 | ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list); | 556 | ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list); |
| 557 | list_for_each(tmp1, &ses->tcon_list) { | 557 | list_for_each(tmp1, &ses->tcon_list) { |
| @@ -560,25 +560,15 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 560 | continue; | 560 | continue; |
| 561 | 561 | ||
| 562 | cifs_stats_inc(&tcon->num_oplock_brks); | 562 | cifs_stats_inc(&tcon->num_oplock_brks); |
| 563 | read_lock(&GlobalSMBSeslock); | 563 | spin_lock(&cifs_file_list_lock); |
| 564 | list_for_each(tmp2, &tcon->openFileList) { | 564 | list_for_each(tmp2, &tcon->openFileList) { |
| 565 | netfile = list_entry(tmp2, struct cifsFileInfo, | 565 | netfile = list_entry(tmp2, struct cifsFileInfo, |
| 566 | tlist); | 566 | tlist); |
| 567 | if (pSMB->Fid != netfile->netfid) | 567 | if (pSMB->Fid != netfile->netfid) |
| 568 | continue; | 568 | continue; |
| 569 | 569 | ||
| 570 | /* | ||
| 571 | * don't do anything if file is about to be | ||
| 572 | * closed anyway. | ||
| 573 | */ | ||
| 574 | if (netfile->closePend) { | ||
| 575 | read_unlock(&GlobalSMBSeslock); | ||
| 576 | read_unlock(&cifs_tcp_ses_lock); | ||
| 577 | return true; | ||
| 578 | } | ||
| 579 | |||
| 580 | cFYI(1, "file id match, oplock break"); | 570 | cFYI(1, "file id match, oplock break"); |
| 581 | pCifsInode = CIFS_I(netfile->pInode); | 571 | pCifsInode = CIFS_I(netfile->dentry->d_inode); |
| 582 | pCifsInode->clientCanCacheAll = false; | 572 | pCifsInode->clientCanCacheAll = false; |
| 583 | if (pSMB->OplockLevel == 0) | 573 | if (pSMB->OplockLevel == 0) |
| 584 | pCifsInode->clientCanCacheRead = false; | 574 | pCifsInode->clientCanCacheRead = false; |
| @@ -594,17 +584,17 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv) | |||
| 594 | cifs_oplock_break_get(netfile); | 584 | cifs_oplock_break_get(netfile); |
| 595 | netfile->oplock_break_cancelled = false; | 585 | netfile->oplock_break_cancelled = false; |
| 596 | 586 | ||
| 597 | read_unlock(&GlobalSMBSeslock); | 587 | spin_unlock(&cifs_file_list_lock); |
| 598 | read_unlock(&cifs_tcp_ses_lock); | 588 | spin_unlock(&cifs_tcp_ses_lock); |
| 599 | return true; | 589 | return true; |
| 600 | } | 590 | } |
| 601 | read_unlock(&GlobalSMBSeslock); | 591 | spin_unlock(&cifs_file_list_lock); |
| 602 | read_unlock(&cifs_tcp_ses_lock); | 592 | spin_unlock(&cifs_tcp_ses_lock); |
| 603 | cFYI(1, "No matching file for oplock break"); | 593 | cFYI(1, "No matching file for oplock break"); |
| 604 | return true; | 594 | return true; |
| 605 | } | 595 | } |
| 606 | } | 596 | } |
| 607 | read_unlock(&cifs_tcp_ses_lock); | 597 | spin_unlock(&cifs_tcp_ses_lock); |
| 608 | cFYI(1, "Can not process oplock break for non-existent connection"); | 598 | cFYI(1, "Can not process oplock break for non-existent connection"); |
| 609 | return true; | 599 | return true; |
| 610 | } | 600 | } |
| @@ -729,6 +719,6 @@ cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb) | |||
| 729 | "properly. Hardlinks will not be recognized on this " | 719 | "properly. Hardlinks will not be recognized on this " |
| 730 | "mount. Consider mounting with the \"noserverino\" " | 720 | "mount. Consider mounting with the \"noserverino\" " |
| 731 | "option to silence this message.", | 721 | "option to silence this message.", |
| 732 | cifs_sb->tcon->treeName); | 722 | cifs_sb_master_tcon(cifs_sb)->treeName); |
| 733 | } | 723 | } |
| 734 | } | 724 | } |
