(*) Send data through a call.
 
+       typedef void (*rxrpc_notify_end_tx_t)(struct sock *sk,
+                                             unsigned long user_call_ID,
+                                             struct sk_buff *skb);
+
        int rxrpc_kernel_send_data(struct socket *sock,
                                   struct rxrpc_call *call,
                                   struct msghdr *msg,
-                                  size_t len);
+                                  size_t len,
+                                  rxrpc_notify_end_tx_t notify_end_rx);
 
      This is used to supply either the request part of a client call or the
      reply part of a server call.  msg.msg_iovlen and msg.msg_iov specify the
      The msg must not specify a destination address, control data or any flags
      other than MSG_MORE.  len is the total amount of data to transmit.
 
+     notify_end_rx can be NULL or it can be used to specify a function to be
+     called when the call changes state to end the Tx phase.  This function is
+     called with the call-state spinlock held to prevent any reply or final ACK
+     from being delivered first.
+
  (*) Receive data from a call.
 
        int rxrpc_kernel_recv_data(struct socket *sock,
 
        iov_iter_bvec(&msg->msg_iter, WRITE | ITER_BVEC, bv, nr, bytes);
 }
 
+/*
+ * Advance the AFS call state when the RxRPC call ends the transmit phase.
+ */
+static void afs_notify_end_request_tx(struct sock *sock,
+                                     struct rxrpc_call *rxcall,
+                                     unsigned long call_user_ID)
+{
+       struct afs_call *call = (struct afs_call *)call_user_ID;
+
+       if (call->state == AFS_CALL_REQUESTING)
+               call->state = AFS_CALL_AWAIT_REPLY;
+}
+
 /*
  * attach the data from a bunch of pages on an inode to a call
  */
                bytes = msg->msg_iter.count;
                nr = msg->msg_iter.nr_segs;
 
-               /* Have to change the state *before* sending the last
-                * packet as RxRPC might give us the reply before it
-                * returns from sending the request.
-                */
-               if (first + nr - 1 >= last)
-                       call->state = AFS_CALL_AWAIT_REPLY;
-               ret = rxrpc_kernel_send_data(afs_socket, call->rxcall,
-                                            msg, bytes);
+               ret = rxrpc_kernel_send_data(afs_socket, call->rxcall, msg,
+                                            bytes, afs_notify_end_request_tx);
                for (loop = 0; loop < nr; loop++)
                        put_page(bv[loop].bv_page);
                if (ret < 0)
        if (!call->send_pages)
                call->state = AFS_CALL_AWAIT_REPLY;
        ret = rxrpc_kernel_send_data(afs_socket, rxcall,
-                                    &msg, call->request_size);
+                                    &msg, call->request_size,
+                                    afs_notify_end_request_tx);
        if (ret < 0)
                goto error_do_abort;
 
        return call->type->deliver(call);
 }
 
+/*
+ * Advance the AFS call state when an RxRPC service call ends the transmit
+ * phase.
+ */
+static void afs_notify_end_reply_tx(struct sock *sock,
+                                   struct rxrpc_call *rxcall,
+                                   unsigned long call_user_ID)
+{
+       struct afs_call *call = (struct afs_call *)call_user_ID;
+
+       if (call->state == AFS_CALL_REPLYING)
+               call->state = AFS_CALL_AWAIT_ACK;
+}
+
 /*
  * send an empty reply
  */
        msg.msg_flags           = 0;
 
        call->state = AFS_CALL_AWAIT_ACK;
