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

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

Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 2f72c9b7
......@@ -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 */
......@@ -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;
......
......@@ -5,6 +5,7 @@
#include <net/netns/generic.h>
struct sunrpc_net {
struct proc_dir_entry *proc_net_rpc;
};
extern int sunrpc_net_id;
......
......@@ -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);
}
......@@ -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 */
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment