• David Howells's avatar
    rxrpc: Fix prealloc refcounting · 3432a757
    David Howells authored
    The preallocated call buffer holds a ref on the calls within that buffer.
    The ref was being released in the wrong place - it worked okay for incoming
    calls to the AFS cache manager service, but doesn't work right for incoming
    calls to a userspace service.
    
    Instead of releasing an extra ref service calls in rxrpc_release_call(),
    the ref needs to be released during the acceptance/rejectance process.  To
    this end:
    
     (1) The prealloc ref is now normally released during
         rxrpc_new_incoming_call().
    
     (2) For preallocated kernel API calls, the kernel API's ref needs to be
         released when the call is discarded on socket close.
    
     (3) We shouldn't take a second ref in rxrpc_accept_call().
    
     (4) rxrpc_recvmsg_new_call() needs to get a ref of its own when it adds
         the call to the to_be_accepted socket queue.
    
    In doing (4) above, we would prefer not to put the call's refcount down to
    0 as that entails doing cleanup in softirq context, but it's unlikely as
    there are several refs held elsewhere, at least one of which must be put by
    someone in process context calling rxrpc_release_call().  However, it's not
    a problem if we do have to do that.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    3432a757
recvmsg.c 15.4 KB