-       switch (rxrpc_kernel_send_data(afs_socket, call->rxcall, &msg, 0)) {
+       switch (rxrpc_kernel_send_data(afs_socket, call->rxcall, &msg, 0,
+                                      afs_notify_end_reply_tx)) {
        case 0:
                _leave(" [replied]");
                return;
        msg.msg_flags           = 0;
 
        call->state = AFS_CALL_AWAIT_ACK;
-       n = rxrpc_kernel_send_data(afs_socket, call->rxcall, &msg, len);
+       n = rxrpc_kernel_send_data(afs_socket, call->rxcall, &msg, len,
+                                  afs_notify_end_reply_tx);
        if (n >= 0) {
                /* Success */
                _leave(" [replied]");
 
 
 typedef void (*rxrpc_notify_rx_t)(struct sock *, struct rxrpc_call *,
                                  unsigned long);
+typedef void (*rxrpc_notify_end_tx_t)(struct sock *, struct rxrpc_call *,
+                                     unsigned long);
 typedef void (*rxrpc_notify_new_call_t)(struct sock *, struct rxrpc_call *,
                                        unsigned long);
 typedef void (*rxrpc_discard_new_call_t)(struct rxrpc_call *, unsigned long);
                                           gfp_t,
                                           rxrpc_notify_rx_t);
 int rxrpc_kernel_send_data(struct socket *, struct rxrpc_call *,
-                          struct msghdr *, size_t);
+                          struct msghdr *, size_t,
+                          rxrpc_notify_end_tx_t);
 int rxrpc_kernel_recv_data(struct socket *, struct rxrpc_call *,
                           void *, size_t, size_t *, bool, u32 *);
 bool rxrpc_kernel_abort_call(struct socket *, struct rxrpc_call *,
 
        spin_unlock_bh(&call->lock);
 }
 
+/*
+ * Notify the owner of the call that the transmit phase is ended and the last
+ * packet has been queued.
+ */
+static void rxrpc_notify_end_tx(struct rxrpc_sock *rx, struct rxrpc_call *call,
+                               rxrpc_notify_end_tx_t notify_end_tx)
+{
+       if (notify_end_tx)
+               notify_end_tx(&rx->sk, call, call->user_call_ID);
+}
+
 /*
  * Queue a DATA packet for transmission, set the resend timeout and send the
  * packet immediately
  */
-static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,
-                              bool last)
+static void rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call,
+                              struct sk_buff *skb, bool last,
+                              rxrpc_notify_end_tx_t notify_end_tx)
 {
        struct rxrpc_skb_priv *sp = rxrpc_skb(skb);
        rxrpc_seq_t seq = sp->hdr.seq;
                switch (call->state) {
                case RXRPC_CALL_CLIENT_SEND_REQUEST:
                        call->state = RXRPC_CALL_CLIENT_AWAIT_REPLY;
+                       rxrpc_notify_end_tx(rx, call, notify_end_tx);
                        break;
                case RXRPC_CALL_SERVER_ACK_REQUEST:
                        call->state = RXRPC_CALL_SERVER_SEND_REPLY;
                                break;
                case RXRPC_CALL_SERVER_SEND_REPLY:
                        call->state = RXRPC_CALL_SERVER_AWAIT_ACK;
+                       rxrpc_notify_end_tx(rx, call, notify_end_tx);
                        break;
                default:
                        break;
  */
 static int rxrpc_send_data(struct rxrpc_sock *rx,
                           struct rxrpc_call *call,
-                          struct msghdr *msg, size_t len)
+                          struct msghdr *msg, size_t len,
+                          rxrpc_notify_end_tx_t notify_end_tx)
 {
        struct rxrpc_skb_priv *sp;
        struct sk_buff *skb;
                        if (ret < 0)
                                goto out;
 
-                       rxrpc_queue_packet(call, skb, !msg_data_left(msg) && !more);
+                       rxrpc_queue_packet(rx, call, skb,
+                                          !msg_data_left(msg) && !more,
+                                          notify_end_tx);
                        skb = NULL;
                }
        } while (msg_data_left(msg) > 0);
                /* Reply phase not begun or not complete for service call. */
                ret = -EPROTO;
        } else {
-               ret = rxrpc_send_data(rx, call, msg, len);
+               ret = rxrpc_send_data(rx, call, msg, len, NULL);
        }
 
        mutex_unlock(&call->user_mutex);
  * @call: The call to send data through
  * @msg: The data to send
  * @len: The amount of data to send
+ * @notify_end_tx: Notification that the last packet is queued.
  *
  * Allow a kernel service to send data on a call.  The call must be in an state
  * appropriate to sending data.  No control data should be supplied in @msg,
  * more data to come, otherwise this data will end the transmission phase.
  */
 int rxrpc_kernel_send_data(struct socket *sock, struct rxrpc_call *call,
-                          struct msghdr *msg, size_t len)
+                          struct msghdr *msg, size_t len,
+                          rxrpc_notify_end_tx_t notify_end_tx)
 {
        int ret;
 
        case RXRPC_CALL_CLIENT_SEND_REQUEST:
        case RXRPC_CALL_SERVER_ACK_REQUEST:
        case RXRPC_CALL_SERVER_SEND_REPLY:
-               ret = rxrpc_send_data(rxrpc_sk(sock->sk), call, msg, len);
+               ret = rxrpc_send_data(rxrpc_sk(sock->sk), call, msg, len,
+                                     notify_end_tx);
                break;
        case RXRPC_CALL_COMPLETE:
                read_lock_bh(&call->state_lock);