The code should be using the pid namespace from the procfs mount
instead of trying to look it up during open.

Suggested-by: Eric W. Biederman <ebied...@xmission.com>
Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 net/ipv6/ip6_flowlabel.c | 29 ++++++-----------------------
 1 file changed, 6 insertions(+), 23 deletions(-)

diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
index c05c4e82a7ca..2fbd9bed764a 100644
--- a/net/ipv6/ip6_flowlabel.c
+++ b/net/ipv6/ip6_flowlabel.c
@@ -754,6 +754,10 @@ static struct ip6_flowlabel *ip6fl_get_idx(struct seq_file 
*seq, loff_t pos)
 static void *ip6fl_seq_start(struct seq_file *seq, loff_t *pos)
        __acquires(RCU)
 {
+       struct ip6fl_iter_state *state = ip6fl_seq_private(seq);
+
+       state->pid_ns = proc_pid_ns(file_inode(seq->file));
+
        rcu_read_lock_bh();
        return *pos ? ip6fl_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
 }
@@ -810,36 +814,15 @@ static const struct seq_operations ip6fl_seq_ops = {
 
 static int ip6fl_seq_open(struct inode *inode, struct file *file)
 {
-       struct seq_file *seq;
-       struct ip6fl_iter_state *state;
-       int err;
-
-       err = seq_open_net(inode, file, &ip6fl_seq_ops,
+       return seq_open_net(inode, file, &ip6fl_seq_ops,
                           sizeof(struct ip6fl_iter_state));
-
-       if (!err) {
-               seq = file->private_data;
-               state = ip6fl_seq_private(seq);
-               rcu_read_lock();
-               state->pid_ns = get_pid_ns(task_active_pid_ns(current));
-               rcu_read_unlock();
-       }
-       return err;
-}
-
-static int ip6fl_seq_release(struct inode *inode, struct file *file)
-{
-       struct seq_file *seq = file->private_data;
-       struct ip6fl_iter_state *state = ip6fl_seq_private(seq);
-       put_pid_ns(state->pid_ns);
-       return seq_release_net(inode, file);
 }
 
 static const struct file_operations ip6fl_seq_fops = {
        .open           =       ip6fl_seq_open,
        .read           =       seq_read,
        .llseek         =       seq_lseek,
-       .release        =       ip6fl_seq_release,
+       .release        =       seq_release_net,
 };
 
 static int __net_init ip6_flowlabel_proc_init(struct net *net)
-- 
2.17.0

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to