aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/udp.c46
1 files changed, 9 insertions, 37 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index bae94b3eaa43..e716d2d55e1e 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1576,46 +1576,18 @@ static void udp_seq_stop(struct seq_file *seq, void *v)
1576static int udp_seq_open(struct inode *inode, struct file *file) 1576static int udp_seq_open(struct inode *inode, struct file *file)
1577{ 1577{
1578 struct udp_seq_afinfo *afinfo = PDE(inode)->data; 1578 struct udp_seq_afinfo *afinfo = PDE(inode)->data;
1579 struct seq_file *seq; 1579 struct udp_iter_state *s;
1580 struct net *net; 1580 int err;
1581 int rc = -ENOMEM;
1582 struct udp_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL);
1583
1584 if (!s)
1585 goto out;
1586 1581
1587 rc = -ENXIO; 1582 err = seq_open_net(inode, file, &afinfo->seq_ops,
1588 net = get_proc_net(inode); 1583 sizeof(struct udp_iter_state));
1589 if (!net) 1584 if (err < 0)
1590 goto out_kfree; 1585 return err;
1591 1586
1587 s = ((struct seq_file *)file->private_data)->private;
1592 s->family = afinfo->family; 1588 s->family = afinfo->family;
1593 s->hashtable = afinfo->hashtable; 1589 s->hashtable = afinfo->hashtable;
1594 s->p.net = net; 1590 return err;
1595
1596 rc = seq_open(file, &afinfo->seq_ops);
1597 if (rc)
1598 goto out_put_net;
1599
1600 seq = file->private_data;
1601 seq->private = s;
1602out:
1603 return rc;
1604out_put_net:
1605 put_net(net);
1606out_kfree:
1607 kfree(s);
1608 goto out;
1609}
1610
1611static int udp_seq_release(struct inode *inode, struct file *file)
1612{
1613 struct seq_file *seq = file->private_data;
1614 struct udp_iter_state *s = seq->private;
1615
1616 put_net(s->p.net);
1617 seq_release_private(inode, file);
1618 return 0;
1619} 1591}
1620 1592
1621/* ------------------------------------------------------------------------ */ 1593/* ------------------------------------------------------------------------ */
@@ -1628,7 +1600,7 @@ int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo)
1628 afinfo->seq_fops->open = udp_seq_open; 1600 afinfo->seq_fops->open = udp_seq_open;
1629 afinfo->seq_fops->read = seq_read; 1601 afinfo->seq_fops->read = seq_read;
1630 afinfo->seq_fops->llseek = seq_lseek; 1602 afinfo->seq_fops->llseek = seq_lseek;
1631 afinfo->seq_fops->release = udp_seq_release; 1603 afinfo->seq_fops->release = seq_release_net;
1632 1604
1633 afinfo->seq_ops.start = udp_seq_start; 1605 afinfo->seq_ops.start = udp_seq_start;
1634 afinfo->seq_ops.next = udp_seq_next; 1606 afinfo->seq_ops.next = udp_seq_next;