afs: Turn the afs_addr_list address array into an array of structs

Turn the afs_addr_list address array into an array of structs, thereby
allowing per-address (such as RTT) info to be added.

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:
David Howells 2023-10-18 15:38:14 +01:00
parent fe245c8fcd
commit 07f3502b33
10 changed files with 26 additions and 22 deletions

View file

@ -45,7 +45,7 @@ struct afs_addr_list *afs_alloc_addrlist(unsigned int nr,
alist->max_addrs = nr; alist->max_addrs = nr;
for (i = 0; i < nr; i++) { for (i = 0; i < nr; i++) {
struct sockaddr_rxrpc *srx = &alist->addrs[i]; struct sockaddr_rxrpc *srx = &alist->addrs[i].srx;
srx->srx_family = AF_RXRPC; srx->srx_family = AF_RXRPC;
srx->srx_service = service; srx->srx_service = service;
srx->transport_type = SOCK_DGRAM; srx->transport_type = SOCK_DGRAM;
@ -281,7 +281,7 @@ void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port)
return; return;
for (i = 0; i < alist->nr_ipv4; i++) { for (i = 0; i < alist->nr_ipv4; i++) {
struct sockaddr_in *a = &alist->addrs[i].transport.sin; struct sockaddr_in *a = &alist->addrs[i].srx.transport.sin;
u32 a_addr = ntohl(a->sin_addr.s_addr); u32 a_addr = ntohl(a->sin_addr.s_addr);
u16 a_port = ntohs(a->sin_port); u16 a_port = ntohs(a->sin_port);
@ -298,7 +298,7 @@ void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port)
alist->addrs + i, alist->addrs + i,
sizeof(alist->addrs[0]) * (alist->nr_addrs - i)); sizeof(alist->addrs[0]) * (alist->nr_addrs - i));
srx = &alist->addrs[i]; srx = &alist->addrs[i].srx;
srx->srx_family = AF_RXRPC; srx->srx_family = AF_RXRPC;
srx->transport_type = SOCK_DGRAM; srx->transport_type = SOCK_DGRAM;
srx->transport_len = sizeof(srx->transport.sin); srx->transport_len = sizeof(srx->transport.sin);
@ -321,7 +321,7 @@ void afs_merge_fs_addr6(struct afs_addr_list *alist, __be32 *xdr, u16 port)
return; return;
for (i = alist->nr_ipv4; i < alist->nr_addrs; i++) { for (i = alist->nr_ipv4; i < alist->nr_addrs; i++) {
struct sockaddr_in6 *a = &alist->addrs[i].transport.sin6; struct sockaddr_in6 *a = &alist->addrs[i].srx.transport.sin6;
u16 a_port = ntohs(a->sin6_port); u16 a_port = ntohs(a->sin6_port);
diff = memcmp(xdr, &a->sin6_addr, 16); diff = memcmp(xdr, &a->sin6_addr, 16);
@ -338,7 +338,7 @@ void afs_merge_fs_addr6(struct afs_addr_list *alist, __be32 *xdr, u16 port)
alist->addrs + i, alist->addrs + i,
sizeof(alist->addrs[0]) * (alist->nr_addrs - i)); sizeof(alist->addrs[0]) * (alist->nr_addrs - i));
srx = &alist->addrs[i]; srx = &alist->addrs[i].srx;
srx->srx_family = AF_RXRPC; srx->srx_family = AF_RXRPC;
srx->transport_type = SOCK_DGRAM; srx->transport_type = SOCK_DGRAM;
srx->transport_len = sizeof(srx->transport.sin6); srx->transport_len = sizeof(srx->transport.sin6);

View file

@ -153,12 +153,12 @@ void afs_fileserver_probe_result(struct afs_call *call)
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);
alist->addrs[index].srx_service = call->service_id; alist->addrs[index].srx.srx_service = 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);
alist->addrs[index].srx_service = call->service_id; alist->addrs[index].srx.srx_service = call->service_id;
} }
cap0 = ntohl(call->tmp); cap0 = ntohl(call->tmp);
if (cap0 & AFS3_VICED_CAPABILITY_64BITFILES) if (cap0 & AFS3_VICED_CAPABILITY_64BITFILES)
@ -182,7 +182,7 @@ void afs_fileserver_probe_result(struct afs_call *call)
spin_unlock(&server->probe_lock); spin_unlock(&server->probe_lock);
_debug("probe %pU [%u] %pISpc rtt=%u ret=%d", _debug("probe %pU [%u] %pISpc rtt=%u ret=%d",
&server->uuid, index, &alist->addrs[index].transport, &server->uuid, index, &alist->addrs[index].srx.transport,
rtt_us, ret); rtt_us, ret);
return afs_done_one_fs_probe(call->net, server); return afs_done_one_fs_probe(call->net, server);

