2011/8/29 Jeff Layton <jlayton@xxxxxxxxxx>: > Change find_cifs_mid to only return NULL if a mid could not be found. > If we got part of a multi-part T2 response, then coalesce it and still > return the mid. The caller can determine the T2 receive status from > the flags in the mid. > > With this change, there is no need to pass a pointer to "length" as > well so just pass by value. If a mid is found, then we can just mark > it as malformed. If one isn't found, then the value of "length" won't > change anyway. > > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > fs/cifs/connect.c | 35 ++++++++++++++++------------------- > 1 files changed, 16 insertions(+), 19 deletions(-) > > diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c > index 6b4fcb3..9518457 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,16 +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) { > + malformed = 0; ^^^^ this is unnecessary because we return from the function as the next step. > + return mid; > } > /* All parts received or packet is malformed. */ > mid->multiEnd = true; > @@ -614,7 +611,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 +722,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 +741,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 +818,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, > -- > 1.7.6 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Best regards, Pavel Shilovsky. -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html