void **request_buf, unsigned int *total_len)
 {
        /* BB eventually switch this to SMB2 specific small buf size */
-       if (smb2_command == SMB2_SET_INFO)
+       switch (smb2_command) {
+       case SMB2_SET_INFO:
+       case SMB2_QUERY_INFO:
                *request_buf = cifs_buf_get();
-       else
+               break;
+       default:
                *request_buf = cifs_small_buf_get();
+               break;
+       }
        if (*request_buf == NULL) {
                /* BB should we add a retry in here if not a writepage? */
                return -ENOMEM;
        struct smb2_query_info_req *req;
        struct kvec *iov = rqst->rq_iov;
        unsigned int total_len;
+       size_t len;
        int rc;
 
+       if (unlikely(check_add_overflow(input_len, sizeof(*req), &len) ||
+                    len > CIFSMaxBufSize))
+               return -EINVAL;
+
        rc = smb2_plain_req_init(SMB2_QUERY_INFO, tcon, server,
                                 (void **) &req, &total_len);
        if (rc)
 
        iov[0].iov_base = (char *)req;
        /* 1 for Buffer */
-       iov[0].iov_len = total_len - 1 + input_len;
+       iov[0].iov_len = len;
        return 0;
 }
 
 SMB2_query_info_free(struct smb_rqst *rqst)
 {
        if (rqst && rqst->rq_iov)
-               cifs_small_buf_release(rqst->rq_iov[0].iov_base); /* request */
+               cifs_buf_release(rqst->rq_iov[0].iov_base); /* request */
 }
 
 static int
        return 0;
 }
 
+static inline void free_qfs_info_req(struct kvec *iov)
+{
+       cifs_buf_release(iov->iov_base);
+}
+
 int
 SMB311_posix_qfs_info(const unsigned int xid, struct cifs_tcon *tcon,
              u64 persistent_fid, u64 volatile_fid, struct kstatfs *fsdata)
 
        rc = cifs_send_recv(xid, ses, server,
                            &rqst, &resp_buftype, flags, &rsp_iov);
-       cifs_small_buf_release(iov.iov_base);
+       free_qfs_info_req(&iov);
        if (rc) {
                cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
                goto posix_qfsinf_exit;
 
        rc = cifs_send_recv(xid, ses, server,
                            &rqst, &resp_buftype, flags, &rsp_iov);
-       cifs_small_buf_release(iov.iov_base);
+       free_qfs_info_req(&iov);
        if (rc) {
                cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
                goto qfsinf_exit;
 
        rc = cifs_send_recv(xid, ses, server,
                            &rqst, &resp_buftype, flags, &rsp_iov);
-       cifs_small_buf_release(iov.iov_base);
+       free_qfs_info_req(&iov);
        if (rc) {
                cifs_stats_fail_inc(tcon, SMB2_QUERY_INFO_HE);
                goto qfsattr_exit;