static int ntlm_negotiate(struct ksmbd_work *work,
                          struct negotiate_message *negblob,
-                         size_t negblob_len)
+                         size_t negblob_len, struct smb2_sess_setup_rsp *rsp)
 {
-       struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf);
        struct challenge_message *chgblob;
        unsigned char *spnego_blob = NULL;
        u16 spnego_blob_len;
        return user;
 }
 
-static int ntlm_authenticate(struct ksmbd_work *work)
+static int ntlm_authenticate(struct ksmbd_work *work,
+                            struct smb2_sess_setup_req *req,
+                            struct smb2_sess_setup_rsp *rsp)
 {
-       struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf);
-       struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf);
        struct ksmbd_conn *conn = work->conn;
        struct ksmbd_session *sess = work->sess;
        struct channel *chann = NULL;
 }
 
 #ifdef CONFIG_SMB_SERVER_KERBEROS5
-static int krb5_authenticate(struct ksmbd_work *work)
+static int krb5_authenticate(struct ksmbd_work *work,
+                            struct smb2_sess_setup_req *req,
+                            struct smb2_sess_setup_rsp *rsp)
 {
-       struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf);
-       struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf);
        struct ksmbd_conn *conn = work->conn;
        struct ksmbd_session *sess = work->sess;
        char *in_blob, *out_blob;
        return 0;
 }
 #else
-static int krb5_authenticate(struct ksmbd_work *work)
+static int krb5_authenticate(struct ksmbd_work *work,
+                            struct smb2_sess_setup_req *req,
+                            struct smb2_sess_setup_rsp *rsp)
 {
        return -EOPNOTSUPP;
 }
 int smb2_sess_setup(struct ksmbd_work *work)
 {
        struct ksmbd_conn *conn = work->conn;
-       struct smb2_sess_setup_req *req = smb2_get_msg(work->request_buf);
-       struct smb2_sess_setup_rsp *rsp = smb2_get_msg(work->response_buf);
+       struct smb2_sess_setup_req *req;
+       struct smb2_sess_setup_rsp *rsp;
        struct ksmbd_session *sess;
        struct negotiate_message *negblob;
        unsigned int negblob_len, negblob_off;
 
        ksmbd_debug(SMB, "Received request for session setup\n");
 
+       WORK_BUFFERS(work, req, rsp);
+
        rsp->StructureSize = cpu_to_le16(9);
        rsp->SessionFlags = 0;
        rsp->SecurityBufferOffset = cpu_to_le16(72);
 
                if (conn->preferred_auth_mech &
                                (KSMBD_AUTH_KRB5 | KSMBD_AUTH_MSKRB5)) {
-                       rc = krb5_authenticate(work);
+                       rc = krb5_authenticate(work, req, rsp);
                        if (rc) {
                                rc = -EINVAL;
                                goto out_err;
                        sess->Preauth_HashValue = NULL;
                } else if (conn->preferred_auth_mech == KSMBD_AUTH_NTLMSSP) {
                        if (negblob->MessageType == NtLmNegotiate) {
-                               rc = ntlm_negotiate(work, negblob, negblob_len);
+                               rc = ntlm_negotiate(work, negblob, negblob_len, rsp);
                                if (rc)
                                        goto out_err;
                                rsp->hdr.Status =
                                                le16_to_cpu(rsp->SecurityBufferLength) - 1);
 
                        } else if (negblob->MessageType == NtLmAuthenticate) {
-                               rc = ntlm_authenticate(work);
+                               rc = ntlm_authenticate(work, req, rsp);
                                if (rc)
                                        goto out_err;