pipe: limit the per-user amount of pages allocated in pipes
[pandora-kernel.git] / fs / cifs / transport.c
index 0cc9584..d21a89b 100644 (file)
@@ -265,12 +265,12 @@ static int wait_for_free_request(struct TCP_Server_Info *server,
 
        spin_lock(&GlobalMid_Lock);
        while (1) {
-               if (atomic_read(&server->inFlight) >= cifs_max_pending) {
+               if (atomic_read(&server->inFlight) >= server->maxReq) {
                        spin_unlock(&GlobalMid_Lock);
                        cifs_num_waiters_inc(server);
                        wait_event(server->request_q,
                                   atomic_read(&server->inFlight)
-                                    < cifs_max_pending);
+                                    < server->maxReq);
                        cifs_num_waiters_dec(server);
                        spin_lock(&GlobalMid_Lock);
                } else {
@@ -370,10 +370,8 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov,
        spin_unlock(&GlobalMid_Lock);
 
        rc = cifs_sign_smb2(iov, nvec, server, &mid->sequence_number);
-       if (rc) {
-               mutex_unlock(&server->srv_mutex);
-               goto out_err;
-       }
+       if (rc)
+               goto out;
 
        mid->receive = receive;
        mid->callback = callback;
@@ -384,14 +382,15 @@ cifs_call_async(struct TCP_Server_Info *server, struct kvec *iov,
        rc = smb_sendv(server, iov, nvec);
        cifs_in_send_dec(server);
        cifs_save_when_sent(mid);
+out:
+       if (rc < 0)
+               delete_mid(mid);
+
        mutex_unlock(&server->srv_mutex);
 
-       if (rc)
-               goto out_err;
+       if (rc == 0)
+               return 0;
 
-       return rc;
-out_err:
-       delete_mid(mid);
        atomic_dec(&server->inFlight);
        wake_up(&server->request_q);
        return rc;
@@ -485,6 +484,13 @@ send_nt_cancel(struct TCP_Server_Info *server, struct smb_hdr *in_buf,
                mutex_unlock(&server->srv_mutex);
                return rc;
        }
+
+       /*
+        * The response to this call was already factored into the sequence
+        * number when the call went out, so we must adjust it back downward
+        * after signing here.
+        */
+       --server->sequence_number;
        rc = smb_send(server, in_buf, be32_to_cpu(in_buf->smb_buf_length));
        mutex_unlock(&server->srv_mutex);