struct smbdirect_socket socket;
 
-       atomic_t                recv_credits;
-       u16                     recv_credit_target;
-
-       atomic_t                recv_posted;
-       struct work_struct      post_recv_credits_work;
        struct work_struct      send_immediate_work;
 
        bool                    legacy_iwarp;
        list_add(&recvmsg->list, &sc->recv_io.free.list);
        spin_unlock(&sc->recv_io.free.lock);
 
-       queue_work(smb_direct_wq, &t->post_recv_credits_work);
+       queue_work(smb_direct_wq, &sc->recv_io.posted.refill_work);
 }
 
 static void enqueue_reassembly(struct smb_direct_transport *t,
         * disable[_delayed]_work_sync()
         */
        disable_work(&sc->disconnect_work);
-       disable_work(&t->post_recv_credits_work);
+       disable_work(&sc->recv_io.posted.refill_work);
        disable_work(&t->send_immediate_work);
 
        switch (sc->status) {
 
        sc->ib.dev = sc->rdma.cm_id->device;
 
-       atomic_set(&t->recv_posted, 0);
-       atomic_set(&t->recv_credits, 0);
-
-       INIT_WORK(&t->post_recv_credits_work,
+       INIT_WORK(&sc->recv_io.posted.refill_work,
                  smb_direct_post_recv_credits);
        INIT_WORK(&t->send_immediate_work, smb_direct_send_immediate_work);
 
        wake_up_all(&sc->send_io.credits.wait_queue);
        wake_up_all(&sc->send_io.pending.zero_wait_queue);
 
-       disable_work_sync(&t->post_recv_credits_work);
+       disable_work_sync(&sc->recv_io.posted.refill_work);
        disable_work_sync(&t->send_immediate_work);
 
        if (sc->ib.qp) {
                                sc->recv_io.reassembly.full_packet_received = true;
                }
 
-               atomic_dec(&t->recv_posted);
-               atomic_dec(&t->recv_credits);
+               atomic_dec(&sc->recv_io.posted.count);
+               atomic_dec(&sc->recv_io.credits.count);
 
-               old_recv_credit_target = t->recv_credit_target;
-               t->recv_credit_target =
+               old_recv_credit_target = sc->recv_io.credits.target;
+               sc->recv_io.credits.target =
                                le16_to_cpu(data_transfer->credits_requested);
-               t->recv_credit_target =
-                       min_t(u16, t->recv_credit_target, sp->recv_credit_max);
-               t->recv_credit_target =
-                       max_t(u16, t->recv_credit_target, 1);
+               sc->recv_io.credits.target =
+                       min_t(u16, sc->recv_io.credits.target, sp->recv_credit_max);
+               sc->recv_io.credits.target =
+                       max_t(u16, sc->recv_io.credits.target, 1);
                atomic_add(le16_to_cpu(data_transfer->credits_granted),
                           &sc->send_io.credits.count);
 
                        wake_up(&sc->send_io.credits.wait_queue);
 
                if (data_length) {
-                       if (t->recv_credit_target > old_recv_credit_target)
-                               queue_work(smb_direct_wq, &t->post_recv_credits_work);
+                       if (sc->recv_io.credits.target > old_recv_credit_target)
+                               queue_work(smb_direct_wq, &sc->recv_io.posted.refill_work);
 
                        enqueue_reassembly(t, recvmsg, (int)data_length);
                        wake_up(&sc->recv_io.reassembly.wait_queue);
 
 static void smb_direct_post_recv_credits(struct work_struct *work)
 {
-       struct smb_direct_transport *t = container_of(work,
-               struct smb_direct_transport, post_recv_credits_work);
+       struct smbdirect_socket *sc =
+               container_of(work, struct smbdirect_socket, recv_io.posted.refill_work);
+       struct smb_direct_transport *t =
+               container_of(sc, struct smb_direct_transport, socket);
        struct smbdirect_recv_io *recvmsg;
        int credits = 0;
        int ret;
 
-       if (atomic_read(&t->recv_credits) < t->recv_credit_target) {
+       if (atomic_read(&sc->recv_io.credits.count) < sc->recv_io.credits.target) {
                while (true) {
                        recvmsg = get_free_recvmsg(t);
                        if (!recvmsg)
                        }
                        credits++;
 
-                       atomic_inc(&t->recv_posted);
+                       atomic_inc(&sc->recv_io.posted.count);
                }
        }
 
 
 static int manage_credits_prior_sending(struct smb_direct_transport *t)
 {
+       struct smbdirect_socket *sc = &t->socket;
        int new_credits;
 
-       if (atomic_read(&t->recv_credits) >= t->recv_credit_target)
+       if (atomic_read(&sc->recv_io.credits.count) >= sc->recv_io.credits.target)
                return 0;
 
-       new_credits = atomic_read(&t->recv_posted);
+       new_credits = atomic_read(&sc->recv_io.posted.count);
        if (new_credits == 0)
                return 0;
 
-       new_credits -= atomic_read(&t->recv_credits);
+       new_credits -= atomic_read(&sc->recv_io.credits.count);
        if (new_credits <= 0)
                return 0;
 
-       atomic_add(new_credits, &t->recv_credits);
+       atomic_add(new_credits, &sc->recv_io.credits.count);
        return new_credits;
 }
 
                goto out_err;
        }
 
-       smb_direct_post_recv_credits(&t->post_recv_credits_work);
+       smb_direct_post_recv_credits(&sc->recv_io.posted.refill_work);
        return 0;
 out_err:
        put_recvmsg(t, recvmsg);
        }
 
        sp->recv_credit_max = smb_direct_receive_credit_max;
-       t->recv_credit_target = 1;
+       sc->recv_io.credits.target = 1;
 
        sp->send_credit_target = smb_direct_send_credit_target;
        atomic_set(&sc->rw_io.credits.count, sc->rw_io.credits.max);
                le32_to_cpu(req->max_fragmented_size);
        sp->max_fragmented_recv_size =
                (sp->recv_credit_max * sp->max_recv_size) / 2;
-       st->recv_credit_target = le16_to_cpu(req->credits_requested);
-       st->recv_credit_target = min_t(u16, st->recv_credit_target, sp->recv_credit_max);
-       st->recv_credit_target = max_t(u16, st->recv_credit_target, 1);
+       sc->recv_io.credits.target = le16_to_cpu(req->credits_requested);
+       sc->recv_io.credits.target = min_t(u16, sc->recv_io.credits.target, sp->recv_credit_max);
+       sc->recv_io.credits.target = max_t(u16, sc->recv_io.credits.target, 1);
 
        ret = smb_direct_send_negotiate_response(st, ret);
 out: