[PATCH 2/3] afs: Unify fs_addresses lists

Jeffrey E Altman jaltman at auristor.com
Fri Feb 16 12:42:40 PST 2024


On 2/16/2024 2:37 PM, Marc Dionne wrote:
> Given that the lists no longer contain addresses, there is little
> reason to splitting things between separate lists.
>
> That was probably the intention with the change from addresses to
> peer pointers in the list.
>
> Signed-off-by: Marc Dionne <marc.dionne at auristor.com>
> ---
>   fs/afs/internal.h |  6 ++----
>   fs/afs/main.c     |  3 +--
>   fs/afs/server.c   | 34 ++++++++++------------------------
>   3 files changed, 13 insertions(+), 30 deletions(-)
>
> diff --git a/fs/afs/internal.h b/fs/afs/internal.h
> index 9c03fcf7ffaa..6ce5a612937c 100644
> --- a/fs/afs/internal.h
> +++ b/fs/afs/internal.h
> @@ -321,8 +321,7 @@ struct afs_net {
>   	struct list_head	fs_probe_slow;	/* List of afs_server to probe at 5m intervals */
>   	struct hlist_head	fs_proc;	/* procfs servers list */
>   
> -	struct hlist_head	fs_addresses4;	/* afs_server (by lowest IPv4 addr) */
> -	struct hlist_head	fs_addresses6;	/* afs_server (by lowest IPv6 addr) */
> +	struct hlist_head	fs_addresses;	/* afs_server (by lowest IPv6 addr) */
>   	seqlock_t		fs_addr_lock;	/* For fs_addresses[46] */
>   
>   	struct work_struct	fs_manager;
> @@ -561,8 +560,7 @@ struct afs_server {
>   	struct afs_server __rcu	*uuid_next;	/* Next server with same UUID */
>   	struct afs_server	*uuid_prev;	/* Previous server with same UUID */
>   	struct list_head	probe_link;	/* Link in net->fs_probe_list */
> -	struct hlist_node	addr4_link;	/* Link in net->fs_addresses4 */
> -	struct hlist_node	addr6_link;	/* Link in net->fs_addresses6 */
> +	struct hlist_node	addr_link;	/* Link in net->fs_addresses6 */
>   	struct hlist_node	proc_link;	/* Link in net->fs_proc */
>   	struct list_head	volumes;	/* RCU list of afs_server_entry objects */
>   	struct afs_server	*gc_next;	/* Next server in manager's list */
> diff --git a/fs/afs/main.c b/fs/afs/main.c
> index 1b3bd21c168a..a14f6013e316 100644
> --- a/fs/afs/main.c
> +++ b/fs/afs/main.c
> @@ -90,8 +90,7 @@ static int __net_init afs_net_init(struct net *net_ns)
>   	INIT_LIST_HEAD(&net->fs_probe_slow);
>   	INIT_HLIST_HEAD(&net->fs_proc);
>   
> -	INIT_HLIST_HEAD(&net->fs_addresses4);
> -	INIT_HLIST_HEAD(&net->fs_addresses6);
> +	INIT_HLIST_HEAD(&net->fs_addresses);
>   	seqlock_init(&net->fs_addr_lock);
>   
>   	INIT_WORK(&net->fs_manager, afs_manage_servers);
> diff --git a/fs/afs/server.c b/fs/afs/server.c
> index ff79d1761a84..038f9d0ae3af 100644
> --- a/fs/afs/server.c
> +++ b/fs/afs/server.c
> @@ -38,22 +38,12 @@ struct afs_server *afs_find_server(struct afs_net *net, const struct rxrpc_peer
>   		seq++; /* 2 on the 1st/lockless path, otherwise odd */
>   		read_seqbegin_or_lock(&net->fs_addr_lock, &seq);
>   
> -		if (peer->src->transport.family == AF_INET6) {
> -			hlist_for_each_entry_rcu(server, &net->fs_addresses6, addr6_link) {
> -				estate = rcu_dereference(server->endpoint_state);
> -				alist = estate->addresses;
> -				for (i = 0; i < alist->nr_addrs; i++)
> -					if (alist->addrs[i].peer == peer)
> -						goto found;
> -			}
> -		} else {
> -			hlist_for_each_entry_rcu(server, &net->fs_addresses4, addr4_link) {
> -				estate = rcu_dereference(server->endpoint_state);
> -				alist = estate->addresses;
> -				for (i = 0; i < alist->nr_addrs; i++)
> -					if (alist->addrs[i].peer == peer)
> -						goto found;
> -			}
> +		hlist_for_each_entry_rcu(server, &net->fs_addresses, addr_link) {
> +			estate = rcu_dereference(server->endpoint_state);
> +			alist = estate->addresses;
> +			for (i = 0; i < alist->nr_addrs; i++)
> +				if (alist->addrs[i].peer == peer)
> +					goto found;
>   		}
>   
>   		server = NULL;
> @@ -187,10 +177,8 @@ static struct afs_server *afs_install_server(struct afs_cell *cell,
>   	 * bit, but anything we might want to do gets messy and memory
>   	 * intensive.
>   	 */
> -	if (alist->nr_ipv4 > 0)
> -		hlist_add_head_rcu(&server->addr4_link, &net->fs_addresses4);
> -	if (alist->nr_addrs > alist->nr_ipv4)
> -		hlist_add_head_rcu(&server->addr6_link, &net->fs_addresses6);
> +	if (alist->nr_addrs > 0)
> +		hlist_add_head_rcu(&server->addr_link, &net->fs_addresses);
>   
>   	write_sequnlock(&net->fs_addr_lock);
>   
> @@ -521,10 +509,8 @@ static void afs_gc_servers(struct afs_net *net, struct afs_server *gc_list)
>   
>   			list_del(&server->probe_link);
>   			hlist_del_rcu(&server->proc_link);
> -			if (!hlist_unhashed(&server->addr4_link))
> -				hlist_del_rcu(&server->addr4_link);
> -			if (!hlist_unhashed(&server->addr6_link))
> -				hlist_del_rcu(&server->addr6_link);
> +			if (!hlist_unhashed(&server->addr_link))
> +				hlist_del_rcu(&server->addr_link);
>   		}
>   		write_sequnlock(&net->fs_lock);
>   
Reviewed-by: Jeffrey E Altman <jaltman at auristor.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4039 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.infradead.org/pipermail/linux-afs/attachments/20240216/67c6f696/attachment.p7s>


More information about the linux-afs mailing list