afs: Use peer + service_id as call address
Use the rxrpc_peer plus the service ID as the call address instead of passing in a sockaddr_srx down to rxrpc. The peer record is obtained by using rxrpc_kernel_get_peer(). This avoids the need to repeatedly look up the peer and allows rxrpc to hold on to resources for it. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: linux-afs@lists.infradead.org
This commit is contained in:
parent
905b861564
commit
e38f299ece
@ -56,13 +56,12 @@ struct afs_addr_list *afs_get_addrlist(struct afs_addr_list *alist, enum afs_ali
|
|||||||
/*
|
/*
|
||||||
* Allocate an address list.
|
* Allocate an address list.
|
||||||
*/
|
*/
|
||||||
struct afs_addr_list *afs_alloc_addrlist(unsigned int nr, u16 service_id)
|
struct afs_addr_list *afs_alloc_addrlist(unsigned int nr)
|
||||||
{
|
{
|
||||||
struct afs_addr_list *alist;
|
struct afs_addr_list *alist;
|
||||||
unsigned int i;
|
|
||||||
static atomic_t debug_id;
|
static atomic_t debug_id;
|
||||||
|
|
||||||
_enter("%u,%u", nr, service_id);
|
_enter("%u", nr);
|
||||||
|
|
||||||
if (nr > AFS_MAX_ADDRESSES)
|
if (nr > AFS_MAX_ADDRESSES)
|
||||||
nr = AFS_MAX_ADDRESSES;
|
nr = AFS_MAX_ADDRESSES;
|
||||||
@ -74,9 +73,6 @@ struct afs_addr_list *afs_alloc_addrlist(unsigned int nr, u16 service_id)
|
|||||||
refcount_set(&alist->usage, 1);
|
refcount_set(&alist->usage, 1);
|
||||||
alist->max_addrs = nr;
|
alist->max_addrs = nr;
|
||||||
alist->debug_id = atomic_inc_return(&debug_id);
|
alist->debug_id = atomic_inc_return(&debug_id);
|
||||||
|
|
||||||
for (i = 0; i < nr; i++)
|
|
||||||
alist->addrs[i].service_id = service_id;
|
|
||||||
trace_afs_alist(alist->debug_id, 1, afs_alist_trace_alloc);
|
trace_afs_alist(alist->debug_id, 1, afs_alist_trace_alloc);
|
||||||
return alist;
|
return alist;
|
||||||
}
|
}
|
||||||
@ -150,7 +146,7 @@ struct afs_vlserver_list *afs_parse_text_addrs(struct afs_net *net,
|
|||||||
if (!vllist->servers[0].server)
|
if (!vllist->servers[0].server)
|
||||||
goto error_vl;
|
goto error_vl;
|
||||||
|
|
||||||
alist = afs_alloc_addrlist(nr, service);
|
alist = afs_alloc_addrlist(nr);
|
||||||
if (!alist)
|
if (!alist)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
@ -154,12 +154,12 @@ responded:
|
|||||||
if (call->service_id == YFS_FS_SERVICE) {
|
if (call->service_id == YFS_FS_SERVICE) {
|
||||||
server->probe.is_yfs = true;
|
server->probe.is_yfs = true;
|
||||||
set_bit(AFS_SERVER_FL_IS_YFS, &server->flags);
|
set_bit(AFS_SERVER_FL_IS_YFS, &server->flags);
|
||||||
addr->service_id = call->service_id;
|
server->service_id = call->service_id;
|
||||||
} else {
|
} else {
|
||||||
server->probe.not_yfs = true;
|
server->probe.not_yfs = true;
|
||||||
if (!server->probe.is_yfs) {
|
if (!server->probe.is_yfs) {
|
||||||
clear_bit(AFS_SERVER_FL_IS_YFS, &server->flags);
|
clear_bit(AFS_SERVER_FL_IS_YFS, &server->flags);
|
||||||
addr->service_id = call->service_id;
|
server->service_id = call->service_id;
|
||||||
}
|
}
|
||||||
cap0 = ntohl(call->tmp);
|
cap0 = ntohl(call->tmp);
|
||||||
if (cap0 & AFS3_VICED_CAPABILITY_64BITFILES)
|
if (cap0 & AFS3_VICED_CAPABILITY_64BITFILES)
|
||||||
|
@ -1620,7 +1620,9 @@ int afs_fs_give_up_all_callbacks(struct afs_net *net,
|
|||||||
if (!call)
|
if (!call)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
call->key = key;
|
call->key = key;
|
||||||
|
call->peer = rxrpc_kernel_get_peer(ac->alist->addrs[ac->index].peer);
|
||||||
|
call->service_id = server->service_id;
|
||||||
|
|
||||||
/* marshall the parameters */
|
/* marshall the parameters */
|
||||||
bp = call->request;
|
bp = call->request;
|
||||||
@ -1722,10 +1724,12 @@ bool afs_fs_get_capabilities(struct afs_net *net, struct afs_server *server,
|
|||||||
if (!call)
|
if (!call)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
call->key = key;
|
call->key = key;
|
||||||
call->server = afs_use_server(server, afs_server_trace_get_caps);
|
call->server = afs_use_server(server, afs_server_trace_get_caps);
|
||||||
call->upgrade = true;
|
call->peer = rxrpc_kernel_get_peer(ac->alist->addrs[ac->index].peer);
|
||||||
call->async = true;
|
call->service_id = server->service_id;
|
||||||
|
call->upgrade = true;
|
||||||
|
call->async = true;
|
||||||
call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
|
call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
|
||||||
|
|
||||||
/* marshall the parameters */
|
/* marshall the parameters */
|
||||||
|
@ -74,7 +74,6 @@ enum afs_call_state {
|
|||||||
|
|
||||||
struct afs_address {
|
struct afs_address {
|
||||||
struct rxrpc_peer *peer;
|
struct rxrpc_peer *peer;
|
||||||
u16 service_id;
|
|
||||||
short last_error; /* Last error from this address */
|
short last_error; /* Last error from this address */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -108,6 +107,7 @@ struct afs_call {
|
|||||||
struct work_struct async_work; /* async I/O processor */
|
struct work_struct async_work; /* async I/O processor */
|
||||||
struct work_struct work; /* actual work processor */
|
struct work_struct work; /* actual work processor */
|
||||||
struct rxrpc_call *rxcall; /* RxRPC call handle */
|
struct rxrpc_call *rxcall; /* RxRPC call handle */
|
||||||
|
struct rxrpc_peer *peer; /* Remote endpoint */
|
||||||
struct key *key; /* security for this call */
|
struct key *key; /* security for this call */
|
||||||
struct afs_net *net; /* The network namespace */
|
struct afs_net *net; /* The network namespace */
|
||||||
struct afs_server *server; /* The fileserver record if fs op (pins ref) */
|
struct afs_server *server; /* The fileserver record if fs op (pins ref) */
|
||||||
@ -435,6 +435,7 @@ struct afs_vlserver {
|
|||||||
#define AFS_VLSERVER_PROBE_LOCAL_FAILURE 0x08 /* A local failure prevented a probe */
|
#define AFS_VLSERVER_PROBE_LOCAL_FAILURE 0x08 /* A local failure prevented a probe */
|
||||||
} probe;
|
} probe;
|
||||||
|
|
||||||
|
u16 service_id; /* Service ID we're using */
|
||||||
u16 port;
|
u16 port;
|
||||||
u16 name_len; /* Length of name */
|
u16 name_len; /* Length of name */
|
||||||
char name[]; /* Server name, case-flattened */
|
char name[]; /* Server name, case-flattened */
|
||||||
@ -527,6 +528,7 @@ struct afs_server {
|
|||||||
refcount_t ref; /* Object refcount */
|
refcount_t ref; /* Object refcount */
|
||||||
atomic_t active; /* Active user count */
|
atomic_t active; /* Active user count */
|
||||||
u32 addr_version; /* Address list version */
|
u32 addr_version; /* Address list version */
|
||||||
|
u16 service_id; /* Service ID we're using. */
|
||||||
unsigned int rtt; /* Server's current RTT in uS */
|
unsigned int rtt; /* Server's current RTT in uS */
|
||||||
unsigned int debug_id; /* Debugging ID for traces */
|
unsigned int debug_id; /* Debugging ID for traces */
|
||||||
|
|
||||||
@ -971,7 +973,7 @@ static inline bool afs_is_folio_dirty_mmapped(unsigned long priv)
|
|||||||
* addr_list.c
|
* addr_list.c
|
||||||
*/
|
*/
|
||||||
struct afs_addr_list *afs_get_addrlist(struct afs_addr_list *alist, enum afs_alist_trace reason);
|
struct afs_addr_list *afs_get_addrlist(struct afs_addr_list *alist, enum afs_alist_trace reason);
|
||||||
extern struct afs_addr_list *afs_alloc_addrlist(unsigned int nr, u16 service_id);
|
extern struct afs_addr_list *afs_alloc_addrlist(unsigned int nr);
|
||||||
extern void afs_put_addrlist(struct afs_addr_list *alist, enum afs_alist_trace reason);
|
extern void afs_put_addrlist(struct afs_addr_list *alist, enum afs_alist_trace reason);
|
||||||
extern struct afs_vlserver_list *afs_parse_text_addrs(struct afs_net *,
|
extern struct afs_vlserver_list *afs_parse_text_addrs(struct afs_net *,
|
||||||
const char *, size_t, char,
|
const char *, size_t, char,
|
||||||
@ -1318,11 +1320,13 @@ extern int afs_protocol_error(struct afs_call *, enum afs_eproto_cause);
|
|||||||
static inline void afs_make_op_call(struct afs_operation *op, struct afs_call *call,
|
static inline void afs_make_op_call(struct afs_operation *op, struct afs_call *call,
|
||||||
gfp_t gfp)
|
gfp_t gfp)
|
||||||
{
|
{
|
||||||
op->call = call;
|
op->call = call;
|
||||||
op->type = call->type;
|
op->type = call->type;
|
||||||
call->op = op;
|
call->op = op;
|
||||||
call->key = op->key;
|
call->key = op->key;
|
||||||
call->intr = !(op->flags & AFS_OPERATION_UNINTR);
|
call->intr = !(op->flags & AFS_OPERATION_UNINTR);
|
||||||
|
call->peer = rxrpc_kernel_get_peer(op->ac.alist->addrs[op->ac.index].peer);
|
||||||
|
call->service_id = op->server->service_id;
|
||||||
afs_make_call(&op->ac, call, gfp);
|
afs_make_call(&op->ac, call, gfp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,6 +178,8 @@ void afs_put_call(struct afs_call *call)
|
|||||||
ASSERT(!work_pending(&call->async_work));
|
ASSERT(!work_pending(&call->async_work));
|
||||||
ASSERT(call->type->name != NULL);
|
ASSERT(call->type->name != NULL);
|
||||||
|
|
||||||
|
rxrpc_kernel_put_peer(call->peer);
|
||||||
|
|
||||||
if (call->rxcall) {
|
if (call->rxcall) {
|
||||||
rxrpc_kernel_shutdown_call(net->socket, call->rxcall);
|
rxrpc_kernel_shutdown_call(net->socket, call->rxcall);
|
||||||
rxrpc_kernel_put_call(net->socket, call->rxcall);
|
rxrpc_kernel_put_call(net->socket, call->rxcall);
|
||||||
@ -296,8 +298,6 @@ static void afs_notify_end_request_tx(struct sock *sock,
|
|||||||
*/
|
*/
|
||||||
void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp)
|
void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct afs_address *addr = &ac->alist->addrs[ac->index];
|
|
||||||
struct rxrpc_peer *peer = addr->peer;
|
|
||||||
struct rxrpc_call *rxcall;
|
struct rxrpc_call *rxcall;
|
||||||
struct msghdr msg;
|
struct msghdr msg;
|
||||||
struct kvec iov[1];
|
struct kvec iov[1];
|
||||||
@ -305,7 +305,7 @@ void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp)
|
|||||||
s64 tx_total_len;
|
s64 tx_total_len;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
_enter(",{%pISp},", rxrpc_kernel_remote_addr(addr->peer));
|
_enter(",{%pISp+%u},", rxrpc_kernel_remote_addr(call->peer), call->service_id);
|
||||||
|
|
||||||
ASSERT(call->type != NULL);
|
ASSERT(call->type != NULL);
|
||||||
ASSERT(call->type->name != NULL);
|
ASSERT(call->type->name != NULL);
|
||||||
@ -334,7 +334,7 @@ void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* create a call */
|
/* create a call */
|
||||||
rxcall = rxrpc_kernel_begin_call(call->net->socket, peer, call->key,
|
rxcall = rxrpc_kernel_begin_call(call->net->socket, call->peer, call->key,
|
||||||
(unsigned long)call,
|
(unsigned long)call,
|
||||||
tx_total_len,
|
tx_total_len,
|
||||||
call->max_lifespan,
|
call->max_lifespan,
|
||||||
@ -342,7 +342,7 @@ void afs_make_call(struct afs_addr_cursor *ac, struct afs_call *call, gfp_t gfp)
|
|||||||
(call->async ?
|
(call->async ?
|
||||||
afs_wake_up_async_call :
|
afs_wake_up_async_call :
|
||||||
afs_wake_up_call_waiter),
|
afs_wake_up_call_waiter),
|
||||||
addr->service_id,
|
call->service_id,
|
||||||
call->upgrade,
|
call->upgrade,
|
||||||
(call->intr ? RXRPC_PREINTERRUPTIBLE :
|
(call->intr ? RXRPC_PREINTERRUPTIBLE :
|
||||||
RXRPC_UNINTERRUPTIBLE),
|
RXRPC_UNINTERRUPTIBLE),
|
||||||
@ -462,7 +462,7 @@ static void afs_log_error(struct afs_call *call, s32 remote_abort)
|
|||||||
max = m + 1;
|
max = m + 1;
|
||||||
pr_notice("kAFS: Peer reported %s failure on %s [%pISp]\n",
|
pr_notice("kAFS: Peer reported %s failure on %s [%pISp]\n",
|
||||||
msg, call->type->name,
|
msg, call->type->name,
|
||||||
rxrpc_kernel_remote_addr(call->alist->addrs[call->addr_ix].peer));
|
rxrpc_kernel_remote_addr(call->peer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,6 +215,7 @@ static struct afs_server *afs_alloc_server(struct afs_cell *cell,
|
|||||||
spin_lock_init(&server->probe_lock);
|
spin_lock_init(&server->probe_lock);
|
||||||
server->cell = cell;
|
server->cell = cell;
|
||||||
server->rtt = UINT_MAX;
|
server->rtt = UINT_MAX;
|
||||||
|
server->service_id = FS_SERVICE;
|
||||||
|
|
||||||
afs_inc_servers_outstanding(net);
|
afs_inc_servers_outstanding(net);
|
||||||
trace_afs_server(server->debug_id, 1, 1, afs_server_trace_alloc);
|
trace_afs_server(server->debug_id, 1, 1, afs_server_trace_alloc);
|
||||||
|
@ -23,6 +23,7 @@ struct afs_vlserver *afs_alloc_vlserver(const char *name, size_t name_len,
|
|||||||
spin_lock_init(&vlserver->probe_lock);
|
spin_lock_init(&vlserver->probe_lock);
|
||||||
vlserver->rtt = UINT_MAX;
|
vlserver->rtt = UINT_MAX;
|
||||||
vlserver->name_len = name_len;
|
vlserver->name_len = name_len;
|
||||||
|
vlserver->service_id = VL_SERVICE;
|
||||||
vlserver->port = port;
|
vlserver->port = port;
|
||||||
memcpy(vlserver->name, name, name_len);
|
memcpy(vlserver->name, name, name_len);
|
||||||
}
|
}
|
||||||
@ -92,7 +93,7 @@ static struct afs_addr_list *afs_extract_vl_addrs(struct afs_net *net,
|
|||||||
const u8 *b = *_b;
|
const u8 *b = *_b;
|
||||||
int ret = -EINVAL;
|
int ret = -EINVAL;
|
||||||
|
|
||||||
alist = afs_alloc_addrlist(nr_addrs, VL_SERVICE);
|
alist = afs_alloc_addrlist(nr_addrs);
|
||||||
if (!alist)
|
if (!alist)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
if (nr_addrs == 0)
|
if (nr_addrs == 0)
|
||||||
|
@ -107,12 +107,12 @@ responded:
|
|||||||
if (call->service_id == YFS_VL_SERVICE) {
|
if (call->service_id == YFS_VL_SERVICE) {
|
||||||
server->probe.flags |= AFS_VLSERVER_PROBE_IS_YFS;
|
server->probe.flags |= AFS_VLSERVER_PROBE_IS_YFS;
|
||||||
set_bit(AFS_VLSERVER_FL_IS_YFS, &server->flags);
|
set_bit(AFS_VLSERVER_FL_IS_YFS, &server->flags);
|
||||||
addr->service_id = call->service_id;
|
server->service_id = call->service_id;
|
||||||
} else {
|
} else {
|
||||||
server->probe.flags |= AFS_VLSERVER_PROBE_NOT_YFS;
|
server->probe.flags |= AFS_VLSERVER_PROBE_NOT_YFS;
|
||||||
if (!(server->probe.flags & AFS_VLSERVER_PROBE_IS_YFS)) {
|
if (!(server->probe.flags & AFS_VLSERVER_PROBE_IS_YFS)) {
|
||||||
clear_bit(AFS_VLSERVER_FL_IS_YFS, &server->flags);
|
clear_bit(AFS_VLSERVER_FL_IS_YFS, &server->flags);
|
||||||
addr->service_id = call->service_id;
|
server->service_id = call->service_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,6 +149,8 @@ struct afs_vldb_entry *afs_vl_get_entry_by_name_u(struct afs_vl_cursor *vc,
|
|||||||
call->key = vc->key;
|
call->key = vc->key;
|
||||||
call->ret_vldb = entry;
|
call->ret_vldb = entry;
|
||||||
call->max_lifespan = AFS_VL_MAX_LIFESPAN;
|
call->max_lifespan = AFS_VL_MAX_LIFESPAN;
|
||||||
|
call->peer = rxrpc_kernel_get_peer(vc->ac.alist->addrs[vc->ac.index].peer);
|
||||||
|
call->service_id = vc->server->service_id;
|
||||||
|
|
||||||
/* Marshall the parameters */
|
/* Marshall the parameters */
|
||||||
bp = call->request;
|
bp = call->request;
|
||||||
@ -211,7 +213,7 @@ static int afs_deliver_vl_get_addrs_u(struct afs_call *call)
|
|||||||
count = ntohl(*bp);
|
count = ntohl(*bp);
|
||||||
|
|
||||||
nentries = min(nentries, count);
|
nentries = min(nentries, count);
|
||||||
alist = afs_alloc_addrlist(nentries, FS_SERVICE);
|
alist = afs_alloc_addrlist(nentries);
|
||||||
if (!alist)
|
if (!alist)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
alist->version = uniquifier;
|
alist->version = uniquifier;
|
||||||
@ -288,6 +290,8 @@ struct afs_addr_list *afs_vl_get_addrs_u(struct afs_vl_cursor *vc,
|
|||||||
call->key = vc->key;
|
call->key = vc->key;
|
||||||
call->ret_alist = NULL;
|
call->ret_alist = NULL;
|
||||||
call->max_lifespan = AFS_VL_MAX_LIFESPAN;
|
call->max_lifespan = AFS_VL_MAX_LIFESPAN;
|
||||||
|
call->peer = rxrpc_kernel_get_peer(vc->ac.alist->addrs[vc->ac.index].peer);
|
||||||
|
call->service_id = vc->server->service_id;
|
||||||
|
|
||||||
/* Marshall the parameters */
|
/* Marshall the parameters */
|
||||||
bp = call->request;
|
bp = call->request;
|
||||||
@ -407,6 +411,8 @@ struct afs_call *afs_vl_get_capabilities(struct afs_net *net,
|
|||||||
call->key = key;
|
call->key = key;
|
||||||
call->vlserver = afs_get_vlserver(server);
|
call->vlserver = afs_get_vlserver(server);
|
||||||
call->server_index = server_index;
|
call->server_index = server_index;
|
||||||
|
call->peer = rxrpc_kernel_get_peer(ac->alist->addrs[ac->index].peer);
|
||||||
|
call->service_id = server->service_id;
|
||||||
call->upgrade = true;
|
call->upgrade = true;
|
||||||
call->async = true;
|
call->async = true;
|
||||||
call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
|
call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
|
||||||
@ -462,7 +468,7 @@ static int afs_deliver_yfsvl_get_endpoints(struct afs_call *call)
|
|||||||
if (call->count > YFS_MAXENDPOINTS)
|
if (call->count > YFS_MAXENDPOINTS)
|
||||||
return afs_protocol_error(call, afs_eproto_yvl_fsendpt_num);
|
return afs_protocol_error(call, afs_eproto_yvl_fsendpt_num);
|
||||||
|
|
||||||
alist = afs_alloc_addrlist(call->count, FS_SERVICE);
|
alist = afs_alloc_addrlist(call->count);
|
||||||
if (!alist)
|
if (!alist)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
alist->version = uniquifier;
|
alist->version = uniquifier;
|
||||||
@ -652,6 +658,8 @@ struct afs_addr_list *afs_yfsvl_get_endpoints(struct afs_vl_cursor *vc,
|
|||||||
call->key = vc->key;
|
call->key = vc->key;
|
||||||
call->ret_alist = NULL;
|
call->ret_alist = NULL;
|
||||||
call->max_lifespan = AFS_VL_MAX_LIFESPAN;
|
call->max_lifespan = AFS_VL_MAX_LIFESPAN;
|
||||||
|
call->peer = rxrpc_kernel_get_peer(vc->ac.alist->addrs[vc->ac.index].peer);
|
||||||
|
call->service_id = vc->server->service_id;
|
||||||
|
|
||||||
/* Marshall the parameters */
|
/* Marshall the parameters */
|
||||||
bp = call->request;
|
bp = call->request;
|
||||||
@ -769,6 +777,8 @@ char *afs_yfsvl_get_cell_name(struct afs_vl_cursor *vc)
|
|||||||
call->key = vc->key;
|
call->key = vc->key;
|
||||||
call->ret_str = NULL;
|
call->ret_str = NULL;
|
||||||
call->max_lifespan = AFS_VL_MAX_LIFESPAN;
|
call->max_lifespan = AFS_VL_MAX_LIFESPAN;
|
||||||
|
call->peer = rxrpc_kernel_get_peer(vc->ac.alist->addrs[vc->ac.index].peer);
|
||||||
|
call->service_id = vc->server->service_id;
|
||||||
|
|
||||||
/* marshall the parameters */
|
/* marshall the parameters */
|
||||||
bp = call->request;
|
bp = call->request;
|
||||||
|
Loading…
Reference in New Issue
Block a user