net: make the tcp and udp file_operations for the /proc stuff const
authorArjan van de Ven <arjan@linux.intel.com>
Sun, 30 Oct 2011 06:46:30 +0000 (06:46 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 1 Nov 2011 21:56:14 +0000 (17:56 -0400)
the tcp and udp code creates a set of struct file_operations at runtime
while it can also be done at compile time, with the added benefit of then
having these file operations be const.

the trickiest part was to get the "THIS_MODULE" reference right; the naive
method of declaring a struct in the place of registration would not work
for this reason.

Signed-off-by: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/tcp.h
include/net/udp.h
net/ipv4/tcp_ipv4.c
net/ipv4/udp.c
net/ipv4/udplite.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/ipv6/udplite.c

index e147f42d643d16caad50e971e57e7b879a0bffbb..bb18c4d69aba1da89488af60999f03341648ee61 100644 (file)
@@ -1403,11 +1403,13 @@ enum tcp_seq_states {
        TCP_SEQ_STATE_TIME_WAIT,
 };
 
+int tcp_seq_open(struct inode *inode, struct file *file);
+
 struct tcp_seq_afinfo {
-       char                    *name;
-       sa_family_t             family;
-       struct file_operations  seq_fops;
-       struct seq_operations   seq_ops;
+       char                            *name;
+       sa_family_t                     family;
+       const struct file_operations    *seq_fops;
+       struct seq_operations           seq_ops;
 };
 
 struct tcp_iter_state {
index 67ea6fcb3ec063165bf0e4fe69a33834b18a8e9f..3b285f402f480e76aa9b69136447df9f6d66bb65 100644 (file)
@@ -230,12 +230,14 @@ extern struct sock *udp6_lib_lookup(struct net *net, const struct in6_addr *sadd
 #endif
 
 /* /proc */
+int udp_seq_open(struct inode *inode, struct file *file);
+
 struct udp_seq_afinfo {
-       char                    *name;
-       sa_family_t             family;
-       struct udp_table        *udp_table;
-       struct file_operations  seq_fops;
-       struct seq_operations   seq_ops;
+       char                            *name;
+       sa_family_t                     family;
+       struct udp_table                *udp_table;
+       const struct file_operations    *seq_fops;
+       struct seq_operations           seq_ops;
 };
 
 struct udp_iter_state {
index 0ea10eefa60f005911b0849dd14218a1eb9ccf1d..939c55eceb5b39ee80e2d55b6344924b2bbdf3ca 100644 (file)
@@ -2339,7 +2339,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v)
        }
 }
 
-static int tcp_seq_open(struct inode *inode, struct file *file)
+int tcp_seq_open(struct inode *inode, struct file *file)
 {
        struct tcp_seq_afinfo *afinfo = PDE(inode)->data;
        struct tcp_iter_state *s;
@@ -2355,23 +2355,19 @@ static int tcp_seq_open(struct inode *inode, struct file *file)
        s->last_pos             = 0;
        return 0;
 }
+EXPORT_SYMBOL(tcp_seq_open);
 
 int tcp_proc_register(struct net *net, struct tcp_seq_afinfo *afinfo)
 {
        int rc = 0;
        struct proc_dir_entry *p;
 
-       afinfo->seq_fops.open           = tcp_seq_open;
-       afinfo->seq_fops.read           = seq_read;
-       afinfo->seq_fops.llseek         = seq_lseek;
-       afinfo->seq_fops.release        = seq_release_net;
-
        afinfo->seq_ops.start           = tcp_seq_start;
        afinfo->seq_ops.next            = tcp_seq_next;
        afinfo->seq_ops.stop            = tcp_seq_stop;
 
        p = proc_create_data(afinfo->name, S_IRUGO, net->proc_net,
-                            &afinfo->seq_fops, afinfo);
+                            afinfo->seq_fops, afinfo);
        if (!p)
                rc = -ENOMEM;
        return rc;
@@ -2520,12 +2516,18 @@ out:
        return 0;
 }
 
+static const struct file_operations tcp_afinfo_seq_fops = {
+       .owner   = THIS_MODULE,
+       .open    = tcp_seq_open,
+       .read    = seq_read,
+       .llseek  = seq_lseek,
+       .release = seq_release_net
+};
+
 static struct tcp_seq_afinfo tcp4_seq_afinfo = {
        .name           = "tcp",
        .family         = AF_INET,
-       .seq_fops       = {
-               .owner          = THIS_MODULE,
-       },
+       .seq_fops       = &tcp_afinfo_seq_fops,
        .seq_ops        = {
                .show           = tcp4_seq_show,
        },
index ebaa96bd346475dd550baadc9e32dd7a4e5d8ef6..131d8a720086f89f426c89e4caa1720fa31751f7 100644 (file)
@@ -2037,7 +2037,7 @@ static void udp_seq_stop(struct seq_file *seq, void *v)
                spin_unlock_bh(&state->udp_table->hash[state->bucket].lock);
 }
 
-static int udp_seq_open(struct inode *inode, struct file *file)
+int udp_seq_open(struct inode *inode, struct file *file)
 {
        struct udp_seq_afinfo *afinfo = PDE(inode)->data;
        struct udp_iter_state *s;
@@ -2053,6 +2053,7 @@ static int udp_seq_open(struct inode *inode, struct file *file)
        s->udp_table            = afinfo->udp_table;
        return err;
 }
+EXPORT_SYMBOL(udp_seq_open);
 
 /* ------------------------------------------------------------------------ */
 int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo)
