aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/cifs/connect.c36
1 files changed, 16 insertions, 20 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 0f69b311d3fc..8d5a61561909 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -576,8 +576,7 @@ dequeue_mid(struct mid_q_entry *mid, int malformed)
576 576
577static struct mid_q_entry * 577static struct mid_q_entry *
578find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf, 578find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
579 int *malformed, bool is_large_buf, bool *is_multi_rsp, 579 int malformed, bool is_large_buf, char **bigbuf)
580 char **bigbuf)
581{ 580{
582 struct mid_q_entry *mid = NULL; 581 struct mid_q_entry *mid = NULL;
583 582
@@ -585,17 +584,14 @@ find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
585 if (!mid) 584 if (!mid)
586 return mid; 585 return mid;
587 586
588 if (*malformed == 0 && check2ndT2(buf) > 0) { 587 if (malformed == 0 && check2ndT2(buf) > 0) {
589 /* We have a multipart transact2 resp */ 588 mid->multiRsp = true;
590 *is_multi_rsp = true;
591 if (mid->resp_buf) { 589 if (mid->resp_buf) {
592 /* merge response - fix up 1st*/ 590 /* merge response - fix up 1st*/
593 *malformed = coalesce_t2(buf, mid->resp_buf); 591 malformed = coalesce_t2(buf, mid->resp_buf);
594 if (*malformed > 0) { 592 if (malformed > 0)
595 *malformed = 0; 593 return mid;
596 mid->multiRsp = true; 594
597 return NULL;
598 }
599 /* All parts received or packet is malformed. */ 595 /* All parts received or packet is malformed. */
600 mid->multiEnd = true; 596 mid->multiEnd = true;
601 goto multi_t2_fnd; 597 goto multi_t2_fnd;
@@ -614,7 +610,7 @@ find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
614 mid->resp_buf = buf; 610 mid->resp_buf = buf;
615 mid->largeBuf = is_large_buf; 611 mid->largeBuf = is_large_buf;
616multi_t2_fnd: 612multi_t2_fnd:
617 dequeue_mid(mid, *malformed); 613 dequeue_mid(mid, malformed);
618 return mid; 614 return mid;
619} 615}
620 616
@@ -725,7 +721,6 @@ cifs_demultiplex_thread(void *p)
725 struct task_struct *task_to_wake = NULL; 721 struct task_struct *task_to_wake = NULL;
726 struct mid_q_entry *mid_entry; 722 struct mid_q_entry *mid_entry;
727 bool isLargeBuf = false; 723 bool isLargeBuf = false;
728 bool isMultiRsp = false;
729 724
730 current->flags |= PF_MEMALLOC; 725 current->flags |= PF_MEMALLOC;
731 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current)); 726 cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
@@ -745,7 +740,6 @@ cifs_demultiplex_thread(void *p)
745 continue; 740 continue;
746 741
747 isLargeBuf = false; 742 isLargeBuf = false;
748 isMultiRsp = false;
749 smb_buffer = (struct smb_hdr *)smallbuf; 743 smb_buffer = (struct smb_hdr *)smallbuf;
750 buf = smallbuf; 744 buf = smallbuf;
751 pdu_length = 4; /* enough to get RFC1001 header */ 745 pdu_length = 4; /* enough to get RFC1001 header */
@@ -823,23 +817,25 @@ cifs_demultiplex_thread(void *p)
823 817
824 server->lstrp = jiffies; 818 server->lstrp = jiffies;
825 819
826 mid_entry = find_cifs_mid(server, smb_buffer, &length, 820 mid_entry = find_cifs_mid(server, smb_buffer, length,
827 isLargeBuf, &isMultiRsp, &bigbuf); 821 isLargeBuf, &bigbuf);
828 if (mid_entry != NULL) { 822 if (mid_entry != NULL) {
829 mid_entry->callback(mid_entry); 823 if (mid_entry->multiRsp && !mid_entry->multiEnd)
824 continue;
825
830 /* Was previous buf put in mpx struct for multi-rsp? */ 826 /* Was previous buf put in mpx struct for multi-rsp? */
831 if (!isMultiRsp) { 827 if (!mid_entry->multiRsp) {
832 /* smb buffer will be freed by user thread */ 828 /* smb buffer will be freed by user thread */
833 if (isLargeBuf) 829 if (isLargeBuf)
834 bigbuf = NULL; 830 bigbuf = NULL;
835 else 831 else
836 smallbuf = NULL; 832 smallbuf = NULL;
837 } 833 }
834 mid_entry->callback(mid_entry);
838 } else if (length != 0) { 835 } else if (length != 0) {
839 /* response sanity checks failed */ 836 /* response sanity checks failed */
840 continue; 837 continue;
841 } else if (!is_valid_oplock_break(smb_buffer, server) && 838 } else if (!is_valid_oplock_break(smb_buffer, server)) {
842 !isMultiRsp) {
843 cERROR(1, "No task to wake, unknown frame received! " 839 cERROR(1, "No task to wake, unknown frame received! "
844 "NumMids %d", atomic_read(&midCount)); 840 "NumMids %d", atomic_read(&midCount));
845 cifs_dump_mem("Received Data is: ", buf, 841 cifs_dump_mem("Received Data is: ", buf,