ipv6/flowlabel: simplify pid namespace lookup
authorChristoph Hellwig <hch@lst.de>
Wed, 11 Apr 2018 08:01:30 +0000 (10:01 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 16 May 2018 05:24:22 +0000 (07:24 +0200)
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 <ebiederm@xmission.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
net/ipv6/ip6_flowlabel.c

index c05c4e82a7ca95546106829dfaefba41b6480757..2fbd9bed764a485c1681bdec9cb91e2c6af55060 100644 (file)
@@ -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)