View file

@ -87,7 +87,9 @@ struct afs_addr_list {
enum dns_lookup_status status:8; enum dns_lookup_status status:8;
unsigned long failed; /* Mask of addrs that failed locally/ICMP */ unsigned long failed; /* Mask of addrs that failed locally/ICMP */
unsigned long responded; /* Mask of addrs that responded */ unsigned long responded; /* Mask of addrs that responded */
struct sockaddr_rxrpc addrs[] __counted_by(max_addrs); struct {
struct sockaddr_rxrpc srx;
} addrs[] __counted_by(max_addrs);
#define AFS_MAX_ADDRESSES ((unsigned int)(sizeof(unsigned long) * 8)) #define AFS_MAX_ADDRESSES ((unsigned int)(sizeof(unsigned long) * 8))
}; };
@ -969,6 +971,8 @@ extern void afs_put_addrlist(struct afs_addr_list *);
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,
unsigned short, unsigned short); unsigned short, unsigned short);
bool afs_addr_list_same(const struct afs_addr_list *a,
const struct afs_addr_list *b);
extern struct afs_vlserver_list *afs_dns_query(struct afs_cell *, time64_t *); extern struct afs_vlserver_list *afs_dns_query(struct afs_cell *, time64_t *);
extern bool afs_iterate_addresses(struct afs_addr_cursor *); extern bool afs_iterate_addresses(struct afs_addr_cursor *);
extern int afs_end_cursor(struct afs_addr_cursor *); extern int afs_end_cursor(struct afs_addr_cursor *);

View file

@ -307,7 +307,7 @@ static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v)
for (i = 0; i < alist->nr_addrs; i++) for (i = 0; i < alist->nr_addrs; i++)
seq_printf(m, " %c %pISpc\n", seq_printf(m, " %c %pISpc\n",
alist->preferred == i ? '>' : '-', alist->preferred == i ? '>' : '-',
&alist->addrs[i].transport); &alist->addrs[i].srx.transport);
} }
seq_printf(m, " info: fl=%lx rtt=%d\n", vlserver->flags, vlserver->rtt); seq_printf(m, " info: fl=%lx rtt=%d\n", vlserver->flags, vlserver->rtt);
seq_printf(m, " probe: fl=%x e=%d ac=%d out=%d\n", seq_printf(m, " probe: fl=%x e=%d ac=%d out=%d\n",
@ -399,7 +399,7 @@ static int afs_proc_servers_show(struct seq_file *m, void *v)
alist->version, alist->responded, alist->failed); alist->version, alist->responded, alist->failed);
for (i = 0; i < alist->nr_addrs; i++) for (i = 0; i < alist->nr_addrs; i++)
seq_printf(m, " [%x] %pISpc%s\n", seq_printf(m, " [%x] %pISpc%s\n",
i, &alist->addrs[i].transport, i, &alist->addrs[i].srx.transport,
alist->preferred == i ? "*" : ""); alist->preferred == i ? "*" : "");
return 0; return 0;
} }

View file

@ -488,7 +488,7 @@ bool afs_select_fileserver(struct afs_operation *op)
_debug("address [%u] %u/%u %pISp", _debug("address [%u] %u/%u %pISp",
op->index, op->ac.index, op->ac.alist->nr_addrs, op->index, op->ac.index, op->ac.alist->nr_addrs,
&op->ac.alist->addrs[op->ac.index].transport); &op->ac.alist->addrs[op->ac.index].srx.transport);
_leave(" = t"); _leave(" = t");
return true; return true;

View file

