cifs: do all necessary checks for credits within or before locking
[platform/kernel/linux-starfive.git] / fs / smb / client / smb2ops.c
index d512440..e6a191a 100644 (file)
@@ -208,6 +208,16 @@ smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
 
        spin_lock(&server->req_lock);
        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 (server->credits <= 0) {
                        spin_unlock(&server->req_lock);
                        cifs_num_waiters_inc(server);
@@ -218,15 +228,6 @@ smb2_wait_mtu_credits(struct TCP_Server_Info *server, unsigned int size,
                                return rc;
                        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);
-
-                       spin_lock(&server->req_lock);
                        scredits = server->credits;
                        /* can deadlock with reopen */
                        if (scredits <= 8) {