Skip to content

Commit

Permalink
cifs: find mid earlier in receive codepath
Browse files Browse the repository at this point in the history
In order to receive directly into a preallocated buffer, we need to ID
the mid earlier, before the bulk of the response is read. Call the mid
finding routine as soon as we're able to read the mid.

Reviewed-and-Tested-by: Pavel Shilovsky <piastry@etersoft.ru>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
  • Loading branch information
Jeff Layton committed Oct 19, 2011
1 parent 2a37ef9 commit c8054eb
Showing 1 changed file with 9 additions and 15 deletions.
24 changes: 9 additions & 15 deletions fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -568,27 +568,21 @@ dequeue_mid(struct mid_q_entry *mid, int malformed)
spin_unlock(&GlobalMid_Lock);
}

static struct mid_q_entry *
find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
int malformed)
static void
handle_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server,
struct smb_hdr *buf, int malformed)
{
struct mid_q_entry *mid = NULL;

mid = find_mid(server, buf);
if (!mid)
return mid;

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)
return mid;
return;

/* All parts received or packet is malformed. */
mid->multiEnd = true;
goto multi_t2_fnd;
return dequeue_mid(mid, malformed);
}
if (!server->large_buf) {
/*FIXME: switch to already allocated largebuf?*/
Expand All @@ -599,7 +593,7 @@ find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
mid->largeBuf = true;
server->bigbuf = NULL;
}
return mid;
return;
}
mid->resp_buf = buf;
mid->largeBuf = server->large_buf;
Expand All @@ -611,9 +605,7 @@ find_cifs_mid(struct TCP_Server_Info *server, struct smb_hdr *buf,
else
server->smallbuf = NULL;
}
multi_t2_fnd:
dequeue_mid(mid, malformed);
return mid;
}

static void clean_demultiplex_info(struct TCP_Server_Info *server)
Expand Down Expand Up @@ -775,6 +767,8 @@ cifs_demultiplex_thread(void *p)
continue;
server->total_read += length;

mid_entry = find_mid(server, smb_buffer);

if (pdu_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
cERROR(1, "SMB response too long (%u bytes)",
pdu_length);
Expand Down Expand Up @@ -819,8 +813,8 @@ cifs_demultiplex_thread(void *p)

server->lstrp = jiffies;

mid_entry = find_cifs_mid(server, smb_buffer, length);
if (mid_entry != NULL) {
handle_mid(mid_entry, server, smb_buffer, length);
if (!mid_entry->multiRsp || mid_entry->multiEnd)
mid_entry->callback(mid_entry);
} else if (length != 0) {
Expand Down

0 comments on commit c8054eb

Please sign in to comment.