• David Howells's avatar
    rxrpc, afs: Allow afs to pin rxrpc_peer objects · 72904d7b
    David Howells authored
    Change rxrpc's API such that:
    
     (1) A new function, rxrpc_kernel_lookup_peer(), is provided to look up an
         rxrpc_peer record for a remote address and a corresponding function,
         rxrpc_kernel_put_peer(), is provided to dispose of it again.
    
     (2) When setting up a call, the rxrpc_peer object used during a call is
         now passed in rather than being set up by rxrpc_connect_call().  For
         afs, this meenat passing it to rxrpc_kernel_begin_call() rather than
         the full address (the service ID then has to be passed in as a
         separate parameter).
    
     (3) A new function, rxrpc_kernel_remote_addr(), is added so that afs can
         get a pointer to the transport address for display purposed, and
         another, rxrpc_kernel_remote_srx(), to gain a pointer to the full
         rxrpc address.
    
     (4) The function to retrieve the RTT from a call, rxrpc_kernel_get_srtt(),
         is then altered to take a peer.  This now returns the RTT or -1 if
         there are insufficient samples.
    
     (5) Rename rxrpc_kernel_get_peer() to rxrpc_kernel_call_get_peer().
    
     (6) Provide a new function, rxrpc_kernel_get_peer(), to get a ref on a
         peer the caller already has.
    
    This allows the afs filesystem to pin the rxrpc_peer records that it is
    using, allowing faster lookups and pointer comparisons rather than
    comparing sockaddr_rxrpc contents.  It also makes it easier to get hold of
    the RTT.  The following changes are made to afs:
    
     (1) The addr_list struct's addrs[] elements now hold a peer struct pointer
         and a service ID rather than a sockaddr_rxrpc.
    
     (2) When displaying the transport address, rxrpc_kernel_remote_addr() is
         used.
    
     (3) The port arg is removed from afs_alloc_addrlist() since it's always
         overridden.
    
     (4) afs_merge_fs_addr4() and afs_merge_fs_addr6() do peer lookup and may
         now return an error that must be handled.
    
     (5) afs_find_server() now takes a peer pointer to specify the address.
    
     (6) afs_find_server(), afs_compare_fs_alists() and afs_merge_fs_addr[46]{}
         now do peer pointer comparison rather than address comparison.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: Marc Dionne <marc.dionne@auristor.com>
    cc: linux-afs@lists.infradead.org
    72904d7b
rxrpc.h 60.3 KB