afs: Turn the afs_addr_list address array into an array of structs
authorDavid Howells <dhowells@redhat.com>
Wed, 18 Oct 2023 14:38:14 +0000 (15:38 +0100)
committerDavid Howells <dhowells@redhat.com>
Sun, 24 Dec 2023 15:22:50 +0000 (15:22 +0000)
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

fs/afs/addr_list.c
fs/afs/fs_probe.c
fs/afs/internal.h
fs/afs/proc.c
fs/afs/rotate.c
fs/afs/rxrpc.c
fs/afs/server.c
fs/afs/vl_alias.c
fs/afs/vl_probe.c
fs/afs/vl_rotate.c

index de1ae0bead3baf9192bde373287924c3b0d500fd..ac05a59e9d464982a1098d124b4f2f4b6a57146f 100644 (file)
@@ -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);
index daaf3810cc925646f420a96ffaca579386712bdf..3dd24842f277baca80ab61cfb1e3fa8204708b3b 100644 (file)
@@ -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);
index 7385d62c8cf50318c10a257479919fa33bff8634..e2adb314ab6a6a5fb2830ac4a33d38f1ff75aea7 100644 (file)
@@ -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 *);
index 2a0c83d71565981eee8d1a265e35304d0a19b56c..ab9cd986cfd9e1aebe86fcef7573c96fc27e8521 100644 (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++)
                        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;
 }
index a3d127953ac60e24673ff40ce8dbcc1aa4384dff..46081e5da6f54ac080768ca5f977aed64b0e575d 100644 (file)
@@ -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;
index d642d06a453be75b40663ef2a1594dc696085e77..181317126e432563e1dd2402ab177735c61277e5 100644 (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)
 {
-       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);
        }
 }
 
index 0bd2f5ba6900c1d0bc2b5741473382627dccaf58..b8e2d211d4a1780de3ba2ede65ea3d9d0a09fb17 100644 (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) {
                                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)
index f04a80e4f5c3fa87c26849c757c5dba044db210f..d3c0df70a1a545963e99176db99052813a0ee29f 100644 (file)
@@ -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) {
index 58452b86e67270e273896885879cad81fe85f9fd..bdd9372e3fb2a583e4fc17fd45e2a457d1b0cfec 100644 (file)
@@ -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);
 }
index eb415ce563600e98124521c2d45ce5a3c47b89ab..e52b9d4c8a0ab9a95e3ad7f02885508d80c81f3e 100644 (file)
@@ -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: