[NET]: Consolidate net namespace related proc files creation.
Signed-off-by: Denis V. Lunev <den@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
097e66c578
Коммит
e372c41401
|
@ -22,10 +22,48 @@
|
||||||
#include <linux/mount.h>
|
#include <linux/mount.h>
|
||||||
#include <linux/nsproxy.h>
|
#include <linux/nsproxy.h>
|
||||||
#include <net/net_namespace.h>
|
#include <net/net_namespace.h>
|
||||||
|
#include <linux/seq_file.h>
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
|
|
||||||
|
int seq_open_net(struct inode *ino, struct file *f,
|
||||||
|
const struct seq_operations *ops, int size)
|
||||||
|
{
|
||||||
|
struct net *net;
|
||||||
|
struct seq_net_private *p;
|
||||||
|
|
||||||
|
BUG_ON(size < sizeof(*p));
|
||||||
|
|
||||||
|
net = get_proc_net(ino);
|
||||||
|
if (net == NULL)
|
||||||
|
return -ENXIO;
|
||||||
|
|
||||||
|
p = __seq_open_private(f, ops, size);
|
||||||
|
if (p == NULL) {
|
||||||
|
put_net(net);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
p->net = net;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(seq_open_net);
|
||||||
|
|
||||||
|
int seq_release_net(struct inode *ino, struct file *f)
|
||||||
|
{
|
||||||
|
struct seq_file *seq;
|
||||||
|
struct seq_net_private *p;
|
||||||
|
|
||||||
|
seq = f->private_data;
|
||||||
|
p = seq->private;
|
||||||
|
|
||||||
|
put_net(p->net);
|
||||||
|
seq_release_private(ino, f);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(seq_release_net);
|
||||||
|
|
||||||
|
|
||||||
struct proc_dir_entry *proc_net_fops_create(struct net *net,
|
struct proc_dir_entry *proc_net_fops_create(struct net *net,
|
||||||
const char *name, mode_t mode, const struct file_operations *fops)
|
const char *name, mode_t mode, const struct file_operations *fops)
|
||||||
{
|
{
|
||||||
|
|
|
@ -63,5 +63,18 @@ extern struct list_head *seq_list_start_head(struct list_head *head,
|
||||||
extern struct list_head *seq_list_next(void *v, struct list_head *head,
|
extern struct list_head *seq_list_next(void *v, struct list_head *head,
|
||||||
loff_t *ppos);
|
loff_t *ppos);
|
||||||
|
|
||||||
|
struct net;
|
||||||
|
struct seq_net_private {
|
||||||
|
struct net *net;
|
||||||
|
};
|
||||||
|
|
||||||
|
int seq_open_net(struct inode *, struct file *,
|
||||||
|
const struct seq_operations *, int);
|
||||||
|
int seq_release_net(struct inode *, struct file *);
|
||||||
|
static inline struct net *seq_file_net(struct seq_file *seq)
|
||||||
|
{
|
||||||
|
return ((struct seq_net_private *)seq->private)->net;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2364,7 +2364,7 @@ static int dev_ifconf(struct net *net, char __user *arg)
|
||||||
*/
|
*/
|
||||||
void *dev_seq_start(struct seq_file *seq, loff_t *pos)
|
void *dev_seq_start(struct seq_file *seq, loff_t *pos)
|
||||||
{
|
{
|
||||||
struct net *net = seq->private;
|
struct net *net = seq_file_net(seq);
|
||||||
loff_t off;
|
loff_t off;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
|
||||||
|
@ -2382,7 +2382,7 @@ void *dev_seq_start(struct seq_file *seq, loff_t *pos)
|
||||||
|
|
||||||
void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||||
{
|
{
|
||||||
struct net *net = seq->private;
|
struct net *net = seq_file_net(seq);
|
||||||
++*pos;
|
++*pos;
|
||||||
return v == SEQ_START_TOKEN ?
|
return v == SEQ_START_TOKEN ?
|
||||||
first_net_device(net) : next_net_device((struct net_device *)v);
|
first_net_device(net) : next_net_device((struct net_device *)v);
|
||||||
|
@ -2481,26 +2481,8 @@ static const struct seq_operations dev_seq_ops = {
|
||||||
|
|
||||||
static int dev_seq_open(struct inode *inode, struct file *file)
|
static int dev_seq_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct seq_file *seq;
|
return seq_open_net(inode, file, &dev_seq_ops,
|
||||||
int res;
|
sizeof(struct seq_net_private));
|
||||||
res = seq_open(file, &dev_seq_ops);
|
|
||||||
if (!res) {
|
|
||||||
seq = file->private_data;
|
|
||||||
seq->private = get_proc_net(inode);
|
|
||||||
if (!seq->private) {
|
|
||||||
seq_release(inode, file);
|
|
||||||
res = -ENXIO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dev_seq_release(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
struct seq_file *seq = file->private_data;
|
|
||||||
struct net *net = seq->private;
|
|
||||||
put_net(net);
|
|
||||||
return seq_release(inode, file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations dev_seq_fops = {
|
static const struct file_operations dev_seq_fops = {
|
||||||
|
@ -2508,7 +2490,7 @@ static const struct file_operations dev_seq_fops = {
|
||||||
.open = dev_seq_open,
|
.open = dev_seq_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = dev_seq_release,
|
.release = seq_release_net,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct seq_operations softnet_seq_ops = {
|
static const struct seq_operations softnet_seq_ops = {
|
||||||
|
|
|
@ -187,7 +187,7 @@ EXPORT_SYMBOL(dev_mc_unsync);
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
|
static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
|
||||||
{
|
{
|
||||||
struct net *net = seq->private;
|
struct net *net = seq_file_net(seq);
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
loff_t off = 0;
|
loff_t off = 0;
|
||||||
|
|
||||||
|
@ -241,26 +241,8 @@ static const struct seq_operations dev_mc_seq_ops = {
|
||||||
|
|
||||||
static int dev_mc_seq_open(struct inode *inode, struct file *file)
|
static int dev_mc_seq_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct seq_file *seq;
|
return seq_open_net(inode, file, &dev_mc_seq_ops,
|
||||||
int res;
|
sizeof(struct seq_net_private));
|
||||||
res = seq_open(file, &dev_mc_seq_ops);
|
|
||||||
if (!res) {
|
|
||||||
seq = file->private_data;
|
|
||||||
seq->private = get_proc_net(inode);
|
|
||||||
if (!seq->private) {
|
|
||||||
seq_release(inode, file);
|
|
||||||
res = -ENXIO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int dev_mc_seq_release(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
struct seq_file *seq = file->private_data;
|
|
||||||
struct net *net = seq->private;
|
|
||||||
put_net(net);
|
|
||||||
return seq_release(inode, file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations dev_mc_seq_fops = {
|
static const struct file_operations dev_mc_seq_fops = {
|
||||||
|
@ -268,7 +250,7 @@ static const struct file_operations dev_mc_seq_fops = {
|
||||||
.open = dev_mc_seq_open,
|
.open = dev_mc_seq_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = dev_mc_seq_release,
|
.release = seq_release_net,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1681,7 +1681,7 @@ int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 pid,
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
struct nl_seq_iter {
|
struct nl_seq_iter {
|
||||||
struct net *net;
|
struct seq_net_private p;
|
||||||
int link;
|
int link;
|
||||||
int hash_idx;
|
int hash_idx;
|
||||||
};
|
};
|
||||||
|
@ -1699,7 +1699,7 @@ static struct sock *netlink_seq_socket_idx(struct seq_file *seq, loff_t pos)
|
||||||
|
|
||||||
for (j = 0; j <= hash->mask; j++) {
|
for (j = 0; j <= hash->mask; j++) {
|
||||||
sk_for_each(s, node, &hash->table[j]) {
|
sk_for_each(s, node, &hash->table[j]) {
|
||||||
if (iter->net != s->sk_net)
|
if (iter->p.net != s->sk_net)
|
||||||
continue;
|
continue;
|
||||||
if (off == pos) {
|
if (off == pos) {
|
||||||
iter->link = i;
|
iter->link = i;
|
||||||
|
@ -1734,7 +1734,7 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||||
s = v;
|
s = v;
|
||||||
do {
|
do {
|
||||||
s = sk_next(s);
|
s = sk_next(s);
|
||||||
} while (s && (iter->net != s->sk_net));
|
} while (s && (iter->p.net != s->sk_net));
|
||||||
if (s)
|
if (s)
|
||||||
return s;
|
return s;
|
||||||
|
|
||||||
|
@ -1746,7 +1746,7 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||||
|
|
||||||
for (; j <= hash->mask; j++) {
|
for (; j <= hash->mask; j++) {
|
||||||
s = sk_head(&hash->table[j]);
|
s = sk_head(&hash->table[j]);
|
||||||
while (s && (iter->net != s->sk_net))
|
while (s && (iter->p.net != s->sk_net))
|
||||||
s = sk_next(s);
|
s = sk_next(s);
|
||||||
if (s) {
|
if (s) {
|
||||||
iter->link = i;
|
iter->link = i;
|
||||||
|
@ -1802,27 +1802,8 @@ static const struct seq_operations netlink_seq_ops = {
|
||||||
|
|
||||||
static int netlink_seq_open(struct inode *inode, struct file *file)
|
static int netlink_seq_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct nl_seq_iter *iter;
|
return seq_open_net(inode, file, &netlink_seq_ops,
|
||||||
|
sizeof(struct nl_seq_iter));
|
||||||
iter = __seq_open_private(file, &netlink_seq_ops, sizeof(*iter));
|
|
||||||
if (!iter)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
iter->net = get_proc_net(inode);
|
|
||||||
if (!iter->net) {
|
|
||||||
seq_release_private(inode, file);
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int netlink_seq_release(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
struct seq_file *seq = file->private_data;
|
|
||||||
struct nl_seq_iter *iter = seq->private;
|
|
||||||
put_net(iter->net);
|
|
||||||
return seq_release_private(inode, file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations netlink_seq_fops = {
|
static const struct file_operations netlink_seq_fops = {
|
||||||
|
@ -1830,7 +1811,7 @@ static const struct file_operations netlink_seq_fops = {
|
||||||
.open = netlink_seq_open,
|
.open = netlink_seq_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = netlink_seq_release,
|
.release = seq_release_net,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1871,7 +1871,7 @@ static inline struct sock *packet_seq_idx(struct net *net, loff_t off)
|
||||||
|
|
||||||
static void *packet_seq_start(struct seq_file *seq, loff_t *pos)
|
static void *packet_seq_start(struct seq_file *seq, loff_t *pos)
|
||||||
{
|
{
|
||||||
struct net *net = seq->private;
|
struct net *net = seq_file_net(seq);
|
||||||
read_lock(&net->packet_sklist_lock);
|
read_lock(&net->packet_sklist_lock);
|
||||||
return *pos ? packet_seq_idx(net, *pos - 1) : SEQ_START_TOKEN;
|
return *pos ? packet_seq_idx(net, *pos - 1) : SEQ_START_TOKEN;
|
||||||
}
|
}
|
||||||
|
@ -1924,26 +1924,8 @@ static const struct seq_operations packet_seq_ops = {
|
||||||
|
|
||||||
static int packet_seq_open(struct inode *inode, struct file *file)
|
static int packet_seq_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct seq_file *seq;
|
return seq_open_net(inode, file, &packet_seq_ops,
|
||||||
int res;
|
sizeof(struct seq_net_private));
|
||||||
res = seq_open(file, &packet_seq_ops);
|
|
||||||
if (!res) {
|
|
||||||
seq = file->private_data;
|
|
||||||
seq->private = get_proc_net(inode);
|
|
||||||
if (!seq->private) {
|
|
||||||
seq_release(inode, file);
|
|
||||||
res = -ENXIO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int packet_seq_release(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
struct seq_file *seq= file->private_data;
|
|
||||||
struct net *net = seq->private;
|
|
||||||
put_net(net);
|
|
||||||
return seq_release(inode, file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations packet_seq_fops = {
|
static const struct file_operations packet_seq_fops = {
|
||||||
|
@ -1951,7 +1933,7 @@ static const struct file_operations packet_seq_fops = {
|
||||||
.open = packet_seq_open,
|
.open = packet_seq_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = packet_seq_release,
|
.release = seq_release_net,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2018,7 +2018,7 @@ static unsigned int unix_poll(struct file * file, struct socket *sock, poll_tabl
|
||||||
|
|
||||||
#ifdef CONFIG_PROC_FS
|
#ifdef CONFIG_PROC_FS
|
||||||
struct unix_iter_state {
|
struct unix_iter_state {
|
||||||
struct net *net;
|
struct seq_net_private p;
|
||||||
int i;
|
int i;
|
||||||
};
|
};
|
||||||
static struct sock *unix_seq_idx(struct unix_iter_state *iter, loff_t pos)
|
static struct sock *unix_seq_idx(struct unix_iter_state *iter, loff_t pos)
|
||||||
|
@ -2027,7 +2027,7 @@ static struct sock *unix_seq_idx(struct unix_iter_state *iter, loff_t pos)
|
||||||
struct sock *s;
|
struct sock *s;
|
||||||
|
|
||||||
for (s = first_unix_socket(&iter->i); s; s = next_unix_socket(&iter->i, s)) {
|
for (s = first_unix_socket(&iter->i); s; s = next_unix_socket(&iter->i, s)) {
|
||||||
if (s->sk_net != iter->net)
|
if (s->sk_net != iter->p.net)
|
||||||
continue;
|
continue;
|
||||||
if (off == pos)
|
if (off == pos)
|
||||||
return s;
|
return s;
|
||||||
|
@ -2054,7 +2054,7 @@ static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||||
sk = first_unix_socket(&iter->i);
|
sk = first_unix_socket(&iter->i);
|
||||||
else
|
else
|
||||||
sk = next_unix_socket(&iter->i, sk);
|
sk = next_unix_socket(&iter->i, sk);
|
||||||
while (sk && (sk->sk_net != iter->net))
|
while (sk && (sk->sk_net != iter->p.net))
|
||||||
sk = next_unix_socket(&iter->i, sk);
|
sk = next_unix_socket(&iter->i, sk);
|
||||||
return sk;
|
return sk;
|
||||||
}
|
}
|
||||||
|
@ -2118,27 +2118,8 @@ static const struct seq_operations unix_seq_ops = {
|
||||||
|
|
||||||
static int unix_seq_open(struct inode *inode, struct file *file)
|
static int unix_seq_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct unix_iter_state *it;
|
return seq_open_net(inode, file, &unix_seq_ops,
|
||||||
|
|
||||||
it = __seq_open_private(file, &unix_seq_ops,
|
|
||||||
sizeof(struct unix_iter_state));
|
sizeof(struct unix_iter_state));
|
||||||
if (it == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
it->net = get_proc_net(inode);
|
|
||||||
if (it->net == NULL) {
|
|
||||||
seq_release_private(inode, file);
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int unix_seq_release(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
struct seq_file *seq = file->private_data;
|
|
||||||
struct unix_iter_state *iter = seq->private;
|
|
||||||
put_net(iter->net);
|
|
||||||
return seq_release_private(inode, file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations unix_seq_fops = {
|
static const struct file_operations unix_seq_fops = {
|
||||||
|
@ -2146,7 +2127,7 @@ static const struct file_operations unix_seq_fops = {
|
||||||
.open = unix_seq_open,
|
.open = unix_seq_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = unix_seq_release,
|
.release = seq_release_net,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -673,26 +673,8 @@ static const struct seq_operations wireless_seq_ops = {
|
||||||
|
|
||||||
static int wireless_seq_open(struct inode *inode, struct file *file)
|
static int wireless_seq_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct seq_file *seq;
|
return seq_open_net(inode, file, &wireless_seq_ops,
|
||||||
int res;
|
sizeof(struct seq_net_private));
|
||||||
res = seq_open(file, &wireless_seq_ops);
|
|
||||||
if (!res) {
|
|
||||||
seq = file->private_data;
|
|
||||||
seq->private = get_proc_net(inode);
|
|
||||||
if (!seq->private) {
|
|
||||||
seq_release(inode, file);
|
|
||||||
res = -ENXIO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int wireless_seq_release(struct inode *inode, struct file *file)
|
|
||||||
{
|
|
||||||
struct seq_file *seq = file->private_data;
|
|
||||||
struct net *net = seq->private;
|
|
||||||
put_net(net);
|
|
||||||
return seq_release(inode, file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations wireless_seq_fops = {
|
static const struct file_operations wireless_seq_fops = {
|
||||||
|
@ -700,7 +682,7 @@ static const struct file_operations wireless_seq_fops = {
|
||||||
.open = wireless_seq_open,
|
.open = wireless_seq_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = wireless_seq_release,
|
.release = seq_release_net,
|
||||||
};
|
};
|
||||||
|
|
||||||
int wext_proc_init(struct net *net)
|
int wext_proc_init(struct net *net)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче