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:
parent
fe245c8fcd
commit
07f3502b33
|
@ -45,7 +45,7 @@ struct afs_addr_list *afs_alloc_addrlist(unsigned int nr,
|
|||
alist->max_addrs = nr;
|
||||
|
||||
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_service = service;
|
||||
srx->transport_type = SOCK_DGRAM;
|
||||
|
@ -281,7 +281,7 @@ void afs_merge_fs_addr4(struct afs_addr_list *alist, __be32 xdr, u16 port)
|
|||
return;
|
||||
|
||||
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);
|
||||
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,
|
||||
sizeof(alist->addrs[0]) * (alist->nr_addrs - i));
|
||||
|
||||
srx = &alist->addrs[i];
|
||||
srx = &alist->addrs[i].srx;
|
||||
srx->srx_family = AF_RXRPC;
|
||||
srx->transport_type = SOCK_DGRAM;
|
||||
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;
|
||||
|
||||
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);
|
||||
|
||||
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,
|
||||
sizeof(alist->addrs[0]) * (alist->nr_addrs - i));
|
||||
|
||||
srx = &alist->addrs[i];
|
||||
srx = &alist->addrs[i].srx;
|
||||
srx->srx_family = AF_RXRPC;
|
||||
srx->transport_type = SOCK_DGRAM;
|
||||
srx->transport_len = sizeof(srx->transport.sin6);
|
||||
|
|
|
@ -153,12 +153,12 @@ responded:
|
|||
if (call->service_id == YFS_FS_SERVICE) {
|
||||
server->probe.is_yfs = true;
|
||||
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 {
|
||||
server->probe.not_yfs = true;
|
||||
if (!server->probe.is_yfs) {
|
||||
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);
|
||||
if (cap0 & AFS3_VICED_CAPABILITY_64BITFILES)
|
||||
|
@ -182,7 +182,7 @@ out:
|
|||
spin_unlock(&server->probe_lock);
|
||||
|
||||
_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);
|
||||
|
||||
return afs_done_one_fs_probe(call->net, server);
|
||||
|
|
|
@ -87,7 +87,9 @@ struct afs_addr_list {
|
|||
enum dns_lookup_status status:8;
|
||||
unsigned long failed; /* Mask of addrs that failed locally/ICMP */
|
||||
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))
|
||||
};
|
||||
|
||||
|
@ -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 *,
|
||||
const char *, size_t, char,
|
||||
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 bool afs_iterate_addresses(struct afs_addr_cursor *);
|
||||
extern int afs_end_cursor(struct afs_addr_cursor *);
|
||||
|
|
|
@ -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++)
|
||||
seq_printf(m, " %c %pISpc\n",
|
||||
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, " 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);
|
||||
for (i = 0; i < alist->nr_addrs; i++)
|
||||
seq_printf(m, " [%x] %pISpc%s\n",
|
||||
i, &alist->addrs[i].transport,
|
||||
i, &alist->addrs[i].srx.transport,
|
||||
alist->preferred == i ? "*" : "");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -488,7 +488,7 @@ iterate_address:
|
|||
|
||||
_debug("address [%u] %u/%u %pISp",
|
||||
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");
|
||||
return true;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
struct sockaddr_rxrpc *srx = &ac->alist->addrs[ac->index];
|
||||
struct sockaddr_rxrpc *srx = &ac->alist->addrs[ac->index].srx;
|
||||
struct rxrpc_call *rxcall;
|
||||
struct msghdr msg;
|
||||
struct kvec iov[1];
|
||||
|
@ -461,7 +461,7 @@ static void afs_log_error(struct afs_call *call, s32 remote_abort)
|
|||
max = m + 1;
|
||||
pr_notice("kAFS: Peer reported %s failure on %s [%pISp]\n",
|
||||
msg, call->type->name,
|
||||
&call->alist->addrs[call->addr_ix].transport);
|
||||
&call->alist->addrs[call->addr_ix].srx.transport);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
alist = rcu_dereference(server->addresses);
|
||||
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 -
|
||||
(u16 __force)b->sin6_port);
|
||||
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) {
|
||||
alist = rcu_dereference(server->addresses);
|
||||
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 -
|
||||
(u16 __force)b->sin_port);
|
||||
if (diff == 0)
|
||||
|
|
|
@ -94,8 +94,8 @@ static int afs_compare_fs_alists(const struct afs_server *server_a,
|
|||
lb = rcu_dereference(server_b->addresses);
|
||||
|
||||
while (a < la->nr_addrs && b < lb->nr_addrs) {
|
||||
const struct sockaddr_rxrpc *srx_a = &la->addrs[a];
|
||||
const struct sockaddr_rxrpc *srx_b = &lb->addrs[b];
|
||||
const struct sockaddr_rxrpc *srx_a = &la->addrs[a].srx;
|
||||
const struct sockaddr_rxrpc *srx_b = &lb->addrs[b].srx;
|
||||
int diff = afs_compare_addrs(srx_a, srx_b);
|
||||
|
||||
if (diff < 0) {
|
||||
|
|
|
@ -106,12 +106,12 @@ responded:
|
|||
if (call->service_id == YFS_VL_SERVICE) {
|
||||
server->probe.flags |= AFS_VLSERVER_PROBE_IS_YFS;
|
||||
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 {
|
||||
server->probe.flags |= AFS_VLSERVER_PROBE_NOT_YFS;
|
||||
if (!(server->probe.flags & AFS_VLSERVER_PROBE_IS_YFS)) {
|
||||
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 @@ out:
|
|||
spin_unlock(&server->probe_lock);
|
||||
|
||||
_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);
|
||||
}
|
||||
|
|
|
@ -249,7 +249,7 @@ iterate_address:
|
|||
|
||||
_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;
|
||||
|
||||
next_server:
|
||||
|
|
Loading…
Reference in New Issue