2011/8/29 Jeff Layton <[email protected]>:
> 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 <[email protected]>
> ---
> 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 [email protected]
> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html