summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 0f69b311d3f..8d5a6156190 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -576,8 +576,7 @@ dequeue_mid(struct mid_q_entry *mid, int malformed)
static struct mid_q_entry *
find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
- int *malformed, bool is_large_buf, bool *is_multi_rsp,
- char **bigbuf)
+ int malformed, bool is_large_buf, char **bigbuf)
{
struct mid_q_entry *mid = NULL;
@@ -585,17 +584,14 @@ find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
if (!mid)
return mid;
- if (*malformed == 0 && check2ndT2(buf) > 0) {
- /* We have a multipart transact2 resp */
- *is_multi_rsp = true;
+ if (malformed == 0 && check2ndT2(buf) > 0) {
+ mid->multiRsp = true;
if (mid->resp_buf) {
/* merge response - fix up 1st*/
- *malformed = coalesce_t2(buf, mid->resp_buf);
- if (*malformed > 0) {
- *malformed = 0;
- mid->multiRsp = true;
- return NULL;
- }
+ malformed = coalesce_t2(buf, mid->resp_buf);
+ if (malformed > 0)
+ return mid;
+
/* All parts received or packet is malformed. */
mid->multiEnd = true;
goto multi_t2_fnd;
@@ -614,7 +610,7 @@ find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
mid->resp_buf = buf;
mid->largeBuf = is_large_buf;
multi_t2_fnd:
- dequeue_mid(mid, *malformed);
+ dequeue_mid(mid, malformed);
return mid;
}
@@ -725,7 +721,6 @@ cifs_demultiplex_thread(void *p)
struct task_struct *task_to_wake = NULL;
struct mid_q_entry *mid_entry;
bool isLargeBuf = false;
- bool isMultiRsp = false;
current->flags |= PF_MEMALLOC;
cFYI(1, "Demultiplex PID: %d", task_pid_nr(current));
@@ -745,7 +740,6 @@ cifs_demultiplex_thread(void *p)
continue;
isLargeBuf = false;
- isMultiRsp = false;
smb_buffer = (struct smb_hdr *)smallbuf;
buf = smallbuf;
pdu_length = 4; /* enough to get RFC1001 header */
@@ -823,23 +817,25 @@ cifs_demultiplex_thread(void *p)
server->lstrp = jiffies;
- mid_entry = find_cifs_mid(server, smb_buffer, &length,
- isLargeBuf, &isMultiRsp, &bigbuf);
+ mid_entry = find_cifs_mid(server, smb_buffer, length,
+ isLargeBuf, &bigbuf);
if (mid_entry != NULL) {
- mid_entry->callback(mid_entry);
+ if (mid_entry->multiRsp && !mid_entry->multiEnd)
+ continue;
+
/* Was previous buf put in mpx struct for multi-rsp? */
- if (!isMultiRsp) {
+ if (!mid_entry->multiRsp) {
/* smb buffer will be freed by user thread */
if (isLargeBuf)
bigbuf = NULL;
else
smallbuf = NULL;
}
+ mid_entry->callback(mid_entry);
} else if (length != 0) {
/* response sanity checks failed */
continue;
- } else if (!is_valid_oplock_break(smb_buffer, server) &&
- !isMultiRsp) {
+ } else if (!is_valid_oplock_break(smb_buffer, server)) {
cERROR(1, "No task to wake, unknown frame received! "
"NumMids %d", atomic_read(&midCount));
cifs_dump_mem("Received Data is: ", buf,