@@ -2060,17 +2061,12 @@ int udp_proc_register(struct net *net, struct udp_seq_afinfo *afinfo)
        struct proc_dir_entry *p;
        int rc = 0;
 
-       afinfo->seq_fops.open           = udp_seq_open;
-       afinfo->seq_fops.read           = seq_read;
-       afinfo->seq_fops.llseek         = seq_lseek;
-       afinfo->seq_fops.release        = seq_release_net;
-
        afinfo->seq_ops.start           = udp_seq_start;
        afinfo->seq_ops.next            = udp_seq_next;
        afinfo->seq_ops.stop            = udp_seq_stop;
 
        p = proc_create_data(afinfo->name, S_IRUGO, net->proc_net,
-                            &afinfo->seq_fops, afinfo);
+                            afinfo->seq_fops, afinfo);
        if (!p)
                rc = -ENOMEM;
        return rc;
@@ -2120,14 +2116,20 @@ int udp4_seq_show(struct seq_file *seq, void *v)
        return 0;
 }
 
+static const struct file_operations udp_afinfo_seq_fops = {
+       .owner    = THIS_MODULE,
+       .open     = udp_seq_open,
+       .read     = seq_read,
+       .llseek   = seq_lseek,
+       .release  = seq_release_net
+};
+
 /* ------------------------------------------------------------------------ */
 static struct udp_seq_afinfo udp4_seq_afinfo = {
        .name           = "udp",
        .family         = AF_INET,
        .udp_table      = &udp_table,
-       .seq_fops       = {
-               .owner  =       THIS_MODULE,
-       },
+       .seq_fops       = &udp_afinfo_seq_fops,
        .seq_ops        = {
                .show           = udp4_seq_show,
        },
index aee9963f7f5a497efc06429d3ab730e9f3efc999..08383eb542087a9de6699bc5179291b446d37b79 100644 (file)
@@ -71,13 +71,20 @@ static struct inet_protosw udplite4_protosw = {
 };
 
 #ifdef CONFIG_PROC_FS
+
+static const struct file_operations udplite_afinfo_seq_fops = {
+       .owner    = THIS_MODULE,
+       .open     = udp_seq_open,
+       .read     = seq_read,
+       .llseek   = seq_lseek,
+       .release  = seq_release_net
+};
+
 static struct udp_seq_afinfo udplite4_seq_afinfo = {
        .name           = "udplite",
        .family         = AF_INET,
        .udp_table      = &udplite_table,
-       .seq_fops       = {
-               .owner  =       THIS_MODULE,
-       },
+       .seq_fops       = &udplite_afinfo_seq_fops,
        .seq_ops        = {
                .show           = udp4_seq_show,
        },
index 10b2b3165a1aff4ebc6cde947aae64a687b11a5b..36131d122a6f3f9007776ff343a9197bd0430b0a 100644 (file)
@@ -2161,12 +2161,18 @@ out:
        return 0;
 }
 
+static const struct file_operations tcp6_afinfo_seq_fops = {
+       .owner   = THIS_MODULE,
+       .open    = tcp_seq_open,
+       .read    = seq_read,
+       .llseek  = seq_lseek,
+       .release = seq_release_net
+};
+
 static struct tcp_seq_afinfo tcp6_seq_afinfo = {
        .name           = "tcp6",
        .family         = AF_INET6,
-       .seq_fops       = {
-               .owner          = THIS_MODULE,
-       },
+       .seq_fops       = &tcp6_afinfo_seq_fops,
        .seq_ops        = {
                .show           = tcp6_seq_show,
        },
index f4ca0a5b3457d857ce810b78f2d7f890d11470f8..846f4757eb8d46394a604595be0698d485ae1ab0 100644 (file)
@@ -1424,13 +1424,19 @@ int udp6_seq_show(struct seq_file *seq, void *v)
        return 0;
 }
 
+static const struct file_operations udp6_afinfo_seq_fops = {
+       .owner    = THIS_MODULE,
+       .open     = udp_seq_open,
+       .read     = seq_read,
+       .llseek   = seq_lseek,
+       .release  = seq_release_net
+};
+
 static struct udp_seq_afinfo udp6_seq_afinfo = {
        .name           = "udp6",
        .family         = AF_INET6,
        .udp_table      = &udp_table,
-       .seq_fops       = {
-               .owner  =       THIS_MODULE,
-       },
+       .seq_fops       = &udp6_afinfo_seq_fops,
        .seq_ops        = {
                .show           = udp6_seq_show,
        },
index 986c4de5292eedf715b25b8bae98ee640917d97e..8889aa22ed47197129c9ceb6585d9c2d4a06bb5b 100644 (file)
@@ -93,13 +93,20 @@ void udplitev6_exit(void)
 }
 
 #ifdef CONFIG_PROC_FS
+
+static const struct file_operations udplite6_afinfo_seq_fops = {
+       .owner    = THIS_MODULE,
+       .open     = udp_seq_open,
+       .read     = seq_read,
+       .llseek   = seq_lseek,
+       .release  = seq_release_net
+};
+
 static struct udp_seq_afinfo udplite6_seq_afinfo = {
        .name           = "udplite6",
        .family         = AF_INET6,
        .udp_table      = &udplite_table,
-       .seq_fops       = {
-               .owner  =       THIS_MODULE,
-       },
+       .seq_fops       = &udplite6_afinfo_seq_fops,
        .seq_ops        = {
                .show           = udp6_seq_show,
        },