@@ -135,6 +135,7 @@ static __u32 get_neg_ctxt_len(struct smb2_hdr *hdr, __u32 len,
135135int
136136smb2_check_message (char * buf , unsigned int len , struct TCP_Server_Info * server )
137137{
138+ struct TCP_Server_Info * pserver ;
138139 struct smb2_hdr * shdr = (struct smb2_hdr * )buf ;
139140 struct smb2_pdu * pdu = (struct smb2_pdu * )shdr ;
140141 int hdr_size = sizeof (struct smb2_hdr );
@@ -143,6 +144,9 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *server)
143144 __u32 calc_len ; /* calculated length */
144145 __u64 mid ;
145146
147+ /* If server is a channel, select the primary channel */
148+ pserver = CIFS_SERVER_IS_CHAN (server ) ? server -> primary_server : server ;
149+
146150 /*
147151 * Add function to do table lookup of StructureSize by command
148152 * ie Validate the wct via smb2_struct_sizes table above
@@ -155,7 +159,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *server)
155159
156160 /* decrypt frame now that it is completely read in */
157161 spin_lock (& cifs_tcp_ses_lock );
158- list_for_each_entry (iter , & server -> smb_ses_list , smb_ses_list ) {
162+ list_for_each_entry (iter , & pserver -> smb_ses_list , smb_ses_list ) {
159163 if (iter -> Suid == le64_to_cpu (thdr -> SessionId )) {
160164 ses = iter ;
161165 break ;
@@ -608,51 +612,52 @@ smb2_tcon_find_pending_open_lease(struct cifs_tcon *tcon,
608612}
609613
610614static bool
611- smb2_is_valid_lease_break (char * buffer )
615+ smb2_is_valid_lease_break (char * buffer , struct TCP_Server_Info * server )
612616{
613617 struct smb2_lease_break * rsp = (struct smb2_lease_break * )buffer ;
614- struct TCP_Server_Info * server ;
618+ struct TCP_Server_Info * pserver ;
615619 struct cifs_ses * ses ;
616620 struct cifs_tcon * tcon ;
617621 struct cifs_pending_open * open ;
618622
619623 cifs_dbg (FYI , "Checking for lease break\n" );
620624
625+ /* If server is a channel, select the primary channel */
626+ pserver = CIFS_SERVER_IS_CHAN (server ) ? server -> primary_server : server ;
627+
621628 /* look up tcon based on tid & uid */
622629 spin_lock (& cifs_tcp_ses_lock );
623- list_for_each_entry (server , & cifs_tcp_ses_list , tcp_ses_list ) {
624- list_for_each_entry (ses , & server -> smb_ses_list , smb_ses_list ) {
625- list_for_each_entry (tcon , & ses -> tcon_list , tcon_list ) {
626- spin_lock (& tcon -> open_file_lock );
627- cifs_stats_inc (
628- & tcon -> stats .cifs_stats .num_oplock_brks );
629- if (smb2_tcon_has_lease (tcon , rsp )) {
630- spin_unlock (& tcon -> open_file_lock );
631- spin_unlock (& cifs_tcp_ses_lock );
632- return true;
633- }
634- open = smb2_tcon_find_pending_open_lease (tcon ,
635- rsp );
636- if (open ) {
637- __u8 lease_key [SMB2_LEASE_KEY_SIZE ];
638- struct tcon_link * tlink ;
639-
640- tlink = cifs_get_tlink (open -> tlink );
641- memcpy (lease_key , open -> lease_key ,
642- SMB2_LEASE_KEY_SIZE );
643- spin_unlock (& tcon -> open_file_lock );
644- spin_unlock (& cifs_tcp_ses_lock );
645- smb2_queue_pending_open_break (tlink ,
646- lease_key ,
647- rsp -> NewLeaseState );
648- return true;
649- }
630+ list_for_each_entry (ses , & pserver -> smb_ses_list , smb_ses_list ) {
631+ list_for_each_entry (tcon , & ses -> tcon_list , tcon_list ) {
632+ spin_lock (& tcon -> open_file_lock );
633+ cifs_stats_inc (
634+ & tcon -> stats .cifs_stats .num_oplock_brks );
635+ if (smb2_tcon_has_lease (tcon , rsp )) {
650636 spin_unlock (& tcon -> open_file_lock );
637+ spin_unlock (& cifs_tcp_ses_lock );
638+ return true;
639+ }
640+ open = smb2_tcon_find_pending_open_lease (tcon ,
641+ rsp );
642+ if (open ) {
643+ __u8 lease_key [SMB2_LEASE_KEY_SIZE ];
644+ struct tcon_link * tlink ;
645+
646+ tlink = cifs_get_tlink (open -> tlink );
647+ memcpy (lease_key , open -> lease_key ,
648+ SMB2_LEASE_KEY_SIZE );
649+ spin_unlock (& tcon -> open_file_lock );
650+ spin_unlock (& cifs_tcp_ses_lock );
651+ smb2_queue_pending_open_break (tlink ,
652+ lease_key ,
653+ rsp -> NewLeaseState );
654+ return true;
655+ }
656+ spin_unlock (& tcon -> open_file_lock );
651657
652- if (cached_dir_lease_break (tcon , rsp -> LeaseKey )) {
653- spin_unlock (& cifs_tcp_ses_lock );
654- return true;
655- }
658+ if (cached_dir_lease_break (tcon , rsp -> LeaseKey )) {
659+ spin_unlock (& cifs_tcp_ses_lock );
660+ return true;
656661 }
657662 }
658663 }
671676smb2_is_valid_oplock_break (char * buffer , struct TCP_Server_Info * server )
672677{
673678 struct smb2_oplock_break * rsp = (struct smb2_oplock_break * )buffer ;
679+ struct TCP_Server_Info * pserver ;
674680 struct cifs_ses * ses ;
675681 struct cifs_tcon * tcon ;
676682 struct cifsInodeInfo * cinode ;
@@ -684,16 +690,19 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
684690 if (rsp -> StructureSize !=
685691 smb2_rsp_struct_sizes [SMB2_OPLOCK_BREAK_HE ]) {
686692 if (le16_to_cpu (rsp -> StructureSize ) == 44 )
687- return smb2_is_valid_lease_break (buffer );
693+ return smb2_is_valid_lease_break (buffer , server );
688694 else
689695 return false;
690696 }
691697
692698 cifs_dbg (FYI , "oplock level 0x%x\n" , rsp -> OplockLevel );
693699
700+ /* If server is a channel, select the primary channel */
701+ pserver = CIFS_SERVER_IS_CHAN (server ) ? server -> primary_server : server ;
702+
694703 /* look up tcon based on tid & uid */
695704 spin_lock (& cifs_tcp_ses_lock );
696- list_for_each_entry (ses , & server -> smb_ses_list , smb_ses_list ) {
705+ list_for_each_entry (ses , & pserver -> smb_ses_list , smb_ses_list ) {
697706 list_for_each_entry (tcon , & ses -> tcon_list , tcon_list ) {
698707
699708 spin_lock (& tcon -> open_file_lock );
0 commit comments