else
                                t->full_packet_received = true;
 
-                       enqueue_reassembly(t, recvmsg, (int)data_length);
-                       wake_up_interruptible(&t->wait_reassembly_queue);
-
                        spin_lock(&t->receive_credit_lock);
                        receive_credits = --(t->recv_credits);
                        avail_recvmsg_count = t->count_avail_recvmsg;
                        spin_unlock(&t->receive_credit_lock);
                } else {
-                       put_recvmsg(t, recvmsg);
-
                        spin_lock(&t->receive_credit_lock);
                        receive_credits = --(t->recv_credits);
                        avail_recvmsg_count = ++(t->count_avail_recvmsg);
                if (is_receive_credit_post_required(receive_credits, avail_recvmsg_count))
                        mod_delayed_work(smb_direct_wq,
                                         &t->post_recv_credits_work, 0);
+
+               if (data_length) {
+                       enqueue_reassembly(t, recvmsg, (int)data_length);
+                       wake_up_interruptible(&t->wait_reassembly_queue);
+               } else
+                       put_recvmsg(t, recvmsg);
+
                return;
        }
        }