(ses->server->secMode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))) { rc = cifs_verify_signature(out_buf, ses->mac_signing_key,midQ->sequence_number); /* BB fix BB */ if(rc) cFYI(1,("Unexpected signature received from server")); 
(ses->server->secMode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))) { rc = cifs_verify_signature(out_buf, ses->server->mac_signing_key, midQ->sequence_number+1); if(rc) { cERROR(1,("Unexpected packet signature received from server")); /* BB FIXME - add code to kill session here */ } 
SendReceive(const unsigned int xid, struct cifsSesInfo *ses,	    struct smb_hdr *in_buf, struct smb_hdr *out_buf,	    int *pbytes_returned, const int long_op){	int rc = 0;	unsigned int receive_len;	unsigned long timeout;	struct mid_q_entry *midQ;	if (ses == NULL) {		cERROR(1,("Null smb session"));		return -EIO;	}	if(ses->server == NULL) {		cERROR(1,("Null tcp session"));		return -EIO;	}	/* Ensure that we do not send more than 50 overlapping requests 	   to the same server. We may make this configurable later or	   use ses->maxReq */	if(long_op == -1) {		/* oplock breaks must not be held up */		atomic_inc(&ses->server->inFlight);	} else {		spin_lock(&GlobalMid_Lock); 		while(1) {        			if(atomic_read(&ses->server->inFlight) >= cifs_max_pending){				spin_unlock(&GlobalMid_Lock);				wait_event(ses->server->request_q,					atomic_read(&ses->server->inFlight)					 < cifs_max_pending);				spin_lock(&GlobalMid_Lock);			} else {				if(ses->server->tcpStatus == CifsExiting) {					spin_unlock(&GlobalMid_Lock);					return -ENOENT;				}			/* can not count locking commands against total since			   they are allowed to block on server */									if(long_op < 3) {				/* update # of requests on the wire to server */					atomic_inc(&ses->server->inFlight);				}				spin_unlock(&GlobalMid_Lock);				break;			}		}	}	/* make sure that we sign in the same order that we send on this socket 	   and avoid races inside tcp sendmsg code that could cause corruption	   of smb data */	down(&ses->server->tcpSem); 	if (ses->server->tcpStatus == CifsExiting) {		rc = -ENOENT;		goto out_unlock;	} else if (ses->server->tcpStatus == CifsNeedReconnect) {		cFYI(1,("tcp session dead - return to caller to retry"));		rc = -EAGAIN;		goto out_unlock;	} else if (ses->status != CifsGood) {		/* check if SMB session is bad because we are setting it up */		if((in_buf->Command != SMB_COM_SESSION_SETUP_ANDX) && 			(in_buf->Command != SMB_COM_NEGOTIATE)) {			rc = -EAGAIN;			goto out_unlock;		} /* else ok - we are setting up session */	}	midQ = AllocMidQEntry(in_buf, ses);	if (midQ == NULL) {		up(&ses->server->tcpSem);		/* If not lock req, update # of requests on wire to server */		if(long_op < 3) {			atomic_dec(&ses->server->inFlight); 			wake_up(&ses->server->request_q);		}		return -ENOMEM;	}	if (in_buf->smb_buf_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {		up(&ses->server->tcpSem);		cERROR(1,		       ("Illegal length, greater than maximum frame, %d ",			in_buf->smb_buf_length));		DeleteMidQEntry(midQ);		/* If not lock req, update # of requests on wire to server */		if(long_op < 3) {			atomic_dec(&ses->server->inFlight); 			wake_up(&ses->server->request_q);		}		return -EIO;	}	rc = cifs_sign_smb(in_buf, ses, &midQ->sequence_number);	midQ->midState = MID_REQUEST_SUBMITTED;	rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,		      (struct sockaddr *) &(ses->server->addr.sockAddr));	if(rc < 0) {		DeleteMidQEntry(midQ);		up(&ses->server->tcpSem);		/* If not lock req, update # of requests on wire to server */		if(long_op < 3) {			atomic_dec(&ses->server->inFlight); 			wake_up(&ses->server->request_q);		}		return rc;	} else		up(&ses->server->tcpSem);	if (long_op == -1)		goto cifs_no_response_exit;	else if (long_op == 2) /* writes past end of file can take looooong time */		timeout = 300 * HZ;	else if (long_op == 1)		timeout = 45 * HZ; /* should be greater than 			servers oplock break timeout (about 43 seconds) */	else if (long_op > 2) {		timeout = MAX_SCHEDULE_TIMEOUT;	} else		timeout = 15 * HZ;	/* wait for 15 seconds or until woken up due to response arriving or 	   due to last connection to this server being unmounted */	if (signal_pending(current)) {		/* if signal pending do not hold up user for full smb timeout		but we still give response a change to complete */		timeout = 2 * HZ;	}   	/* No user interrupts in wait - wreaks havoc with performance */	if(timeout != MAX_SCHEDULE_TIMEOUT) {		timeout += jiffies;		wait_event(ses->server->response_q,			(!(midQ->midState & MID_REQUEST_SUBMITTED)) || 			time_after(jiffies, timeout) || 			((ses->server->tcpStatus != CifsGood) &&			 (ses->server->tcpStatus != CifsNew)));	} else {		wait_event(ses->server->response_q,			(!(midQ->midState & MID_REQUEST_SUBMITTED)) || 			((ses->server->tcpStatus != CifsGood) &&			 (ses->server->tcpStatus != CifsNew)));	}	spin_lock(&GlobalMid_Lock);	if (midQ->resp_buf) {		spin_unlock(&GlobalMid_Lock);		receive_len = be32_to_cpu(*(__be32 *)midQ->resp_buf);	} else {		cERROR(1,("No response buffer"));		if(midQ->midState == MID_REQUEST_SUBMITTED) {			if(ses->server->tcpStatus == CifsExiting)				rc = -EHOSTDOWN;			else {				ses->server->tcpStatus = CifsNeedReconnect;				midQ->midState = MID_RETRY_NEEDED;			}		}		if (rc != -EHOSTDOWN) {			if(midQ->midState == MID_RETRY_NEEDED) {				rc = -EAGAIN;				cFYI(1,("marking request for retry"));			} else {				rc = -EIO;			}		}		spin_unlock(&GlobalMid_Lock);		DeleteMidQEntry(midQ);		/* If not lock req, update # of requests on wire to server */		if(long_op < 3) {			atomic_dec(&ses->server->inFlight); 			wake_up(&ses->server->request_q);		}		return rc;	}  	if (receive_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE) {		cERROR(1,		       ("Frame too large received.  Length: %d  Xid: %d",			receive_len, xid));		rc = -EIO;	} else {		/* rcvd frame is ok */		if (midQ->resp_buf && out_buf		    && (midQ->midState == MID_RESPONSE_RECEIVED)) {			out_buf->smb_buf_length = receive_len;			memcpy((char *)out_buf + 4,			       (char *)midQ->resp_buf + 4,			       receive_len);			dump_smb(out_buf, 92);			/* convert the length into a more usable form */			if((receive_len > 24) &&			   (ses->server->secMode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))) {				rc = cifs_verify_signature(out_buf, ses->mac_signing_key,midQ->sequence_number); /* BB fix BB */				if(rc)					cFYI(1,("Unexpected signature received from server"));			}			*pbytes_returned = out_buf->smb_buf_length;			/* BB special case reconnect tid and reconnect uid here? */			rc = map_smb_to_linux_error(out_buf);			/* convert ByteCount if necessary */			if (receive_len >=			    sizeof (struct smb_hdr) -			    4 /* do not count RFC1001 header */  +			    (2 * out_buf->WordCount) + 2 /* bcc */ )				BCC(out_buf) = le16_to_cpu(BCC(out_buf));		} else {			rc = -EIO;			cFYI(1,("Bad MID state? "));		}	}cifs_no_response_exit:	DeleteMidQEntry(midQ);	if(long_op < 3) {		atomic_dec(&ses->server->inFlight); 		wake_up(&ses->server->request_q);	}	return rc;out_unlock:	up(&ses->server->tcpSem);	/* If not lock req, update # of requests on wire to server */	if(long_op < 3) {		atomic_dec(&ses->server->inFlight); 		wake_up(&ses->server->request_q);	}	return rc;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/ad009ac96509e005d9978d0ae9e9ec4d63ad2990/transport.c/clean/fs/cifs/transport.c