|
@@ -250,13 +250,13 @@ smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-wait_for_free_credits(struct TCP_Server_Info *server, const int optype,
|
|
|
+wait_for_free_credits(struct TCP_Server_Info *server, const int timeout,
|
|
|
int *credits)
|
|
|
{
|
|
|
int rc;
|
|
|
|
|
|
spin_lock(&server->req_lock);
|
|
|
- if (optype == CIFS_ASYNC_OP) {
|
|
|
+ if (timeout == CIFS_ASYNC_OP) {
|
|
|
/* oplock breaks must not be held up */
|
|
|
server->in_flight++;
|
|
|
*credits -= 1;
|
|
@@ -286,7 +286,7 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int optype,
|
|
|
*/
|
|
|
|
|
|
/* update # of requests on the wire to server */
|
|
|
- if (optype != CIFS_BLOCKING_OP) {
|
|
|
+ if (timeout != CIFS_BLOCKING_OP) {
|
|
|
*credits -= 1;
|
|
|
server->in_flight++;
|
|
|
}
|
|
@@ -298,10 +298,11 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int optype,
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-wait_for_free_request(struct TCP_Server_Info *server, const int optype)
|
|
|
+wait_for_free_request(struct TCP_Server_Info *server, const int timeout,
|
|
|
+ const int optype)
|
|
|
{
|
|
|
- return wait_for_free_credits(server, optype,
|
|
|
- server->ops->get_credits_field(server));
|
|
|
+ return wait_for_free_credits(server, timeout,
|
|
|
+ server->ops->get_credits_field(server, optype));
|
|
|
}
|
|
|
|
|
|
static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
|
|
@@ -378,12 +379,15 @@ cifs_setup_async_request(struct TCP_Server_Info *server, struct kvec *iov,
|
|
|
int
|
|
|
cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov,
|
|
|
unsigned int nvec, mid_receive_t *receive,
|
|
|
- mid_callback_t *callback, void *cbdata, bool ignore_pend)
|
|
|
+ mid_callback_t *callback, void *cbdata, const int flags)
|
|
|
{
|
|
|
- int rc;
|
|
|
+ int rc, timeout, optype;
|
|
|
struct mid_q_entry *mid;
|
|
|
|
|
|
- rc = wait_for_free_request(server, ignore_pend ? CIFS_ASYNC_OP : 0);
|
|
|
+ timeout = flags & CIFS_TIMEOUT_MASK;
|
|
|
+ optype = flags & CIFS_OP_MASK;
|
|
|
+
|
|
|
+ rc = wait_for_free_request(server, timeout, optype);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
@@ -391,7 +395,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov,
|
|
|
rc = cifs_setup_async_request(server, iov, nvec, &mid);
|
|
|
if (rc) {
|
|
|
mutex_unlock(&server->srv_mutex);
|
|
|
- add_credits(server, 1);
|
|
|
+ add_credits(server, 1, optype);
|
|
|
wake_up(&server->request_q);
|
|
|
return rc;
|
|
|
}
|
|
@@ -417,7 +421,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov,
|
|
|
return 0;
|
|
|
|
|
|
delete_mid(mid);
|
|
|
- add_credits(server, 1);
|
|
|
+ add_credits(server, 1, optype);
|
|
|
wake_up(&server->request_q);
|
|
|
return rc;
|
|
|
}
|
|
@@ -533,17 +537,19 @@ cifs_setup_request(struct cifs_ses *ses, struct kvec *iov,
|
|
|
|
|
|
int
|
|
|
SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|
|
- struct kvec *iov, int n_vec, int *pRespBufType /* ret */,
|
|
|
+ struct kvec *iov, int n_vec, int *resp_buf_type /* ret */,
|
|
|
const int flags)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
- int long_op;
|
|
|
+ int timeout, optype;
|
|
|
struct mid_q_entry *midQ;
|
|
|
char *buf = iov[0].iov_base;
|
|
|
+ unsigned int credits = 1;
|
|
|
|
|
|
- long_op = flags & CIFS_TIMEOUT_MASK;
|
|
|
+ timeout = flags & CIFS_TIMEOUT_MASK;
|
|
|
+ optype = flags & CIFS_OP_MASK;
|
|
|
|
|
|
- *pRespBufType = CIFS_NO_BUFFER; /* no response buf yet */
|
|
|
+ *resp_buf_type = CIFS_NO_BUFFER; /* no response buf yet */
|
|
|
|
|
|
if ((ses == NULL) || (ses->server == NULL)) {
|
|
|
cifs_small_buf_release(buf);
|
|
@@ -562,7 +568,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|
|
* use ses->maxReq.
|
|
|
*/
|
|
|
|
|
|
- rc = wait_for_free_request(ses->server, long_op);
|
|
|
+ rc = wait_for_free_request(ses->server, timeout, optype);
|
|
|
if (rc) {
|
|
|
cifs_small_buf_release(buf);
|
|
|
return rc;
|
|
@@ -581,7 +587,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|
|
mutex_unlock(&ses->server->srv_mutex);
|
|
|
cifs_small_buf_release(buf);
|
|
|
/* Update # of requests on wire to server */
|
|
|
- add_credits(ses->server, 1);
|
|
|
+ add_credits(ses->server, 1, optype);
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -598,7 +604,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (long_op == CIFS_ASYNC_OP) {
|
|
|
+ if (timeout == CIFS_ASYNC_OP) {
|
|
|
cifs_small_buf_release(buf);
|
|
|
goto out;
|
|
|
}
|
|
@@ -611,7 +617,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|
|
midQ->callback = DeleteMidQEntry;
|
|
|
spin_unlock(&GlobalMid_Lock);
|
|
|
cifs_small_buf_release(buf);
|
|
|
- add_credits(ses->server, 1);
|
|
|
+ add_credits(ses->server, 1, optype);
|
|
|
return rc;
|
|
|
}
|
|
|
spin_unlock(&GlobalMid_Lock);
|
|
@@ -621,7 +627,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|
|
|
|
|
rc = cifs_sync_mid_result(midQ, ses->server);
|
|
|
if (rc != 0) {
|
|
|
- add_credits(ses->server, 1);
|
|
|
+ add_credits(ses->server, 1, optype);
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -635,9 +641,11 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|
|
iov[0].iov_base = buf;
|
|
|
iov[0].iov_len = get_rfc1002_length(buf) + 4;
|
|
|
if (midQ->large_buf)
|
|
|
- *pRespBufType = CIFS_LARGE_BUFFER;
|
|
|
+ *resp_buf_type = CIFS_LARGE_BUFFER;
|
|
|
else
|
|
|
- *pRespBufType = CIFS_SMALL_BUFFER;
|
|
|
+ *resp_buf_type = CIFS_SMALL_BUFFER;
|
|
|
+
|
|
|
+ credits = ses->server->ops->get_credits(midQ);
|
|
|
|
|
|
rc = ses->server->ops->check_receive(midQ, ses->server,
|
|
|
flags & CIFS_LOG_ERROR);
|
|
@@ -647,7 +655,7 @@ SendReceive2(const unsigned int xid, struct cifs_ses *ses,
|
|
|
midQ->resp_buf = NULL;
|
|
|
out:
|
|
|
delete_mid(midQ);
|
|
|
- add_credits(ses->server, 1);
|
|
|
+ add_credits(ses->server, credits, optype);
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
@@ -655,7 +663,7 @@ out:
|
|
|
int
|
|
|
SendReceive(const unsigned int xid, struct cifs_ses *ses,
|
|
|
struct smb_hdr *in_buf, struct smb_hdr *out_buf,
|
|
|
- int *pbytes_returned, const int long_op)
|
|
|
+ int *pbytes_returned, const int timeout)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
struct mid_q_entry *midQ;
|
|
@@ -683,7 +691,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
- rc = wait_for_free_request(ses->server, long_op);
|
|
|
+ rc = wait_for_free_request(ses->server, timeout, 0);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
@@ -697,7 +705,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
|
|
|
if (rc) {
|
|
|
mutex_unlock(&ses->server->srv_mutex);
|
|
|
/* Update # of requests on wire to server */
|
|
|
- add_credits(ses->server, 1);
|
|
|
+ add_credits(ses->server, 1, 0);
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -718,7 +726,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
|
|
|
if (rc < 0)
|
|
|
goto out;
|
|
|
|
|
|
- if (long_op == CIFS_ASYNC_OP)
|
|
|
+ if (timeout == CIFS_ASYNC_OP)
|
|
|
goto out;
|
|
|
|
|
|
rc = wait_for_response(ses->server, midQ);
|
|
@@ -729,7 +737,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
|
|
|
/* no longer considered to be "in-flight" */
|
|
|
midQ->callback = DeleteMidQEntry;
|
|
|
spin_unlock(&GlobalMid_Lock);
|
|
|
- add_credits(ses->server, 1);
|
|
|
+ add_credits(ses->server, 1, 0);
|
|
|
return rc;
|
|
|
}
|
|
|
spin_unlock(&GlobalMid_Lock);
|
|
@@ -737,7 +745,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
|
|
|
|
|
|
rc = cifs_sync_mid_result(midQ, ses->server);
|
|
|
if (rc != 0) {
|
|
|
- add_credits(ses->server, 1);
|
|
|
+ add_credits(ses->server, 1, 0);
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
@@ -753,7 +761,7 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
|
|
|
rc = cifs_check_receive(midQ, ses->server, 0);
|
|
|
out:
|
|
|
delete_mid(midQ);
|
|
|
- add_credits(ses->server, 1);
|
|
|
+ add_credits(ses->server, 1, 0);
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
@@ -818,7 +826,7 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifs_tcon *tcon,
|
|
|
return -EIO;
|
|
|
}
|
|
|
|
|
|
- rc = wait_for_free_request(ses->server, CIFS_BLOCKING_OP);
|
|
|
+ rc = wait_for_free_request(ses->server, CIFS_BLOCKING_OP, 0);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|