cifs: do all necessary checks for credits within or before locking
[platform/kernel/linux-starfive.git] / fs / smb / client / transport.c
index c961b90..e03ffcf 100644 (file)
@@ -549,6 +549,16 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
        }
 
        while (1) {
+               spin_unlock(&server->req_lock);
+
+               spin_lock(&server->srv_lock);
+               if (server->tcpStatus == CifsExiting) {
+                       spin_unlock(&server->srv_lock);
+                       return -ENOENT;
+               }
+               spin_unlock(&server->srv_lock);
+
+               spin_lock(&server->req_lock);
                if (*credits < num_credits) {
                        scredits = *credits;
                        spin_unlock(&server->req_lock);
@@ -574,15 +584,6 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
                                return -ERESTARTSYS;
                        spin_lock(&server->req_lock);
                } else {
-                       spin_unlock(&server->req_lock);
-
-                       spin_lock(&server->srv_lock);
-                       if (server->tcpStatus == CifsExiting) {
-                               spin_unlock(&server->srv_lock);
-                               return -ENOENT;
-                       }
-                       spin_unlock(&server->srv_lock);
-
                        /*
                         * For normal commands, reserve the last MAX_COMPOUND
                         * credits to compound requests.
@@ -596,7 +597,6 @@ wait_for_free_credits(struct TCP_Server_Info *server, const int num_credits,
                         * for servers that are slow to hand out credits on
                         * new sessions.
                         */
-                       spin_lock(&server->req_lock);
                        if (!optype && num_credits == 1 &&
                            server->in_flight > 2 * MAX_COMPOUND &&
                            *credits <= MAX_COMPOUND) {