diff options
author | Steve French <smfrench@austin.rr.com> | 2005-04-29 01:41:10 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-29 01:41:10 -0400 |
commit | cd63499cbe37e53e6cc084c8a35d911a4613c797 (patch) | |
tree | 5f365aa9daaf89a9890c53dc681474a7fd292e45 | |
parent | 275cde1a1f3880601509c851d72c82bb8d3ee67c (diff) |
[PATCH] cifs: Handle case of multiple trans2 responses for one SMB request (part 2 of 2)
Signed-off-by: Steve French (sfrench@us.ibm.com)
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | fs/cifs/CHANGES | 2 | ||||
-rw-r--r-- | fs/cifs/cifssmb.c | 22 | ||||
-rw-r--r-- | fs/cifs/connect.c | 19 |
3 files changed, 23 insertions, 20 deletions
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 0414eb325468..3d61d96d7407 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -4,6 +4,8 @@ Fix caching problem, in which readdir of directory containing a file | |||
4 | which was cached could cause the file's time stamp to be updated | 4 | which was cached could cause the file's time stamp to be updated |
5 | without invalidating the readahead data (so we could get stale | 5 | without invalidating the readahead data (so we could get stale |
6 | file data on the client for that file even as the server copy changed). | 6 | file data on the client for that file even as the server copy changed). |
7 | Cleanup response processing so cifsd can not loop when abnormally | ||
8 | terminated. | ||
7 | 9 | ||
8 | 10 | ||
9 | Version 1.32 | 11 | Version 1.32 |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index a6e66974b286..f8edf816b4be 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -470,7 +470,7 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon) | |||
470 | return rc; | 470 | return rc; |
471 | } else { | 471 | } else { |
472 | smb_buffer_response = smb_buffer; /* BB removeme BB */ | 472 | smb_buffer_response = smb_buffer; /* BB removeme BB */ |
473 | } | 473 | } |
474 | rc = SendReceive(xid, tcon->ses, smb_buffer, smb_buffer_response, | 474 | rc = SendReceive(xid, tcon->ses, smb_buffer, smb_buffer_response, |
475 | &length, 0); | 475 | &length, 0); |
476 | if (rc) | 476 | if (rc) |
@@ -2517,9 +2517,6 @@ findFirstRetry: | |||
2517 | psrch_inf->srch_entries_start = | 2517 | psrch_inf->srch_entries_start = |
2518 | (char *) &pSMBr->hdr.Protocol + | 2518 | (char *) &pSMBr->hdr.Protocol + |
2519 | le16_to_cpu(pSMBr->t2.DataOffset); | 2519 | le16_to_cpu(pSMBr->t2.DataOffset); |
2520 | /* if(le16_to_cpu(pSMBr->t2.DataCount) != le16_to_cpu(pSMBr->t2.TotalDataCount)) { | ||
2521 | cERROR(1,("DC: %d TDC: %d",pSMBr->t2.DataCount,pSMBr->t2.TotalDataCount)); | ||
2522 | } */ /* BB removeme BB */ | ||
2523 | parms = (T2_FFIRST_RSP_PARMS *)((char *) &pSMBr->hdr.Protocol + | 2520 | parms = (T2_FFIRST_RSP_PARMS *)((char *) &pSMBr->hdr.Protocol + |
2524 | le16_to_cpu(pSMBr->t2.ParameterOffset)); | 2521 | le16_to_cpu(pSMBr->t2.ParameterOffset)); |
2525 | 2522 | ||
@@ -2531,7 +2528,6 @@ findFirstRetry: | |||
2531 | psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); | 2528 | psrch_inf->entries_in_buffer = le16_to_cpu(parms->SearchCount); |
2532 | psrch_inf->index_of_last_entry = | 2529 | psrch_inf->index_of_last_entry = |
2533 | psrch_inf->entries_in_buffer; | 2530 | psrch_inf->entries_in_buffer; |
2534 | /*cFYI(1,("entries in buf %d index_of_last %d",psrch_inf->entries_in_buffer,psrch_inf->index_of_last_entry)); */ /* BB removeme BB */ | ||
2535 | *pnetfid = parms->SearchHandle; | 2531 | *pnetfid = parms->SearchHandle; |
2536 | } else { | 2532 | } else { |
2537 | cifs_buf_release(pSMB); | 2533 | cifs_buf_release(pSMB); |
@@ -3451,11 +3447,13 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size, | |||
3451 | 3447 | ||
3452 | cFYI(1, ("SetFileSize (via SetFileInfo) %lld", | 3448 | cFYI(1, ("SetFileSize (via SetFileInfo) %lld", |
3453 | (long long)size)); | 3449 | (long long)size)); |
3454 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 3450 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); |
3455 | (void **) &pSMBr); | 3451 | |
3456 | if (rc) | 3452 | if (rc) |
3457 | return rc; | 3453 | return rc; |
3458 | 3454 | ||
3455 | pSMBr = (struct smb_com_transaction2_sfi_rsp *)pSMB; | ||
3456 | |||
3459 | pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); | 3457 | pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener); |
3460 | pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); | 3458 | pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16)); |
3461 | 3459 | ||
@@ -3515,7 +3513,7 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size, | |||
3515 | } | 3513 | } |
3516 | 3514 | ||
3517 | if (pSMB) | 3515 | if (pSMB) |
3518 | cifs_buf_release(pSMB); | 3516 | cifs_small_buf_release(pSMB); |
3519 | 3517 | ||
3520 | /* Note: On -EAGAIN error only caller can retry on handle based calls | 3518 | /* Note: On -EAGAIN error only caller can retry on handle based calls |
3521 | since file handle passed in no longer valid */ | 3519 | since file handle passed in no longer valid */ |
@@ -3541,11 +3539,13 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I | |||
3541 | __u16 params, param_offset, offset, byte_count, count; | 3539 | __u16 params, param_offset, offset, byte_count, count; |
3542 | 3540 | ||
3543 | cFYI(1, ("Set Times (via SetFileInfo)")); | 3541 | cFYI(1, ("Set Times (via SetFileInfo)")); |
3544 | rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB, | 3542 | rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB); |
3545 | (void **) &pSMBr); | 3543 | |
3546 | if (rc) | 3544 | if (rc) |
3547 | return rc; | 3545 | return rc; |
3548 | 3546 | ||
3547 | pSMBr = (struct smb_com_transaction2_sfi_rsp *)pSMB; | ||
3548 | |||
3549 | /* At this point there is no need to override the current pid | 3549 | /* At this point there is no need to override the current pid |
3550 | with the pid of the opener, but that could change if we someday | 3550 | with the pid of the opener, but that could change if we someday |
3551 | use an existing handle (rather than opening one on the fly) */ | 3551 | use an existing handle (rather than opening one on the fly) */ |
@@ -3591,7 +3591,7 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I | |||
3591 | cFYI(1,("Send error in Set Time (SetFileInfo) = %d",rc)); | 3591 | cFYI(1,("Send error in Set Time (SetFileInfo) = %d",rc)); |
3592 | } | 3592 | } |
3593 | 3593 | ||
3594 | cifs_buf_release(pSMB); | 3594 | cifs_small_buf_release(pSMB); |
3595 | 3595 | ||
3596 | /* Note: On -EAGAIN error only caller can retry on handle based calls | 3596 | /* Note: On -EAGAIN error only caller can retry on handle based calls |
3597 | since file handle passed in no longer valid */ | 3597 | since file handle passed in no longer valid */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index a8d592bc33fe..e3b177a90b37 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -544,15 +544,13 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) | |||
544 | if ((mid_entry->mid == smb_buffer->Mid) && | 544 | if ((mid_entry->mid == smb_buffer->Mid) && |
545 | (mid_entry->midState == MID_REQUEST_SUBMITTED) && | 545 | (mid_entry->midState == MID_REQUEST_SUBMITTED) && |
546 | (mid_entry->command == smb_buffer->Command)) { | 546 | (mid_entry->command == smb_buffer->Command)) { |
547 | cFYI(1,("Found Mid 0x%x wake", mid_entry->mid)); | ||
548 | |||
549 | if(check2ndT2(smb_buffer,server->maxBuf) > 0) { | 547 | if(check2ndT2(smb_buffer,server->maxBuf) > 0) { |
550 | /* We have a multipart transact2 resp */ | 548 | /* We have a multipart transact2 resp */ |
549 | isMultiRsp = TRUE; | ||
551 | if(mid_entry->resp_buf) { | 550 | if(mid_entry->resp_buf) { |
552 | /* merge response - fix up 1st*/ | 551 | /* merge response - fix up 1st*/ |
553 | if(coalesce_t2(smb_buffer, | 552 | if(coalesce_t2(smb_buffer, |
554 | mid_entry->resp_buf)) { | 553 | mid_entry->resp_buf)) { |
555 | isMultiRsp = TRUE; | ||
556 | break; | 554 | break; |
557 | } else { | 555 | } else { |
558 | /* all parts received */ | 556 | /* all parts received */ |
@@ -564,10 +562,10 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) | |||
564 | /* BB maybe we can fix this up, switch | 562 | /* BB maybe we can fix this up, switch |
565 | to already allocated large buffer? */ | 563 | to already allocated large buffer? */ |
566 | } else { | 564 | } else { |
565 | /* Have first buffer */ | ||
567 | mid_entry->resp_buf = | 566 | mid_entry->resp_buf = |
568 | smb_buffer; | 567 | smb_buffer; |
569 | mid_entry->largeBuf = 1; | 568 | mid_entry->largeBuf = 1; |
570 | isMultiRsp = TRUE; | ||
571 | bigbuf = NULL; | 569 | bigbuf = NULL; |
572 | } | 570 | } |
573 | } | 571 | } |
@@ -586,11 +584,14 @@ multi_t2_fnd: | |||
586 | } | 584 | } |
587 | spin_unlock(&GlobalMid_Lock); | 585 | spin_unlock(&GlobalMid_Lock); |
588 | if (task_to_wake) { | 586 | if (task_to_wake) { |
589 | if(isLargeBuf) | 587 | /* Was previous buf put in mpx struct for multi-rsp? */ |
590 | bigbuf = NULL; | 588 | if(!isMultiRsp) { |
591 | else | 589 | /* smb buffer will be freed by user thread */ |
592 | smallbuf = NULL; | 590 | if(isLargeBuf) { |
593 | /* smb buffer freed by user thread when done */ | 591 | bigbuf = NULL; |
592 | } else | ||
593 | smallbuf = NULL; | ||
594 | } | ||
594 | wake_up_process(task_to_wake); | 595 | wake_up_process(task_to_wake); |
595 | } else if ((is_valid_oplock_break(smb_buffer) == FALSE) | 596 | } else if ((is_valid_oplock_break(smb_buffer) == FALSE) |
596 | && (isMultiRsp == FALSE)) { | 597 | && (isMultiRsp == FALSE)) { |