if (rx->discard_new_call) {
                        _debug("discard %lx", call->user_call_ID);
                        rx->discard_new_call(call, call->user_call_ID);
+                       rxrpc_put_call(call, rxrpc_call_put_kernel);
                }
                rxrpc_call_completed(call);
                rxrpc_release_call(rx, call);
        if (call->state == RXRPC_CALL_SERVER_ACCEPTING)
                rxrpc_notify_socket(call);
 
+       /* We have to discard the prealloc queue's ref here and rely on a
+        * combination of the RCU read lock and refs held either by the socket
+        * (recvmsg queue, to-be-accepted queue or user ID tree) or the kernel
+        * service to prevent the call from being deallocated too early.
+        */
+       rxrpc_put_call(call, rxrpc_call_put);
+
        _leave(" = %p{%d}", call, call->debug_id);
 out:
        spin_unlock(&rx->incoming_lock);
        }
 
        /* formalise the acceptance */
-       rxrpc_get_call(call, rxrpc_call_got);
        call->notify_rx = notify_rx;
        call->user_call_ID = user_call_ID;
        rxrpc_get_call(call, rxrpc_call_got_userid);
 
                call->rxtx_buffer[i] = NULL;
        }
 
-       /* We have to release the prealloc backlog ref */
-       if (rxrpc_is_service_call(call))
-               rxrpc_put_call(call, rxrpc_call_put);
        _leave("");
 }
 
 
                list_del_init(&call->recvmsg_link);
                write_unlock_bh(&rx->recvmsg_lock);
 
+               rxrpc_get_call(call, rxrpc_call_got);
                write_lock(&rx->call_lock);
                list_add_tail(&call->accept_link, &rx->to_be_accepted);
                write_unlock(&rx->call_lock);