Commit e38f299e authored by David Howells's avatar David Howells
Browse files

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: default avatarDavid Howells <dhowells@redhat.com>
cc: Marc Dionne <marc.dionne@auristor.com>
cc: linux-afs@lists.infradead.org
parent 905b8615
Loading
Loading
Loading
Loading
+3 −7
Original line number Diff line number Diff line
@@ -56,13 +56,12 @@ struct afs_addr_list *afs_get_addrlist(struct afs_addr_list *alist, enum afs_ali
/*
 * 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;
	unsigned int i;
	static atomic_t debug_id;

	_enter("%u,%u", nr, service_id);
	_enter("%u", nr);

	if (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);
	alist->max_addrs = nr;
	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);
	return alist;
}
@@ -150,7 +146,7 @@ struct afs_vlserver_list *afs_parse_text_addrs(struct afs_net *net,
	if (!vllist->servers[0].server)
		goto error_vl;

	alist = afs_alloc_addrlist(nr, service);
	alist = afs_alloc_addrlist(nr);
	if (!alist)
		goto error;

+2 −2
Original line number Diff line number Diff line
@@ -154,12 +154,12 @@ void afs_fileserver_probe_result(struct afs_call *call)
	if (call->service_id == YFS_FS_SERVICE) {
		server->probe.is_yfs = true;
		set_bit(AFS_SERVER_FL_IS_YFS, &server->flags);
		addr->service_id = call->service_id;
		server->service_id = call->service_id;
	} else {
		server->probe.not_yfs = true;
		if (!server->probe.is_yfs) {
			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);
		if (cap0 & AFS3_VICED_CAPABILITY_64BITFILES)
+9 −5
Original line number Diff line number Diff line
@@ -1621,6 +1621,8 @@ int afs_fs_give_up_all_callbacks(struct afs_net *net,
		return -ENOMEM;

	call->key	= key;
	call->peer	= rxrpc_kernel_get_peer(ac->alist->addrs[ac->index].peer);
	call->service_id = server->service_id;

	/* marshall the parameters */
	bp = call->request;
@@ -1724,6 +1726,8 @@ bool afs_fs_get_capabilities(struct afs_net *net, struct afs_server *server,

	call->key	= key;
	call->server	= afs_use_server(server, afs_server_trace_get_caps);
	call->peer	= rxrpc_kernel_get_peer(ac->alist->addrs[ac->index].peer);
	call->service_id = server->service_id;
	call->upgrade	= true;
	call->async	= true;
	call->max_lifespan = AFS_PROBE_MAX_LIFESPAN;
+11 −7
Original line number Diff line number Diff line
@@ -74,7 +74,6 @@ enum afs_call_state {

struct afs_address {
	struct rxrpc_peer	*peer;
	u16			service_id;
	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	work;		/* actual work processor */
	struct rxrpc_call	*rxcall;	/* RxRPC call handle */
	struct rxrpc_peer	*peer;		/* Remote endpoint */
	struct key		*key;		/* security for this call */
	struct afs_net		*net;		/* The network namespace */
	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 */
	} probe;

	u16			service_id;	/* Service ID we're using */
	u16			port;
	u16			name_len;	/* Length of name */
	char			name[];		/* Server name, case-flattened */
@@ -527,6 +528,7 @@ struct afs_server {
	refcount_t		ref;		/* Object refcount */
	atomic_t		active;		/* Active user count */
	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		debug_id;	/* Debugging ID for traces */

@@ -971,7 +973,7 @@ static inline bool afs_is_folio_dirty_mmapped(unsigned long priv)
 * addr_list.c
 */
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 struct afs_vlserver_list *afs_parse_text_addrs(struct afs_net *,
						      const char *, size_t, char,
@@ -1323,6 +1325,8 @@ static inline void afs_make_op_call(struct afs_operation *op, struct afs_call *c
	call->op	= op;
	call->key	= op->key;
	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);
}

+6 −6
Original line number Diff line number Diff line
@@ -178,6 +178,8 @@ void afs_put_call(struct afs_call *call)
		ASSERT(!work_pending(&call->async_work));
		ASSERT(call->type->name != NULL);

		rxrpc_kernel_put_peer(call->peer);

		if (call->rxcall) {
			rxrpc_kernel_shutdown_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)
{
	struct afs_address *addr = &ac->alist->addrs[ac->index];
	struct rxrpc_peer *peer = addr->peer;
	struct rxrpc_call *rxcall;
	struct msghdr msg;
	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;
	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->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 */
	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,
					 tx_total_len,
					 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 ?
					  afs_wake_up_async_call :
					  afs_wake_up_call_waiter),
					 addr->service_id,
					 call->service_id,
					 call->upgrade,
					 (call->intr ? RXRPC_PREINTERRUPTIBLE :
					  RXRPC_UNINTERRUPTIBLE),
@@ -462,7 +462,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,
			  rxrpc_kernel_remote_addr(call->alist->addrs[call->addr_ix].peer));
			  rxrpc_kernel_remote_addr(call->peer));
	}
}

Loading