Change crediting so that the credits are returned on the interim async response.
authorJeremy Allison <jra@samba.org>
Mon, 13 Dec 2010 23:22:47 +0000 (15:22 -0800)
committerJeremy Allison <jra@samba.org>
Tue, 14 Dec 2010 00:09:05 +0000 (01:09 +0100)
Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Tue Dec 14 01:09:05 CET 2010 on sn-devel-104

source3/smbd/smb2_server.c

index 91e00dc050037f917b63af43daf31bf266c54339..8dbf3276c09e5acb82944308ae0c9a27ffdd7099 100644 (file)
@@ -902,9 +902,11 @@ NTSTATUS smbd_smb2_request_pending_queue(struct smbd_smb2_request *req,
        /* Match W2K8R2... */
        SCVAL(body, 0x08, 0x21);
 
-       /* Ensure we correctly go through crediting. */
+       /* Ensure we correctly go through crediting. Grant
+          the credits now, and zero credits on the final
+          response. */
        smb2_set_operation_credit(req->sconn,
-                       NULL,
+                       &req->in.vector[i],
                        &state->vector[1]);
 
        if (req->do_signing) {
@@ -1443,9 +1445,10 @@ static NTSTATUS smbd_smb2_request_reply(struct smbd_smb2_request *req)
 
        smb2_setup_nbt_length(req->out.vector, req->out.vector_count);
 
-       /* Set credit for this operation. */
+       /* Set credit for this operation (zero credits if this
+          is a final reply for an async operation). */
        smb2_set_operation_credit(req->sconn,
-                       &req->in.vector[i],
+                       req->async ? NULL : &req->in.vector[i],
                        &req->out.vector[i]);
 
        if (req->do_signing) {