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

Commit 4f42d0d5 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by J. Bruce Fields
Browse files

sunrpc: Make the /proc/net/rpc appear in net namespaces

parent 2f72c9b7
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -38,8 +38,21 @@ struct svc_stat {
				rpcbadclnt;
};

void			rpc_proc_init(void);
void			rpc_proc_exit(void);
struct net;
#ifdef CONFIG_PROC_FS
int			rpc_proc_init(struct net *);
void			rpc_proc_exit(struct net *);
#else
static inline int rpc_proc_init(struct net *net)
{
	return 0;
}

static inline void rpc_proc_exit(struct net *net)
{
}
#endif

#ifdef MODULE
void			rpc_modcount(struct inode *, int);
#endif
@@ -54,9 +67,6 @@ void svc_proc_unregister(const char *);

void			svc_seq_show(struct seq_file *,
				     const struct svc_stat *);

extern struct proc_dir_entry	*proc_net_rpc;

#else

static inline struct proc_dir_entry *rpc_proc_register(struct rpc_stat *s) { return NULL; }
@@ -69,9 +79,6 @@ static inline void svc_proc_unregister(const char *p) {}

static inline void svc_seq_show(struct seq_file *seq,
				const struct svc_stat *st) {}

#define proc_net_rpc NULL

#endif

#endif /* _LINUX_SUNRPC_STATS_H */
+8 −3
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@
#include <linux/sunrpc/cache.h>
#include <linux/sunrpc/stats.h>
#include <linux/sunrpc/rpc_pipe_fs.h>
#include <net/net_namespace.h>
#include "netns.h"

#define	 RPCDBG_FACILITY RPCDBG_CACHE

@@ -1540,6 +1540,8 @@ static const struct file_operations cache_flush_operations_procfs = {

static void remove_cache_proc_entries(struct cache_detail *cd, struct net *net)
{
	struct sunrpc_net *sn;

	if (cd->u.procfs.proc_ent == NULL)
		return;
	if (cd->u.procfs.flush_ent)
@@ -1549,15 +1551,18 @@ static void remove_cache_proc_entries(struct cache_detail *cd, struct net *net)
	if (cd->u.procfs.content_ent)
		remove_proc_entry("content", cd->u.procfs.proc_ent);
	cd->u.procfs.proc_ent = NULL;
	remove_proc_entry(cd->name, proc_net_rpc);
	sn = net_generic(net, sunrpc_net_id);
	remove_proc_entry(cd->name, sn->proc_net_rpc);
}

#ifdef CONFIG_PROC_FS
static int create_cache_proc_entries(struct cache_detail *cd, struct net *net)
{
	struct proc_dir_entry *p;
	struct sunrpc_net *sn;

	cd->u.procfs.proc_ent = proc_mkdir(cd->name, proc_net_rpc);
	sn = net_generic(net, sunrpc_net_id);
	cd->u.procfs.proc_ent = proc_mkdir(cd->name, sn->proc_net_rpc);
	if (cd->u.procfs.proc_ent == NULL)
		goto out_nomem;
	cd->u.procfs.channel_ent = NULL;
+1 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
#include <net/netns/generic.h>

struct sunrpc_net {
	struct proc_dir_entry *proc_net_rpc;
};

extern int sunrpc_net_id;
+25 −18
Original line number Diff line number Diff line
@@ -22,11 +22,10 @@
#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/svcsock.h>
#include <linux/sunrpc/metrics.h>
#include <net/net_namespace.h>

#define RPCDBG_FACILITY	RPCDBG_MISC
#include "netns.h"

struct proc_dir_entry	*proc_net_rpc = NULL;
#define RPCDBG_FACILITY	RPCDBG_MISC

/*
 * Get RPC client stats
@@ -218,10 +217,11 @@ EXPORT_SYMBOL_GPL(rpc_print_iostats);
static inline struct proc_dir_entry *
do_register(const char *name, void *data, const struct file_operations *fops)
{
	rpc_proc_init();
	dprintk("RPC:       registering /proc/net/rpc/%s\n", name);
	struct sunrpc_net *sn;

	return proc_create_data(name, 0, proc_net_rpc, fops, data);
	dprintk("RPC:       registering /proc/net/rpc/%s\n", name);
	sn = net_generic(&init_net, sunrpc_net_id);
	return proc_create_data(name, 0, sn->proc_net_rpc, fops, data);
}

struct proc_dir_entry *
@@ -234,7 +234,10 @@ EXPORT_SYMBOL_GPL(rpc_proc_register);
void
rpc_proc_unregister(const char *name)
{
	remove_proc_entry(name, proc_net_rpc);
	struct sunrpc_net *sn;

	sn = net_generic(&init_net, sunrpc_net_id);
	remove_proc_entry(name, sn->proc_net_rpc);
}
EXPORT_SYMBOL_GPL(rpc_proc_unregister);

@@ -248,25 +251,29 @@ EXPORT_SYMBOL_GPL(svc_proc_register);
void
svc_proc_unregister(const char *name)
{
	remove_proc_entry(name, proc_net_rpc);
	struct sunrpc_net *sn;

	sn = net_generic(&init_net, sunrpc_net_id);
	remove_proc_entry(name, sn->proc_net_rpc);
}
EXPORT_SYMBOL_GPL(svc_proc_unregister);

void
rpc_proc_init(void)
int rpc_proc_init(struct net *net)
{
	struct sunrpc_net *sn;

	dprintk("RPC:       registering /proc/net/rpc\n");
	if (!proc_net_rpc)
		proc_net_rpc = proc_mkdir("rpc", init_net.proc_net);
	sn = net_generic(net, sunrpc_net_id);
	sn->proc_net_rpc = proc_mkdir("rpc", net->proc_net);
	if (sn->proc_net_rpc == NULL)
		return -ENOMEM;

	return 0;
}

void
rpc_proc_exit(void)
void rpc_proc_exit(struct net *net)
{
	dprintk("RPC:       unregistering /proc/net/rpc\n");
	if (proc_net_rpc) {
		proc_net_rpc = NULL;
		remove_proc_entry("rpc", init_net.proc_net);
	}
	remove_proc_entry("rpc", net->proc_net);
}
+10 −6
Original line number Diff line number Diff line
@@ -28,11 +28,21 @@ int sunrpc_net_id;

static __net_init int sunrpc_init_net(struct net *net)
{
	int err;

	err = rpc_proc_init(net);
	if (err)
		goto err_proc;

	return 0;

err_proc:
	return err;
}

static __net_exit void sunrpc_exit_net(struct net *net)
{
	rpc_proc_exit(net);
}

static struct pernet_operations sunrpc_net_ops = {
@@ -66,9 +76,6 @@ init_sunrpc(void)
		goto out4;
#ifdef RPC_DEBUG
	rpc_register_sysctl();
#endif
#ifdef CONFIG_PROC_FS
	rpc_proc_init();
#endif
	cache_register(&ip_map_cache);
	cache_register(&unix_gid_cache);
@@ -100,9 +107,6 @@ cleanup_sunrpc(void)
	unregister_pernet_subsys(&sunrpc_net_ops);
#ifdef RPC_DEBUG
	rpc_unregister_sysctl();
#endif
#ifdef CONFIG_PROC_FS
	rpc_proc_exit();
#endif
	rcu_barrier(); /* Wait for completion of call_rcu()'s */
}