@@ -850,13 +850,14 @@ cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
850850static int
851851cifs_demultiplex_thread (void * p )
852852{
853- int length ;
853+ int i , num_mids , length ;
854854 struct TCP_Server_Info * server = p ;
855855 unsigned int pdu_length ;
856856 unsigned int next_offset ;
857857 char * buf = NULL ;
858858 struct task_struct * task_to_wake = NULL ;
859- struct mid_q_entry * mid_entry ;
859+ struct mid_q_entry * mids [MAX_COMPOUND ];
860+ char * bufs [MAX_COMPOUND ];
860861
861862 current -> flags |= PF_MEMALLOC ;
862863 cifs_dbg (FYI , "Demultiplex PID: %d\n" , task_pid_nr (current ));
@@ -923,58 +924,75 @@ cifs_demultiplex_thread(void *p)
923924 server -> pdu_size = next_offset ;
924925 }
925926
926- mid_entry = NULL ;
927+ memset (mids , 0 , sizeof (mids ));
928+ memset (bufs , 0 , sizeof (bufs ));
929+ num_mids = 0 ;
930+
927931 if (server -> ops -> is_transform_hdr &&
928932 server -> ops -> receive_transform &&
929933 server -> ops -> is_transform_hdr (buf )) {
930934 length = server -> ops -> receive_transform (server ,
931- & mid_entry );
935+ mids ,
936+ bufs ,
937+ & num_mids );
932938 } else {
933- mid_entry = server -> ops -> find_mid (server , buf );
939+ mids [0 ] = server -> ops -> find_mid (server , buf );
940+ bufs [0 ] = buf ;
941+ if (mids [0 ])
942+ num_mids = 1 ;
934943
935- if (!mid_entry || !mid_entry -> receive )
936- length = standard_receive3 (server , mid_entry );
944+ if (!mids [ 0 ] || !mids [ 0 ] -> receive )
945+ length = standard_receive3 (server , mids [ 0 ] );
937946 else
938- length = mid_entry -> receive (server , mid_entry );
947+ length = mids [ 0 ] -> receive (server , mids [ 0 ] );
939948 }
940949
941950 if (length < 0 ) {
942- if (mid_entry )
943- cifs_mid_q_entry_release (mid_entry );
951+ for (i = 0 ; i < num_mids ; i ++ )
952+ if (mids [i ])
953+ cifs_mid_q_entry_release (mids [i ]);
944954 continue ;
945955 }
946956
947957 if (server -> large_buf )
948958 buf = server -> bigbuf ;
949959
960+
950961 server -> lstrp = jiffies ;
951- if (mid_entry != NULL ) {
952- mid_entry -> resp_buf_size = server -> pdu_size ;
953- if ((mid_entry -> mid_flags & MID_WAIT_CANCELLED ) &&
954- mid_entry -> mid_state == MID_RESPONSE_RECEIVED &&
955- server -> ops -> handle_cancelled_mid )
956- server -> ops -> handle_cancelled_mid (
957- mid_entry -> resp_buf ,
958- server );
959962
960- if (!mid_entry -> multiRsp || mid_entry -> multiEnd )
961- mid_entry -> callback (mid_entry );
963+ for (i = 0 ; i < num_mids ; i ++ ) {
964+ if (mids [i ] != NULL ) {
965+ mids [i ]-> resp_buf_size = server -> pdu_size ;
966+ if ((mids [i ]-> mid_flags & MID_WAIT_CANCELLED ) &&
967+ mids [i ]-> mid_state == MID_RESPONSE_RECEIVED &&
968+ server -> ops -> handle_cancelled_mid )
969+ server -> ops -> handle_cancelled_mid (
970+ mids [i ]-> resp_buf ,
971+ server );
962972
963- cifs_mid_q_entry_release (mid_entry );
964- } else if (server -> ops -> is_oplock_break &&
965- server -> ops -> is_oplock_break (buf , server )) {
966- cifs_dbg (FYI , "Received oplock break\n" );
967- } else {
968- cifs_dbg (VFS , "No task to wake, unknown frame received! NumMids %d\n" ,
969- atomic_read (& midCount ));
970- cifs_dump_mem ("Received Data is: " , buf ,
971- HEADER_SIZE (server ));
973+ if (!mids [i ]-> multiRsp || mids [i ]-> multiEnd )
974+ mids [i ]-> callback (mids [i ]);
975+
976+ cifs_mid_q_entry_release (mids [i ]);
977+ } else if (server -> ops -> is_oplock_break &&
978+ server -> ops -> is_oplock_break (bufs [i ],
979+ server )) {
980+ cifs_dbg (FYI , "Received oplock break\n" );
981+ } else {
982+ cifs_dbg (VFS , "No task to wake, unknown frame "
983+ "received! NumMids %d\n" ,
984+ atomic_read (& midCount ));
985+ cifs_dump_mem ("Received Data is: " , bufs [i ],
986+ HEADER_SIZE (server ));
972987#ifdef CONFIG_CIFS_DEBUG2
973- if (server -> ops -> dump_detail )
974- server -> ops -> dump_detail (buf , server );
975- cifs_dump_mids (server );
988+ if (server -> ops -> dump_detail )
989+ server -> ops -> dump_detail (bufs [i ],
990+ server );
991+ cifs_dump_mids (server );
976992#endif /* CIFS_DEBUG2 */
993+ }
977994 }
995+
978996 if (pdu_length > server -> pdu_size ) {
979997 if (!allocate_buffers (server ))
980998 continue ;
0 commit comments