Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4c402b40 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Remove rpc_clnt->cl_count



The kref now does most of what cl_count + cl_user used to do. The only
remaining role for cl_count is to tell us if we are in a 'shutdown'
phase. We can provide that information using a single bit field instead
of a full atomic counter.

Also rename rpc_destroy_client() to rpc_close_client(), which reflects
better what its role is these days.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 8ad7c892
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ struct rpc_inode;
 */
struct rpc_clnt {
	struct kref		cl_kref;	/* Number of references */
	atomic_t		cl_count;	/* Number of clones */
	struct list_head	cl_clients;	/* Global list of clients */
	struct list_head	cl_tasks;	/* List of tasks */
	spinlock_t		cl_lock;	/* spinlock */
@@ -119,8 +118,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args);
struct rpc_clnt	*rpc_bind_new_program(struct rpc_clnt *,
				struct rpc_program *, int);
struct rpc_clnt *rpc_clone_client(struct rpc_clnt *);
int		rpc_shutdown_client(struct rpc_clnt *);
int		rpc_destroy_client(struct rpc_clnt *);
void		rpc_shutdown_client(struct rpc_clnt *);
void		rpc_release_client(struct rpc_clnt *);
void		rpc_register_client(struct rpc_clnt *);
void		rpc_unregister_client(struct rpc_clnt *);
+2 −17
Original line number Diff line number Diff line
@@ -121,7 +121,6 @@ static struct rpc_clnt * rpc_new_client(struct rpc_xprt *xprt, char *servname, s
	clnt = kzalloc(sizeof(*clnt), GFP_KERNEL);
	if (!clnt)
		goto out_err;
	atomic_set(&clnt->cl_count, 1);
	clnt->cl_parent = clnt;

	clnt->cl_server = clnt->cl_inline_name;
@@ -270,7 +269,6 @@ rpc_clone_client(struct rpc_clnt *clnt)
	new = kmemdup(clnt, sizeof(*new), GFP_KERNEL);
	if (!new)
		goto out_no_clnt;
	atomic_set(&new->cl_count, 1);
	new->cl_metrics = rpc_alloc_iostats(clnt);
	if (new->cl_metrics == NULL)
		goto out_no_stats;
@@ -303,8 +301,7 @@ rpc_clone_client(struct rpc_clnt *clnt)
 * Properly shut down an RPC client, terminating all outstanding
 * requests.
 */
int
rpc_shutdown_client(struct rpc_clnt *clnt)
void rpc_shutdown_client(struct rpc_clnt *clnt)
{
	dprintk("RPC:       shutting down %s client for %s\n",
			clnt->cl_protname, clnt->cl_server);
@@ -315,7 +312,7 @@ rpc_shutdown_client(struct rpc_clnt *clnt)
			list_empty(&clnt->cl_tasks), 1*HZ);
	}

	return rpc_destroy_client(clnt);
	rpc_release_client(clnt);
}

/*
@@ -363,18 +360,6 @@ rpc_release_client(struct rpc_clnt *clnt)
	kref_put(&clnt->cl_kref, rpc_free_client);
}

/*
 * Delete an RPC client
 */
int
rpc_destroy_client(struct rpc_clnt *clnt)
{
	if (!atomic_dec_and_test(&clnt->cl_count))
		return 1;
	kref_put(&clnt->cl_kref, rpc_free_client);
	return 0;
}

/**
 * rpc_bind_new_program - bind a new RPC program to an existing client
 * @old - old rpc_client
+1 −1
Original line number Diff line number Diff line
@@ -380,7 +380,7 @@ void rpcb_getport(struct rpc_task *task)
	}

	child = rpc_run_task(rpcb_clnt, RPC_TASK_ASYNC, &rpcb_getport_ops, map);
	rpc_destroy_client(rpcb_clnt);
	rpc_release_client(rpcb_clnt);
	if (IS_ERR(child)) {
		status = -EIO;
		dprintk("RPC: %5u rpcb_getport rpc_run_task failed\n",
+0 −1
Original line number Diff line number Diff line
@@ -35,7 +35,6 @@ EXPORT_SYMBOL(rpc_wake_up_status);
/* RPC client functions */
EXPORT_SYMBOL(rpc_clone_client);
EXPORT_SYMBOL(rpc_bind_new_program);
EXPORT_SYMBOL(rpc_destroy_client);
EXPORT_SYMBOL(rpc_shutdown_client);
EXPORT_SYMBOL(rpc_killall_tasks);
EXPORT_SYMBOL(rpc_call_sync);