@ -296,7 +296,7 @@ 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 sockaddr_rxrpc *srx = &ac->alist->addrs[ac->index]; struct sockaddr_rxrpc *srx = &ac->alist->addrs[ac->index].srx;
struct rxrpc_call *rxcall; struct rxrpc_call *rxcall;
struct msghdr msg; struct msghdr msg;
struct kvec iov[1]; struct kvec iov[1];
@ -461,7 +461,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,
&call->alist->addrs[call->addr_ix].transport); &call->alist->addrs[call->addr_ix].srx.transport);
} }
} }

View file

@ -43,7 +43,7 @@ struct afs_server *afs_find_server(struct afs_net *net,
hlist_for_each_entry_rcu(server, &net->fs_addresses6, addr6_link) { hlist_for_each_entry_rcu(server, &net->fs_addresses6, addr6_link) {
alist = rcu_dereference(server->addresses); alist = rcu_dereference(server->addresses);
for (i = alist->nr_ipv4; i < alist->nr_addrs; i++) { for (i = alist->nr_ipv4; i < alist->nr_addrs; i++) {
b = &alist->addrs[i].transport.sin6; b = &alist->addrs[i].srx.transport.sin6;
diff = ((u16 __force)a->sin6_port - diff = ((u16 __force)a->sin6_port -
(u16 __force)b->sin6_port); (u16 __force)b->sin6_port);
if (diff == 0) if (diff == 0)
@ -59,7 +59,7 @@ struct afs_server *afs_find_server(struct afs_net *net,
hlist_for_each_entry_rcu(server, &net->fs_addresses4, addr4_link) { hlist_for_each_entry_rcu(server, &net->fs_addresses4, addr4_link) {
alist = rcu_dereference(server->addresses); alist = rcu_dereference(server->addresses);
for (i = 0; i < alist->nr_ipv4; i++) { for (i = 0; i < alist->nr_ipv4; i++) {
b = &alist->addrs[i].transport.sin; b = &alist->addrs[i].srx.transport.sin;
diff = ((u16 __force)a->sin_port - diff = ((u16 __force)a->sin_port -
(u16 __force)b->sin_port); (u16 __force)b->sin_port);
if (diff == 0) if (diff == 0)

View file

@ -94,8 +94,8 @@ static int afs_compare_fs_alists(const struct afs_server *server_a,
lb = rcu_dereference(server_b->addresses); lb = rcu_dereference(server_b->addresses);
while (a < la->nr_addrs && b < lb->nr_addrs) { while (a < la->nr_addrs && b < lb->nr_addrs) {
const struct sockaddr_rxrpc *srx_a = &la->addrs[a]; const struct sockaddr_rxrpc *srx_a = &la->addrs[a].srx;
const struct sockaddr_rxrpc *srx_b = &lb->addrs[b]; const struct sockaddr_rxrpc *srx_b = &lb->addrs[b].srx;
int diff = afs_compare_addrs(srx_a, srx_b); int diff = afs_compare_addrs(srx_a, srx_b);
if (diff < 0) { if (diff < 0) {

View file

@ -106,12 +106,12 @@ void afs_vlserver_probe_result(struct afs_call *call)
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);
alist->addrs[index].srx_service = call->service_id; alist->addrs[index].srx.srx_service = 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);
alist->addrs[index].srx_service = call->service_id; alist->addrs[index].srx.srx_service = call->service_id;
} }
} }
@ -131,7 +131,7 @@ void afs_vlserver_probe_result(struct afs_call *call)
spin_unlock(&server->probe_lock); spin_unlock(&server->probe_lock);
_debug("probe [%u][%u] %pISpc rtt=%u ret=%d", _debug("probe [%u][%u] %pISpc rtt=%u ret=%d",
server_index, index, &alist->addrs[index].transport, rtt_us, ret); server_index, index, &alist->addrs[index].srx.transport, rtt_us, ret);
afs_done_one_vl_probe(server, have_result); afs_done_one_vl_probe(server, have_result);
} }

View file

@ -249,7 +249,7 @@ bool afs_select_vlserver(struct afs_vl_cursor *vc)
_debug("VL address %d/%d", vc->ac.index, vc->ac.alist->nr_addrs); _debug("VL address %d/%d", vc->ac.index, vc->ac.alist->nr_addrs);
_leave(" = t %pISpc", &vc->ac.alist->addrs[vc->ac.index].transport); _leave(" = t %pISpc", &vc->ac.alist->addrs[vc->ac.index].srx.transport);
return true; return true;
next_server: next_server: