CIFS: Prepare credits code for a slot reservation
authorPavel Shilovsky <piastry@etersoft.ru>
Thu, 15 Mar 2012 10:22:27 +0000 (13:22 +0300)
committerSteve French <sfrench@us.ibm.com>
Wed, 21 Mar 2012 16:35:36 +0000 (11:35 -0500)
that is essential for CIFS/SMB/SMB2 oplock breaks and SMB2 echos.

Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/cifsglob.h
fs/cifs/transport.c

index d55de96..2309a67 100644 (file)
@@ -315,12 +315,22 @@ in_flight(struct TCP_Server_Info *server)
        return num;
 }
 
+static inline int*
+get_credits_field(struct TCP_Server_Info *server)
+{
+       /*
+        * This will change to switch statement when we reserve slots for echos
+        * and oplock breaks.
+        */
+       return &server->credits;
+}
+
 static inline bool
-has_credits(struct TCP_Server_Info *server)
+has_credits(struct TCP_Server_Info *server, int *credits)
 {
        int num;
        spin_lock(&server->req_lock);
-       num = server->credits;
+       num = *credits;
        spin_unlock(&server->req_lock);
        return num > 0;
 }
index 58b31da..310918b 100644 (file)
@@ -255,26 +255,26 @@ smb_send(struct TCP_Server_Info *server, struct smb_hdr *smb_buffer,
 }
 
 static int
-wait_for_free_request(struct TCP_Server_Info *server, const int long_op)
+wait_for_free_credits(struct TCP_Server_Info *server, const int optype,
+                     int *credits)
 {
        int rc;
 
        spin_lock(&server->req_lock);
-
-       if (long_op == CIFS_ASYNC_OP) {
+       if (optype == CIFS_ASYNC_OP) {
                /* oplock breaks must not be held up */
                server->in_flight++;
-               server->credits--;
+               *credits -= 1;
                spin_unlock(&server->req_lock);
                return 0;
        }
 
        while (1) {
-               if (server->credits <= 0) {
+               if (*credits <= 0) {
                        spin_unlock(&server->req_lock);
                        cifs_num_waiters_inc(server);
                        rc = wait_event_killable(server->request_q,
-                                                has_credits(server));
+                                                has_credits(server, credits));
                        cifs_num_waiters_dec(server);
                        if (rc)
                                return rc;
@@ -291,8 +291,8 @@ wait_for_free_request(struct TCP_Server_Info *server, const int long_op)
                         */
 
                        /* update # of requests on the wire to server */
-                       if (long_op != CIFS_BLOCKING_OP) {
-                               server->credits--;
+                       if (optype != CIFS_BLOCKING_OP) {
+                               *credits -= 1;
                                server->in_flight++;
                        }
                        spin_unlock(&server->req_lock);
@@ -302,6 +302,12 @@ wait_for_free_request(struct TCP_Server_Info *server, const int long_op)
        return 0;
 }
 
+static int
+wait_for_free_request(struct TCP_Server_Info *server, const int optype)
+{
+       return wait_for_free_credits(server, optype, get_credits_field(server));
+}
+
 static int allocate_mid(struct cifs_ses *ses, struct smb_hdr *in_buf,
                        struct mid_q_entry **ppmidQ)
 {