proc_net.c (c3506372277779fccbffee2475400fcd689d5738) | proc_net.c (3617d9496cd92dcca4d0893191d95554590d8d9f) |
---|---|
1/* 2 * linux/fs/proc/net.c 3 * 4 * Copyright (C) 2007 5 * 6 * Author: Eric Biederman <ebiederm@xmission.com> 7 * 8 * proc net directory handling functions --- 79 unchanged lines hidden (view full) --- 88 return NULL; 89 p->proc_fops = &proc_net_seq_fops; 90 p->seq_ops = ops; 91 p->state_size = state_size; 92 return proc_register(parent, p); 93} 94EXPORT_SYMBOL_GPL(proc_create_net_data); 95 | 1/* 2 * linux/fs/proc/net.c 3 * 4 * Copyright (C) 2007 5 * 6 * Author: Eric Biederman <ebiederm@xmission.com> 7 * 8 * proc net directory handling functions --- 79 unchanged lines hidden (view full) --- 88 return NULL; 89 p->proc_fops = &proc_net_seq_fops; 90 p->seq_ops = ops; 91 p->state_size = state_size; 92 return proc_register(parent, p); 93} 94EXPORT_SYMBOL_GPL(proc_create_net_data); 95 |
96int single_open_net(struct inode *inode, struct file *file, 97 int (*show)(struct seq_file *, void *)) | 96static int single_open_net(struct inode *inode, struct file *file) |
98{ | 97{ |
99 int err; | 98 struct proc_dir_entry *de = PDE(inode); |
100 struct net *net; | 99 struct net *net; |
100 int err; |
|
101 | 101 |
102 err = -ENXIO; | |
103 net = get_proc_net(inode); | 102 net = get_proc_net(inode); |
104 if (net == NULL) 105 goto err_net; | 103 if (!net) 104 return -ENXIO; |
106 | 105 |
107 err = single_open(file, show, net); 108 if (err < 0) 109 goto err_open; 110 111 return 0; 112 113err_open: 114 put_net(net); 115err_net: | 106 err = single_open(file, de->single_show, net); 107 if (err) 108 put_net(net); |
116 return err; 117} | 109 return err; 110} |
118EXPORT_SYMBOL_GPL(single_open_net); | |
119 | 111 |
120int single_release_net(struct inode *ino, struct file *f) | 112static int single_release_net(struct inode *ino, struct file *f) |
121{ 122 struct seq_file *seq = f->private_data; 123 put_net(seq->private); 124 return single_release(ino, f); 125} | 113{ 114 struct seq_file *seq = f->private_data; 115 put_net(seq->private); 116 return single_release(ino, f); 117} |
126EXPORT_SYMBOL_GPL(single_release_net); | |
127 | 118 |
119static const struct file_operations proc_net_single_fops = { 120 .open = single_open_net, 121 .read = seq_read, 122 .llseek = seq_lseek, 123 .release = single_release_net, 124}; 125 126struct proc_dir_entry *proc_create_net_single(const char *name, umode_t mode, 127 struct proc_dir_entry *parent, 128 int (*show)(struct seq_file *, void *), void *data) 129{ 130 struct proc_dir_entry *p; 131 132 p = proc_create_reg(name, mode, &parent, data); 133 if (!p) 134 return NULL; 135 p->proc_fops = &proc_net_single_fops; 136 p->single_show = show; 137 return proc_register(parent, p); 138} 139EXPORT_SYMBOL_GPL(proc_create_net_single); 140 |
|
128static struct net *get_proc_task_net(struct inode *dir) 129{ 130 struct task_struct *task; 131 struct nsproxy *ns; 132 struct net *net = NULL; 133 134 rcu_read_lock(); 135 task = pid_task(proc_pid(dir), PIDTYPE_PID); --- 132 unchanged lines hidden --- | 141static struct net *get_proc_task_net(struct inode *dir) 142{ 143 struct task_struct *task; 144 struct nsproxy *ns; 145 struct net *net = NULL; 146 147 rcu_read_lock(); 148 task = pid_task(proc_pid(dir), PIDTYPE_PID); --- 132 unchanged lines hidden --- |