mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-28 17:41:50 +00:00
[PATCH] cifs: Do not interpret oplock break responses as responses to an unrelated command
.. even if the multiplex ids match. Signed-off-by: Steve French (sfrench@us.ibm.com) Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
d0724714fd
commit
848f3fce45
5 changed files with 16 additions and 6 deletions
|
@ -10,6 +10,8 @@ different users from the same client to the same server. Fix oops in
|
||||||
cifs_close. Add mount option for remapping reserved characters in
|
cifs_close. Add mount option for remapping reserved characters in
|
||||||
filenames (also allow recognizing files with created by SFU which have any
|
filenames (also allow recognizing files with created by SFU which have any
|
||||||
of these seven reserved characters, except backslash, to be recognized).
|
of these seven reserved characters, except backslash, to be recognized).
|
||||||
|
Fix invalid transact2 message (we were sometimes trying to interpret
|
||||||
|
oplock breaks as SMB responses).
|
||||||
|
|
||||||
Version 1.31
|
Version 1.31
|
||||||
------------
|
------------
|
||||||
|
|
|
@ -111,7 +111,12 @@ cifs_debug_data_read(char *buf, char **beginBuffer, off_t offset,
|
||||||
mid_q_entry,
|
mid_q_entry,
|
||||||
qhead);
|
qhead);
|
||||||
if(mid_entry) {
|
if(mid_entry) {
|
||||||
length = sprintf(buf,"State: %d com: %d pid: %d tsk: %p mid %d\n",mid_entry->midState,mid_entry->command,mid_entry->pid,mid_entry->tsk,mid_entry->mid);
|
length = sprintf(buf,"State: %d com: %d pid: %d tsk: %p mid %d\n",
|
||||||
|
mid_entry->midState,
|
||||||
|
(int)mid_entry->command,
|
||||||
|
mid_entry->pid,
|
||||||
|
mid_entry->tsk,
|
||||||
|
mid_entry->mid);
|
||||||
buf += length;
|
buf += length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -313,12 +313,12 @@ struct mid_q_entry {
|
||||||
__u16 mid; /* multiplex id */
|
__u16 mid; /* multiplex id */
|
||||||
__u16 pid; /* process id */
|
__u16 pid; /* process id */
|
||||||
__u32 sequence_number; /* for CIFS signing */
|
__u32 sequence_number; /* for CIFS signing */
|
||||||
__u16 command; /* smb command code */
|
|
||||||
struct timeval when_sent; /* time when smb sent */
|
struct timeval when_sent; /* time when smb sent */
|
||||||
struct cifsSesInfo *ses; /* smb was sent to this server */
|
struct cifsSesInfo *ses; /* smb was sent to this server */
|
||||||
struct task_struct *tsk; /* task waiting for response */
|
struct task_struct *tsk; /* task waiting for response */
|
||||||
struct smb_hdr *resp_buf; /* response buffer */
|
struct smb_hdr *resp_buf; /* response buffer */
|
||||||
int midState; /* wish this were enum but can not pass to wait_event */
|
int midState; /* wish this were enum but can not pass to wait_event */
|
||||||
|
__u8 command; /* smb command code */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct oplock_q_entry {
|
struct oplock_q_entry {
|
||||||
|
|
|
@ -361,9 +361,13 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
|
||||||
mid_q_entry,
|
mid_q_entry,
|
||||||
qhead);
|
qhead);
|
||||||
|
|
||||||
if ((mid_entry->mid == smb_buffer->Mid) && (mid_entry->midState == MID_REQUEST_SUBMITTED)) {
|
if ((mid_entry->mid == smb_buffer->Mid)
|
||||||
cFYI(1,
|
&& (mid_entry->midState ==
|
||||||
(" Mid 0x%x matched - waking up ",mid_entry->mid));
|
MID_REQUEST_SUBMITTED)
|
||||||
|
&& (mid_entry->command ==
|
||||||
|
smb_buffer->Command)) {
|
||||||
|
cFYI(1,("Found Mid 0x%x wake up"
|
||||||
|
,mid_entry->mid));
|
||||||
task_to_wake = mid_entry->tsk;
|
task_to_wake = mid_entry->tsk;
|
||||||
mid_entry->resp_buf =
|
mid_entry->resp_buf =
|
||||||
smb_buffer;
|
smb_buffer;
|
||||||
|
|
|
@ -189,7 +189,6 @@ smb_sendv(struct socket *ssocket, struct smb_hdr *smb_buffer,
|
||||||
struct msghdr smb_msg;
|
struct msghdr smb_msg;
|
||||||
number_of_pages += 1; /* account for SMB header */
|
number_of_pages += 1; /* account for SMB header */
|
||||||
struct kvec * piov = kmalloc(number_of_pages * sizeof(struct kvec));
|
struct kvec * piov = kmalloc(number_of_pages * sizeof(struct kvec));
|
||||||
if(i=0;i<num_pages-1;i++
|
|
||||||
unsigned len = smb_buf_length + 4;
|
unsigned len = smb_buf_length + 4;
|
||||||
|
|
||||||
if(ssocket == NULL)
|
if(ssocket == NULL)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue