*/
 static int
 crypt_message(struct TCP_Server_Info *server, int num_rqst,
-             struct smb_rqst *rqst, int enc)
+             struct smb_rqst *rqst, int enc, struct crypto_aead *tfm)
 {
        struct smb2_transform_hdr *tr_hdr =
                (struct smb2_transform_hdr *)rqst[0].rq_iov[0].iov_base;
        u8 key[SMB3_ENC_DEC_KEY_SIZE];
        struct aead_request *req;
        u8 *iv;
-       DECLARE_CRYPTO_WAIT(wait);
-       struct crypto_aead *tfm;
        unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
        void *creq;
        size_t sensitive_size;
                return rc;
        }
 
-       rc = smb3_crypto_aead_allocate(server);
-       if (rc) {
-               cifs_server_dbg(VFS, "%s: crypto alloc failed\n", __func__);
-               return rc;
-       }
-
-       tfm = enc ? server->secmech.enc : server->secmech.dec;
-
        if ((server->cipher_type == SMB2_ENCRYPTION_AES256_CCM) ||
                (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM))
                rc = crypto_aead_setkey(tfm, key, SMB3_GCM256_CRYPTKEY_SIZE);
        aead_request_set_crypt(req, sg, sg, crypt_len, iv);
        aead_request_set_ad(req, assoc_data_len);
 
-       aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
-                                 crypto_req_done, &wait);
-
-       rc = crypto_wait_req(enc ? crypto_aead_encrypt(req)
-                               : crypto_aead_decrypt(req), &wait);
+       rc = enc ? crypto_aead_encrypt(req) : crypto_aead_decrypt(req);
 
        if (!rc && enc)
                memcpy(&tr_hdr->Signature, sign, SMB2_SIGNATURE_SIZE);
        /* fill the 1st iov with a transform header */
        fill_transform_hdr(tr_hdr, orig_len, old_rq, server->cipher_type);
 
-       rc = crypt_message(server, num_rqst, new_rq, 1);
+       rc = crypt_message(server, num_rqst, new_rq, 1, server->secmech.enc);
        cifs_dbg(FYI, "Encrypt message returned %d\n", rc);
        if (rc)
                goto err_free;
                 unsigned int buf_data_size, struct iov_iter *iter,
                 bool is_offloaded)
 {
-       struct kvec iov[2];
+       struct crypto_aead *tfm;
        struct smb_rqst rqst = {NULL};
+       struct kvec iov[2];
        size_t iter_size = 0;
        int rc;
 
                iter_size = iov_iter_count(iter);
        }
 
-       rc = crypt_message(server, 1, &rqst, 0);
+       if (is_offloaded) {
+               if ((server->cipher_type == SMB2_ENCRYPTION_AES128_GCM) ||
+                   (server->cipher_type == SMB2_ENCRYPTION_AES256_GCM))
+                       tfm = crypto_alloc_aead("gcm(aes)", 0, 0);
+               else
+                       tfm = crypto_alloc_aead("ccm(aes)", 0, 0);
+               if (IS_ERR(tfm)) {
+                       rc = PTR_ERR(tfm);
+                       cifs_server_dbg(VFS, "%s: Failed alloc decrypt TFM, rc=%d\n", __func__, rc);
+
+                       return rc;
+               }
+       } else {
+               if (unlikely(!server->secmech.dec))
+                       return -EIO;
+
+               tfm = server->secmech.dec;
+       }
+
+       rc = crypt_message(server, 1, &rqst, 0, tfm);
        cifs_dbg(FYI, "Decrypt message returned %d\n", rc);
 
+       if (is_offloaded)
+               crypto_free_aead(tfm);
+
        if (rc)
                return rc;