[PATCH] cifs: Handle case of multiple trans2 responses for one SMB request (part...
authorSteve French <smfrench@austin.rr.com>
Fri, 29 Apr 2005 05:41:10 +0000 (22:41 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 29 Apr 2005 05:41:10 +0000 (22:41 -0700)
Signed-off-by: Steve French (sfrench@us.ibm.com)
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/cifs/CHANGES
fs/cifs/cifssmb.c
fs/cifs/connect.c

index 0414eb325468076106ba93369a3b83fbc1fe38f1..3d61d96d740787e6b56a2709ca905c5a373fb50c 100644 (file)
@@ -4,6 +4,8 @@ Fix caching problem, in which readdir of directory containing a file
 which was cached could cause the file's time stamp to be updated
 without invalidating the readahead data (so we could get stale
 file data on the client for that file even as the server copy changed).
+Cleanup response processing so cifsd can not loop when abnormally
+terminated.
 
 
 Version 1.32
index a6e66974b2863135d298232cfb2973a7a9721658..f8edf816b4bed1de6a253cb45a553caea1af8276 100644 (file)
@@ -470,7 +470,7 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon)
                return rc;
        } else {
                smb_buffer_response = smb_buffer; /* BB removeme BB */
-    }
+       }
        rc = SendReceive(xid, tcon->ses, smb_buffer, smb_buffer_response,
                         &length, 0);
        if (rc)
@@ -2517,9 +2517,6 @@ findFirstRetry:
                        psrch_inf->srch_entries_start = 
                                (char *) &pSMBr->hdr.Protocol + 
                                        le16_to_cpu(pSMBr->t2.DataOffset);
-/* if(le16_to_cpu(pSMBr->t2.DataCount) != le16_to_cpu(pSMBr->t2.TotalDataCount)) {  
-       cERROR(1,("DC: %d TDC: %d",pSMBr->t2.DataCount,pSMBr->t2.TotalDataCount));
-} */ /* BB removeme BB */
                        parms = (T2_FFIRST_RSP_PARMS *)((char *) &pSMBr->hdr.Protocol +
                               le16_to_cpu(pSMBr->t2.ParameterOffset));
 
@@ -2531,7 +2528,6 @@ findFirstRetry:
                        psrch_inf->entries_in_buffer  = le16_to_cpu(parms->SearchCount);
                        psrch_inf->index_of_last_entry = 
                                psrch_inf->entries_in_buffer;
-/*cFYI(1,("entries in buf %d index_of_last %d",psrch_inf->entries_in_buffer,psrch_inf->index_of_last_entry));  */ /* BB removeme BB */
                        *pnetfid = parms->SearchHandle;
                } else {
                        cifs_buf_release(pSMB);
@@ -3451,11 +3447,13 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
 
        cFYI(1, ("SetFileSize (via SetFileInfo) %lld",
                        (long long)size));
-       rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB,
-                     (void **) &pSMBr);
+       rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB);
+
        if (rc)
                return rc;
 
+       pSMBr = (struct smb_com_transaction2_sfi_rsp *)pSMB;
+
        pSMB->hdr.Pid = cpu_to_le16((__u16)pid_of_opener);
        pSMB->hdr.PidHigh = cpu_to_le16((__u16)(pid_of_opener >> 16));
     
@@ -3515,7 +3513,7 @@ CIFSSMBSetFileSize(const int xid, struct cifsTconInfo *tcon, __u64 size,
        }
 
        if (pSMB)
-               cifs_buf_release(pSMB);
+               cifs_small_buf_release(pSMB);
 
        /* Note: On -EAGAIN error only caller can retry on handle based calls 
                since file handle passed in no longer valid */
@@ -3541,11 +3539,13 @@ CIFSSMBSetFileTimes(const int xid, struct cifsTconInfo *tcon, const FILE_BASIC_I
        __u16 params, param_offset, offset, byte_count, count;
 
        cFYI(1, ("Set Times (via SetFileInfo)"));
-       rc = smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB,
-                     (void **) &pSMBr);
+       rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB);
+
        if (rc)
                return rc;
 
+       pSMBr = (struct smb_com_transaction2_sfi_rsp *)pSMB;
+
        /* At this point there is no need to override the current pid
        with the pid of the opener, but that could change if we someday
        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
                cFYI(1,("Send error in Set Time (SetFileInfo) = %d",rc));
        }
 
-       cifs_buf_release(pSMB);
+       cifs_small_buf_release(pSMB);
 
        /* Note: On -EAGAIN error only caller can retry on handle based calls 
                since file handle passed in no longer valid */
index a8d592bc33fe25c8bef37ff9d16353a30fa26aa7..e3b177a90b37838c6d9c98461ce2446091e646ec 100644 (file)
@@ -544,15 +544,13 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
                        if ((mid_entry->mid == smb_buffer->Mid) && 
                            (mid_entry->midState == MID_REQUEST_SUBMITTED) &&
                            (mid_entry->command == smb_buffer->Command)) {
-                               cFYI(1,("Found Mid 0x%x wake", mid_entry->mid));
-                                       
                                if(check2ndT2(smb_buffer,server->maxBuf) > 0) {
                                        /* We have a multipart transact2 resp */
+                                       isMultiRsp = TRUE;
                                        if(mid_entry->resp_buf) {
                                                /* merge response - fix up 1st*/
                                                if(coalesce_t2(smb_buffer, 
                                                        mid_entry->resp_buf)) {
-                                                       isMultiRsp = TRUE;
                                                        break;
                                                } else {
                                                        /* all parts received */
@@ -564,10 +562,10 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
                                        /* BB maybe we can fix this up,  switch
                                           to already allocated large buffer? */
                                                } else {
+                                                       /* Have first buffer */
                                                        mid_entry->resp_buf =
                                                                 smb_buffer;
                                                        mid_entry->largeBuf = 1;
-                                                       isMultiRsp = TRUE;
                                                        bigbuf = NULL;
                                                }
                                        }
@@ -586,11 +584,14 @@ multi_t2_fnd:
                }
                spin_unlock(&GlobalMid_Lock);
                if (task_to_wake) {
-                       if(isLargeBuf)
-                               bigbuf = NULL;
-                       else
-                               smallbuf = NULL;
-                       /* smb buffer freed by user thread when done */
+                       /* Was previous buf put in mpx struct for multi-rsp? */
+                       if(!isMultiRsp) {
+                               /* smb buffer will be freed by user thread */
+                               if(isLargeBuf) {
+                                       bigbuf = NULL;
+                               } else
+                                       smallbuf = NULL;
+                       }
                        wake_up_process(task_to_wake);
                } else if ((is_valid_oplock_break(smb_buffer) == FALSE) 
                    && (isMultiRsp == FALSE)) {