Commit 779a3951 authored by Mike Snitzer's avatar Mike Snitzer Committed by Anna Schumaker
Browse files

nfs/localio: remove redundant code and simplify LOCALIO enablement



Remove nfs_local_enable and nfs_local_disable, instead use
nfs_localio_enable_client and nfs_localio_disable_client.

Discontinue use of the NFS_CS_LOCAL_IO bit in the nfs_client struct's
cl_flags to reflect that LOCALIO is enabled; instead just test if the
net member of the nfs_uuid_t struct is set.

Also remove NFS_CS_LOCAL_IO.

Lastly, remove trace_nfs_local_enable and trace_nfs_local_disable
because comparable traces are available from nfs_localio.ko.

Suggested-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarAnna Schumaker <anna.schumaker@oracle.com>
parent 0dc73141
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@
#include <linux/sunrpc/bc_xprt.h>
#include <linux/nsproxy.h>
#include <linux/pid_namespace.h>

#include <linux/nfslocalio.h>

#include "nfs4_fs.h"
#include "callback.h"
@@ -243,7 +243,7 @@ static void pnfs_init_server(struct nfs_server *server)
 */
void nfs_free_client(struct nfs_client *clp)
{
	nfs_local_disable(clp);
	nfs_localio_disable_client(clp);

	/* -EIO all pending I/O */
	if (!IS_ERR(clp->cl_rpcclient))
+0 −2
Original line number Diff line number Diff line
@@ -455,7 +455,6 @@ extern int nfs_wait_bit_killable(struct wait_bit_key *key, int mode);

#if IS_ENABLED(CONFIG_NFS_LOCALIO)
/* localio.c */
extern void nfs_local_disable(struct nfs_client *);
extern void nfs_local_probe(struct nfs_client *);
extern struct nfsd_file *nfs_local_open_fh(struct nfs_client *,
					   const struct cred *,
@@ -472,7 +471,6 @@ extern int nfs_local_commit(struct nfsd_file *,
extern bool nfs_server_is_local(const struct nfs_client *clp);

#else /* CONFIG_NFS_LOCALIO */
static inline void nfs_local_disable(struct nfs_client *clp) {}
static inline void nfs_local_probe(struct nfs_client *clp) {}
static inline struct nfsd_file *
nfs_local_open_fh(struct nfs_client *clp, const struct cred *cred,
+5 −23
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ MODULE_PARM_DESC(localio_O_DIRECT_semantics,

static inline bool nfs_client_is_local(const struct nfs_client *clp)
{
	return !!test_bit(NFS_CS_LOCAL_IO, &clp->cl_flags);
	return !!rcu_access_pointer(clp->cl_uuid.net);
}

bool nfs_server_is_local(const struct nfs_client *clp)
@@ -121,24 +121,6 @@ const struct rpc_program nfslocalio_program = {
	.stats			= &nfslocalio_rpcstat,
};

/*
 * nfs_local_enable - enable local i/o for an nfs_client
 */
static void nfs_local_enable(struct nfs_client *clp)
{
	trace_nfs_local_enable(clp);
	nfs_localio_enable_client(clp);
}

/*
 * nfs_local_disable - disable local i/o for an nfs_client
 */
void nfs_local_disable(struct nfs_client *clp)
{
	trace_nfs_local_disable(clp);
	nfs_localio_disable_client(clp);
}

/*
 * nfs_init_localioclient - Initialise an NFS localio client connection
 */
@@ -194,19 +176,19 @@ void nfs_local_probe(struct nfs_client *clp)
	/* Disallow localio if disabled via sysfs or AUTH_SYS isn't used */
	if (!localio_enabled ||
	    clp->cl_rpcclient->cl_auth->au_flavor != RPC_AUTH_UNIX) {
		nfs_local_disable(clp);
		nfs_localio_disable_client(clp);
		return;
	}

	if (nfs_client_is_local(clp)) {
		/* If already enabled, disable and re-enable */
		nfs_local_disable(clp);
		nfs_localio_disable_client(clp);
	}

	if (!nfs_uuid_begin(&clp->cl_uuid))
		return;
	if (nfs_server_uuid_is_local(clp))
		nfs_local_enable(clp);
		nfs_localio_enable_client(clp);
	nfs_uuid_end(&clp->cl_uuid);
}
EXPORT_SYMBOL_GPL(nfs_local_probe);
@@ -748,7 +730,7 @@ int nfs_local_doio(struct nfs_client *clp, struct nfsd_file *localio,

	if (status != 0) {
		if (status == -EAGAIN)
			nfs_local_disable(clp);
			nfs_localio_disable_client(clp);
		nfs_local_file_put(localio);
		hdr->task.tk_status = status;
		nfs_local_hdr_release(hdr, call_ops);
+0 −32
Original line number Diff line number Diff line
@@ -1714,38 +1714,6 @@ TRACE_EVENT(nfs_local_open_fh,
		)
);

DECLARE_EVENT_CLASS(nfs_local_client_event,
		TP_PROTO(
			const struct nfs_client *clp
		),

		TP_ARGS(clp),

		TP_STRUCT__entry(
			__field(unsigned int, protocol)
			__string(server, clp->cl_hostname)
		),

		TP_fast_assign(
			__entry->protocol = clp->rpc_ops->version;
			__assign_str(server);
		),

		TP_printk(
			"server=%s NFSv%u", __get_str(server), __entry->protocol
		)
);

#define DEFINE_NFS_LOCAL_CLIENT_EVENT(name) \
	DEFINE_EVENT(nfs_local_client_event, name, \
			TP_PROTO( \
				const struct nfs_client *clp \
			), \
			TP_ARGS(clp))

DEFINE_NFS_LOCAL_CLIENT_EVENT(nfs_local_enable);
DEFINE_NFS_LOCAL_CLIENT_EVENT(nfs_local_disable);

DECLARE_EVENT_CLASS(nfs_xdr_event,
		TP_PROTO(
			const struct xdr_stream *xdr,
+11 −23
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ static LIST_HEAD(nfs_uuids);

void nfs_uuid_init(nfs_uuid_t *nfs_uuid)
{
	nfs_uuid->net = NULL;
	RCU_INIT_POINTER(nfs_uuid->net, NULL);
	nfs_uuid->dom = NULL;
	nfs_uuid->list_lock = NULL;
	INIT_LIST_HEAD(&nfs_uuid->list);
@@ -49,7 +49,7 @@ EXPORT_SYMBOL_GPL(nfs_uuid_init);
bool nfs_uuid_begin(nfs_uuid_t *nfs_uuid)
{
	spin_lock(&nfs_uuid->lock);
	if (nfs_uuid->net) {
	if (rcu_access_pointer(nfs_uuid->net)) {
		/* This nfs_uuid is already in use */
		spin_unlock(&nfs_uuid->lock);
		return false;
@@ -74,9 +74,9 @@ EXPORT_SYMBOL_GPL(nfs_uuid_begin);

void nfs_uuid_end(nfs_uuid_t *nfs_uuid)
{
	if (nfs_uuid->net == NULL) {
	if (!rcu_access_pointer(nfs_uuid->net)) {
		spin_lock(&nfs_uuid->lock);
		if (nfs_uuid->net == NULL) {
		if (!rcu_access_pointer(nfs_uuid->net)) {
			/* Not local, remove from nfs_uuids */
			spin_lock(&nfs_uuids_lock);
			list_del_init(&nfs_uuid->list);
@@ -139,12 +139,8 @@ EXPORT_SYMBOL_GPL(nfs_uuid_is_local);

void nfs_localio_enable_client(struct nfs_client *clp)
{
	nfs_uuid_t *nfs_uuid = &clp->cl_uuid;

	spin_lock(&nfs_uuid->lock);
	set_bit(NFS_CS_LOCAL_IO, &clp->cl_flags);
	/* nfs_uuid_is_local() does the actual enablement */
	trace_nfs_localio_enable_client(clp);
	spin_unlock(&nfs_uuid->lock);
}
EXPORT_SYMBOL_GPL(nfs_localio_enable_client);

@@ -152,15 +148,15 @@ EXPORT_SYMBOL_GPL(nfs_localio_enable_client);
 * Cleanup the nfs_uuid_t embedded in an nfs_client.
 * This is the long-form of nfs_uuid_init().
 */
static void nfs_uuid_put(nfs_uuid_t *nfs_uuid)
static bool nfs_uuid_put(nfs_uuid_t *nfs_uuid)
{
	LIST_HEAD(local_files);
	struct nfs_file_localio *nfl, *tmp;

	spin_lock(&nfs_uuid->lock);
	if (unlikely(!nfs_uuid->net)) {
	if (unlikely(!rcu_access_pointer(nfs_uuid->net))) {
		spin_unlock(&nfs_uuid->lock);
		return;
		return false;
	}
	RCU_INIT_POINTER(nfs_uuid->net, NULL);

@@ -192,23 +188,15 @@ static void nfs_uuid_put(nfs_uuid_t *nfs_uuid)

	module_put(nfsd_mod);
	spin_unlock(&nfs_uuid->lock);

	return true;
}

void nfs_localio_disable_client(struct nfs_client *clp)
{
	nfs_uuid_t *nfs_uuid = NULL;

	spin_lock(&clp->cl_uuid.lock); /* aka &nfs_uuid->lock */
	if (test_and_clear_bit(NFS_CS_LOCAL_IO, &clp->cl_flags)) {
		/* &clp->cl_uuid is always not NULL, using as bool here */
		nfs_uuid = &clp->cl_uuid;
	if (nfs_uuid_put(&clp->cl_uuid))
		trace_nfs_localio_disable_client(clp);
}
	spin_unlock(&clp->cl_uuid.lock);

	if (nfs_uuid)
		nfs_uuid_put(nfs_uuid);
}
EXPORT_SYMBOL_GPL(nfs_localio_disable_client);

void nfs_localio_invalidate_clients(struct list_head *nn_local_clients,
Loading